< 前へ | 次へ >

演習 3: EJB にアクセスする Web バンドルの開発

前の演習では、EJB を OSGi サービスとして公開しました。 この演習では、サービスにアクセスする Web バンドルを開発します。バンドルを作成し、必要なパッケージをインポートするようにマニフェストを構成し、OSGi サービスとして EJB にアクセスするサーブレットを開発し、ブラウザーでアプリケーションにアクセスするための HTML ページを作成します。

Web バンドル・プロジェクトを作成する

このセクションでは、Web 3.0 をサポートする OSGi バンドルを作成し、そのバンドルを ConverterApp OSGi アプリケーションに追加します。
  1. 「OSGi バンドル・プロジェクト」ウィザードを開きます。 「ファイル」 > 「新規」 > 「OSGi バンドル・プロジェクト」をクリックします。 ウィザードが開きます。
  2. プロジェクトを作成します。 ウィザードで、以下の値を入力または選択します。
    プロジェクト名
    Web
    ターゲット・ランタイム
    WebSphere Application Server v8.5.
    Web サポートの追加 (このチェック・ボックスを選択し、以下の値を選択します)
    Web 3.0
    アプリケーションにバンドルを追加 (このチェック・ボックスを選択し、以下のアプリケーションを選択します)
    ConverterApp
    Web バンドル・プロジェクトの作成
  3. 「終了」をクリックします。プロジェクトが作成されます。

EJBClient プロジェクトからパッケージをインポートするよう Web プロジェクト内のバンドル・マニフェストを構成する

このセクションでは、EJBClient プロジェクト内の com.ibm.example パッケージの項目を、マニフェスト内の Import-Package ヘッダーに追加します。com.ibm.example パッケージには、EJB 用に開発したインターフェースが含まれています。
  1. マニフェストを開きます。 Web プロジェクトで「Manifest: Web」をダブルクリックします。 マニフェスト・エディターが開きます。
  2. com.ibm.example パッケージへの依存関係を追加します。 「依存関係」タブをクリックします。 「インポートするパッケージ」セクションで、「追加」をクリックします。 「パッケージ選択」ダイアログが開きます。 「エクスポートするパッケージ」フィールドに com.ibm.example と入力します。 パッケージ・リストから com.ibm.example を選択し、「OK」をクリックします。
    依存関係の追加

    com.ibm.example への依存関係が「インポートするパッケージ」セクションに追加されます。 バンドル・プロジェクトは Web 3.0 をサポートするように構成されているため、javax.servlet など、サーブレット・パッケージの付加的なインポート項目が既に追加されていることに注意してください。

    インポートするパッケージ

  3. 変更を保存します。

サーブレットの作成

このセクションでは、サーブレット・ウィザードで初期サーブレットを作成します。
  1. サーブレット・ウィザードを開きます。 Web プロジェクトを右クリックし、「新規」 > 「サーブレット」を選択します。 サーブレット・ウィザードが開きます。
  2. サーブレットを作成します。 ウィザードで、以下の値を入力または選択します。
    プロジェクト
    Web
    Java™ パッケージ
    com.ibm.example.servlets
    クラス名
    ConverterServlet

    「終了」をクリックします。Web プロジェクト内に ConverterServlet が作成されます。

サーブレットの開発

このセクションでは、サーブレットを開発し、OSGi サービスとして EJB にアクセスするコードを含めます。
  1. Java エディターでサーブレットを開きます。 エディターでまだサーブレットを開いていない場合は、Web プロジェクトで Java Resources/src フォルダーを展開します。 com.ibm.example.servlets パッケージで ConverterServlet をダブルクリックします。
  2. 新しい import ステートメントを追加します。 ソース・ファイルの最初にある import セクションに以下の import ステートメントを追加します。
    import com.ibm.example.EJBConverterLocal;
    import java.io.PrintWriter;
    import java.text.NumberFormat;
    import javax.naming.InitialContext;
    import javax.naming.NamingException;
  3. doGet() メソッドを開発します。 サーブレットには、基本的な doGet() メソッドが含まれています。 自動生成されたメソッドを、以下のメソッドで置き換えます。
    protected void doGet(HttpServletRequest request,
          HttpServletResponse response) throws ServletException, IOException {
    
       PrintWriter w = response.getWriter();
    
       NumberFormat nf = NumberFormat.getInstance();
       nf.setMaximumFractionDigits(2);
    
       try {
          InitialContext context = new InitialContext();
          EJBConverterLocal converter = (EJBConverterLocal) context
                .lookup("osgi:service/" + EJBConverterLocal.class.getName());
    
          String temperature = request.getParameter("temperature");
          if (temperature == null) {
             w.println("<p>A temperature value was not specified.</p>");
          } else if (!temperature.matches("[-+]?[0-9]*¥¥.?[0-9]+")) {
             w.println("Invalid temperature specified.");
          } else {
             double degrees = Double.parseDouble(temperature);
    
             double celsius = converter.convertToCelsius(degrees);
             w.println("<p>" + temperature + " degrees fahrenheit is "
                   + nf.format(celsius) + " degrees celsius</p>");
    
             double fahrenheit = converter.convertToFahrenheit(degrees);
             w.println("<p>" + temperature + " degrees celsius is "
                   + nf.format(fahrenheit) + " degrees fahrenheit</p>");
          }
    
          w.println("<a href='index.html'>Back</a>");
       } catch (NamingException e) {
                   w.println(e.getMessage());
       } catch (NumberFormatException e) {
          w.println("An incorrect temperature was specified");
       }
    }
    注: このコードに関して、次の点に注意してください。
    このサーブレットは、converter という EJBConverterLocal オブジェクトを作成します。 EJBConverterLocal は 2 つの温度変換メソッド convertToCelsius() および convertToFahrenheit() を含めるために作成したインターフェースであることを思い出してください。 以下のコード行は、OSGi サービスとして EJB にアクセスするオブジェクトの作成を 処理します。
    EJBConverterLocal converter = (EJBConverterLocal) context.lookup("osgi:service/" + EJBConverterLocal.class.getName());
    temperature パラメーターにより、変換する温度値がサーブレットに渡されます。 この値は degrees という名前の Double 値に変換され、converter オブジェクトの convertToCelsius() メソッド と convertToFahrenheit() メソッドで処理できるようになります。
    注: リモート・インターフェースを使用する場合は、JNDI ルックアップ・コードを調整します。例えば、前述のコンテキスト・ルックアップセクション は次のフォーマットで記述できます。
    EJBConverterRemote converter = (EJBConverterRemote) context.lookup("osgi:service/" + EJBConverterRemote.class.getName() + "/(service.exported.interfaces=*)");
  4. doPost() メソッドを開発します。 自動生成される doPost() メソッドを、以下のコードで置き換えます。自動生成される doPost() メソッドを 置き換えることにより、このサーブレットが、ブラウザーの post 要求と get 要求のどちらによっても確実に呼び出し可能になります。doPost() を呼び出すと、自動的に doGet() メソッドが実行されます。
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    	doGet(request, response);
    }
  5. 作業を確認します。 完成したサーブレット・コードは次のとおりです。
    package com.ibm.example.servlets;
    
    import java.io.IOException;
    import java.io.PrintWriter;
    import java.text.NumberFormat;
    
    import javax.naming.InitialContext;
    import javax.naming.NamingException;
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import com.ibm.example.EJBConverterLocal;
    
    @WebServlet("/ConverterServlet")
    public class ConverterServlet extends HttpServlet {
       private static final long serialVersionUID = 1L;
    
    
       public ConverterServlet() {
          super();
       }
    
       protected void doGet(HttpServletRequest request,
             HttpServletResponse response) throws ServletException, IOException {
    
          PrintWriter w = response.getWriter();
    
          NumberFormat nf = NumberFormat.getInstance();
          nf.setMaximumFractionDigits(2);
    
          try {
             InitialContext context = new InitialContext();
             EJBConverterLocal converter = (EJBConverterLocal) context
                   .lookup("osgi:service/" + EJBConverterLocal.class.getName());
    
             String temperature = request.getParameter("temperature");
             if (temperature == null) {
                w.println("<p>A temperature value was not specified.</p>");
             } else if (!temperature.matches("[-+]?[0-9]*¥¥.?[0-9]+")) {
                w.println("Invalid temperature specified.");
             } else {
                double degrees = Double.parseDouble(temperature);
    
                double celsius = converter.convertToCelsius(degrees);
                w.println("<p>" + temperature + " degrees fahrenheit is "
                      + nf.format(celsius) + " degrees celsius</p>");
    
                double fahrenheit = converter.convertToFahrenheit(degrees);
                w.println("<p>" + temperature + " degrees celsius is "
                      + nf.format(fahrenheit) + " degrees fahrenheit</p>");
             }
    
             w.println("<a href='index.html'>Back</a>");
          } catch (NamingException e) {
                      w.println(e.getMessage());
          } catch (NumberFormatException e) {
             w.println("An incorrect temperature was specified");
          }
       }
    
       protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    	doGet(request, response);
    		}
    }
  6. 変更を保存します。

アプリケーションにアクセスするための HTML ファイルの作成

このセクションでは、変換のためにサーブレットに送信する値の入力フォームを含んでいる HTML ファイル index.html を作成します。
  1. 「新規 Web ページ」ウィザードを開きます。 Web プロジェクトを右クリックし、「新規」 > 「Web ページ」を選択します。 「Web ページ」ウィザードが開きます。
  2. Web ページを作成します。 ウィザードの「ファイル名」フィールドに index.html と入力します。 「テンプレート」セクションで、「HTML」を選択します。 「終了」をクリックします。ページが作成されてエディターで開きます。
    新しい Web ページ
  3. Web ページ・エディターの「ソース」タブを選択します。
  4. ソースを更新します。 デフォルトのソース・コードを以下のコードで置き換えます。
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
    <head>
    <title>OSGi EJB Temperature Converter</title>
    <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
    <script type="text/javascript">
    
    function validate(form) {
    	var temperature = new Number(form.temperature.value);
    	if (isNaN(temperature)) {
    		alert("Please enter a valid number.");
    		return false;
    	}
    	return true;
    }
    
    </script>
    </head>
    <body>
    <form action="ConverterServlet" method="post" onsubmit="return validate(this);">
    	Enter a temperature value:
    	<br/>
    	<input type="text" id="temperature" name="temperature"/>
    	<br/>
    	<br/>
    	<input type="submit" value="Submit"/>
    </form>
    </body>
    </html>

    この HTML には、temperature パラメーター値を ConverterServlet に送信するためのフォームが含まれています。 それがサーブレットに送信される前に、送信される値が validate() 関数によって妥当性検査され、入力された値が数値であることが確認されます。

< 前へ | 次へ >
トピックのタイプを示すアイコン チュートリアルの演習のトピック
インフォメーション・センターのご利用条件 | フィードバック

タイム・スタンプ・アイコン 最終更新: May 29, 2014 10:20

ファイル名: osgi_ejb_3.html