サーブレットとCDIを使用したJava EE 6でのフォームの処理

概要

    目的

    このチュートリアルでは、サーブレットとContexts and Dependency Injection(CDI)を使用してHTML5フォーム要素を処理する方法を説明します。

    所要時間

    約1時間

    はじめに

    Contexts and Dependency Injection(CDI)は、“コンテキスト”参照やスコープを使用して強力な型保証の依存性注入を定義するJava EE 6の新機能です。CDIでは、JSR-299仕様に基づき、(EJB Session BeanやJavaServer FacesマネージドBeanなどの)Java EEコンポーネントとライフ・サイクル・コンテキストのバインドを可能にする一連のサービスが提供されます。イベントの起動と参照により、これらのコンポーネントを疎結合で注入し、やり取りできます。CDIのコンテキスト機能により、別のスコープから、Beanをより自然で便利な方法で使用できます。

    シナリオ

    このチュートリアルでは、Java EE 6のContexts and Dependency Injectionを使用した基本的な注入シナリオを作成します。このためにまず、CDIの機能について学習します。その後、架空のフォーラムのサインアップ・フォームを開発し、サーブレットを使用してフォームを処理して、Java Beanにサインアップ情報を保存します。最後に、CDIを使用してBeanを注入し、ユーザーをフォーラムに招き入れます。

    ソフトウェア要件

    このチュートリアルの実行に必要なソフトウェア要件のリストは次のとおりです。

    前提条件

    このチュートリアルを始める前に次のことを確認してください。

    • Javaプログラミング言語の知識。
    • Java EE 6の基本知識、特にサーブレットとJSP。
    • HTMLおよびHTMLフォームの基本知識。

Java EE 6プラットフォームのCDIの概要

    この項では、Contexts and Dependency Injectionの概要について簡単に説明します。

    依存性注入とは、ソフトウェア・コンポーネントに外部依存性を提供して、ハードコードの依存性を削除できるプロセスのことです。Java EE 6でCDIを使用すると、これらの外部依存性を型保証で注入し、使用する特定のインタフェースの実装を選択できます。

    CDIでは、“コンテキスト”の概念も導入されています。つまり、注入されるコンポーネント(Java Beanなど)が適切に定義された参照やスコープに存在するということです。また、このCDIの機能によって、別のスコープからのBeanを、より自然かつ便利に利用できます。スコープを組み合わせて適合させたり、別のスコープからBeanを注入したりすることができるためです。また、CDIは式言語(EL)と統合されているため、JavaServer FacesページやJavaServer Pagesページ内で、どのコンポーネントも直接使用できます。

    CDIの使用によるもう1つの実質的な利点は、疎結合のシステムの設計および構築が支援されることです。CDIでは基本的に、適切に定義された型と修飾子によってサーバーとクライアントが切り離され、さまざまなサーバー実装を行えるためです。また、CDIでは、コンポーネントをコンテキスト化してステートフル・コンポーネント間でメッセージの受け渡しによるやり取りを可能にすることで、コンポーネントのライフ・サイクルが切り離されます。最終的にCDIでは、イベントによってメッセージ・プロデューサがコンシューマと切り離されます。

    開発でCDIを使用すると、イベントの起動や参照によって、Beanをライフ・サイクル・コンテキストとバインドしたり、注入したり、他のBeanと疎結合でやり取りさせたりすることができます。また、BeanをJavaコードから直接呼び出したり、統合EL式で起動したりすることができます。

Java EE 6 Webプロジェクトの作成

    この項では、Java EE 6 Webアプリケーションを作成し、その上にサインアップ・フォームを構築します。

    NetBeans IDEを開きます。

    Fileメニューから、「New Project」を選択します。

    Categoriesで「Java Web」を、Projectsで「Web Application」を選択して、「Next」をクリックします。

    プロジェクト名としてCdiFormsと入力し、「Next」をクリックします。

    Serverリストから「Oracle WebLogic Server」を選択します。

    Enable Contexts and Dependency Injection」チェック・ボックスを選択します。

    コンテキスト・パスとしてCdiFormsと入力し、「Next」をクリックします。

    Frameworksのすべてのオプションを空白のままにし、「Finish」をクリックします。

    CdiFormsという新規プロジェクトが作成されます。index.jspファイルがSourceペインに表示されます。

    CdiForms」プロジェクトを右クリックし、「Run」を選択してアプリケーションをテストします。

    ブラウザ・ウィンドウが開き、Hello World! のメッセージが表示されます。これで、NetBeansを使用してJava EE 6 Webアプリケーションを作成できました。

HTML5によるサインアップ・フォームの作成

    この項では、HTML5フォームを作成してJava EE 6 Developmentフォーラムにサインアップできるようにします。

    File」→「New File」を選択します。

    Categoriesで「Web」を、File Typesで「JSP」を選択して、「Next」をクリックします。

    ファイル名としてsignupと入力し、「Finish」をクリックします。

    signup.jspファイルが作成され、Sourceペインで開かれます。

    次のコードをsignup.jspファイルに追加します。

    signup.jsp

       <%@page contentType="text/html" pageEncoding="UTF-8"%>
       <!DOCTYPE html>
       <html>
         <head>
           <title>Welcome</title>
           <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
         </head>
         <body>
           <h1>Sign-up</h1>
      
           <p>Please fill in the form to sign-up for the Java EE 6 Development forum.</p>
           <form action="RegisterServlet" method="POST">
             <label>Name:</label><input type="text" name="name"><br />
             <label>Email:</label><input type="email" name="email"><br />
             <label>Password:</label><input type="password" name="password"><br />
             <label>How did you learn about this tutorial?</label>
             <select name="reference">
                 <option value="OLL">Oracle Learning Library</option>
                 <option value="Newsletter">Newsletter</option>
                 <option value="Social">Social network(s)</option>
                 <option value="Search">Internet search</option>
                 <option value="Other">Other</option>
             </select><br>
             <label>Gender:</label><br>
               <input type="radio" name="gender" value="male">Male
               <input type="radio" name="gender" value="female">Female<br>
             <label>Select the topics that you're interested about:</label><br>
               <input type="checkbox" name="interests" value="client">Client-side development
               <input type="checkbox" name="interests" value="server">Server-side development
               <input type="checkbox" name="interests" value="database">Database technologies
               <input type="checkbox" name="interests" value="other">Other<br>
             <input type="submit" value="Sign-up">
           </form>
           
         </body>
       </html>
      

    File」→「Save」をクリックして、変更を保存します。

    これで、Java EE 6 Developmentフォーラムのサインアップ・フォームを作成できました。

    index.jspファイルを開き、次のコードを追加します。

    index.jsp

      <%@page contentType="text/html" pageEncoding="UTF-8"%>
      <!DOCTYPE html>
      <html>
         <head>
            <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
            <title>Welcome to the Java EE 6 Development Forum</title>
         </head>
         <body>
            <h1>Java EE 6 Development Forum</h1>
            <a href="signup.jsp">Sign-up!</a>
         </body>
      </html>
      
      

    これで、index.jspファイルからsignup.jspファイルにリンクを追加できました。

ユーザー・オブジェクトの作成

    この項では、メッセージを保存、操作、公開するためのJavaBeansを作成します。

    File」→「New File」を選択します。

    Categoriesで「Java」を、File Typesで「Java Class」を選択して、「Next」をクリックします。

    クラス名としてUserと入力します。

    パッケージとしてcom.example.modelと入力し、「Finish」をクリックします。

    User.javaクラスがプロジェクトに追加されます。

    User.javaファイルを開き、次のコードを追加します。

    User.java

       package com.example.model;
       
       public class User {
           private static String name;
           private static String email;
           private static String password;
           private static String reference;
           private static String gender;
           private static String[] interests;
           
           public User(String name, String email, String password, String reference, 
                 String gender, String[] interests) {
               this.name = name;
               this.email = email;
               this.password = password;
               this.reference = reference;
               this.gender = gender;
               this.interests = interests;
           }
       
           public static String getName() {
             return name;
           }
           
           public static String getEmail() {
             return email;
           }
       
           public static String getPassword() {
             return password;
           }
       
           public static String getReference() {
               return reference;
           }
       
           public String getGender(){
               return gender;
           }
       
           public String[] getInterests() {
               return interests;
           }
       
      }
       
      

    File」→「Save」を選択してファイルを保存します。

    これで、Userオブジェクトを作成できました。

ユーザー・セッション・インタフェースの作成

    この項では、Javaインタフェースを作成して、他のコンポーネントが標準的な方法で機能にアクセスできるようにします。このインタフェースでは、Userオブジェクトに標準化された方法でアクセスするためのトランスポートが提供されるため、後で操作を実行できます。

    File」→「New File」を選択します。

    Categoryで「Java」を、File Typesで「Java Interface」を選択して、「Next」をクリックします。

    クラス名としてUserSessionと入力します。

    パッケージとしてcom.example.cdiと入力し、「Finish」をクリックします。

    UserSession.javaクラスがプロジェクトに追加されます。

    UserSession.javaファイルを開き、次のコードを追加します。

    UserSession.java

      package com.example.cdi;
      
      public interface UserSession {
          String welcomeUser(String name);
      }
      

    File」→「Save」を選択してファイルを保存します。

    これで、UserSessionオブジェクトを作成できました。

ユーザー・セッション・インタフェース実装の作成

    この項では、UserSessionインタフェース経由でアクセスされる機能を実装するためのJavaクラスを作成します。

    File」→「New File」を選択します。

    Categoryで「Java」を、File Typesで「Java Class」を選択して、「Next」をクリックします。

    クラス名としてUserSessionImplと入力します。

    パッケージとしてcom.example.cdiと入力し、「Finish」をクリックします。

    UserSessionImpl.javaクラスがプロジェクトに追加されます。

    UserSessionImpl.javaファイルを開き、次のコードを追加します。

    UserSessionImpl.java

      package com.example.cdi;
      
      public class UserSessionImpl implements UserSession {
          public String welcomeUser (String name){
              return "Welcome to the Java EE6 forum, " + name + "!";
          }
      }
      
      

    File」→「Save」を選択してファイルを保存します。

    これで、UserSessionImplオブジェクトを作成できました。

CDIを使用したユーザー入力の処理とWelcomeサービスの公開

    この項では、サーブレットを使用してHTMLフォームを処理し、CDIを使用してUserSessionサービスを公開します。

    サーブレットを使用したフォーム要素の処理

      この項では、HTMLフォームを処理するためのJavaサーブレットを作成します。

      File」→「New File」を選択します。

      Categoriesで「Web」を、File Typesで「Servlet」を選択して、「Next」をクリックします。

      クラス名としてSignupServletと入力します。

      パッケージとしてcom.example.servletsと入力します。

      サーブレット名としてSignupServletと入力します。

      URLパターンとして/welcomeと入力し、「Finish」をクリックします。

      SignupServlet.javaファイルがプロジェクトに追加されます。

      SignupServlet.javaファイルを開き、次のコードを追加します。

      SignupServlet.java - サーブレットの作成

         package com.example.servlets;
         
         import com.example.cdi.UserSession;
         import com.example.model.User;
         import java.io.IOException;
         import java.io.PrintWriter;
         import javax.servlet.ServletException;
         import javax.servlet.annotation.WebServlet;
         import javax.servlet.http.HttpServlet;
         import javax.servlet.http.HttpServletRequest;
         import javax.servlet.http.HttpServletResponse;
        
         @WebServlet(name = "SignupServlet", urlPatterns = {"/welcome"})
         public class SignupServlet extends HttpServlet {
         
             protected void processRequest(HttpServletRequest request, HttpServletResponse response)
                     throws ServletException, IOException {
                 response.setContentType("text/html;charset=UTF-8");
                 PrintWriter out = response.getWriter();
        
                 String name = request.getParameter("name");
                 String email = request.getParameter("email");
                 String password = request.getParameter("password");
                 String reference = request.getParameter("reference");
                 String gender = request.getParameter("gender");
                 String[] interests = request.getParameterValues("interests");
                 User user = new User(name, email, password, reference, gender, interests);
        
                 try {
        
                     out.println("<html>");
                     out.println("<head>");
                     out.println("<title>Java EE 6 Development Forum</title>");            
                     out.println("</head>");
                     out.println("<body>");
                     out.println("<h1>The Java EE 6 Development Forum <h1>");
                     out.println("</body>");
                     out.println("</html>");
                 } finally {            
                     out.close();
                 }
             }
         }
        

      File」→「Save」を選択してファイルを保存します。

    注入を使用したWelcomeメソッドの公開

      この項では、UserSessionオブジェクトの注入を使用してwelcomeMethodサービスを公開します。

      SignupServlet.javaファイルを開きます。

      ハイライトされているコードをSignupServlet.javaファイルに追加します。

      SignupServlet.java:CDIの注釈を使用したUserSessionオブジェクトの注入

         package com.example.servlets;
         
         import com.example.cdi.UserSession;
         import com.example.model.User;
         import java.io.IOException;
         import java.io.PrintWriter;
         import javax.servlet.ServletException;
         import javax.servlet.annotation.WebServlet;
         import javax.servlet.http.HttpServlet;
         import javax.servlet.http.HttpServletRequest;
         import javax.servlet.http.HttpServletResponse;
        
         @WebServlet(name = "SignupServlet", urlPatterns = {"/welcome"})
         public class SignupServlet extends HttpServlet {
         
             @Inject  
         private UserSession session; 
        
             protected void processRequest(HttpServletRequest request, HttpServletResponse response)
                     throws ServletException, IOException {
                 response.setContentType("text/html;charset=UTF-8");
                 PrintWriter out = response.getWriter();
        
                 String name = request.getParameter("name");
                 String email = request.getParameter("email");
                 String password = request.getParameter("password");
                 String reference = request.getParameter("reference");
                 String gender = request.getParameter("gender");
                 String[] interests = request.getParameterValues("interests");
                 User user = new User(name, email, password, reference, gender, interests);
        
                 try {
        
                     out.println("<html>");
                     out.println("<head>");
                     out.println("<title>Java EE 6 Development Forum</title>");            
                     out.println("</head>");
                     out.println("<body>");
                     out.println("<h1>The Java EE 6 Development Forum <h1>");
                     out.println("</body>");
                     out.println("</html>");
                 } finally {            
                     out.close();
                 }
             }
         }
        

      sessionというUserSesssionオブジェクトが注入されました。

      以前に注入したクラスを使用して、次のコードを追加してユーザーを招き入れます。

      SignupServlet.java:welcomeUserの注入されたメソッドの呼出し

        package com.example.servlets;
         
         import com.example.cdi.UserSession;
         import com.example.model.User;
         import java.io.IOException;
         import java.io.PrintWriter;
         import javax.servlet.ServletException;
         import javax.servlet.annotation.WebServlet;
         import javax.servlet.http.HttpServlet;
         import javax.servlet.http.HttpServletRequest;
         import javax.servlet.http.HttpServletResponse;
        
         @WebServlet(name = "SignupServlet", urlPatterns = {"/welcome"})
         public class SignupServlet extends HttpServlet {
         
         
            @Inject  
            private UserSession session;  
            
        
             protected void processRequest(HttpServletRequest request, HttpServletResponse response)
                     throws ServletException, IOException {
                 response.setContentType("text/html;charset=UTF-8");
                 PrintWriter out = response.getWriter();
        
                 String name = request.getParameter("name");
                 String email = request.getParameter("email");
                 String password = request.getParameter("password");
                 String reference = request.getParameter("reference");
                 String gender = request.getParameter("gender");
                 String[] interests = request.getParameterValues("interests");
                 User user = new User(name, email, password, reference, gender, interests);
        
                 try {
        
                     out.println("<html>");
                     out.println("<head>");
                     out.println("<title>Java EE 6 Development Forum</title>");            
                     out.println("</head>");
                     out.println("<body>");
                     out.println("<h1>The Java EE 6 Development Forum <h1>");
                     out.println("<p>" + session.welcomeUser(name) + "</p>");    
                     out.println("</body>");
                     out.println("</html>");
                 } finally {            
                     out.close();
                 }
             }
         }
        
        

      File」→「Save」を選択してファイルを保存します。

    注入のテスト

      CdiForms」プロジェクトを右クリックして、「Run」をクリックします。

      新規ウィンドウで登録ページが開きます。

      Sign-up!」リンクをクリックします。

      フォームに入力して「Sign-up」をクリックします。

      1. Nancy Greenなどの人名を入力します。
      2. ngreen@mail.comなどの有効な電子メール・アドレスを入力します。
      3. welcome1などのパスワードを入力します。
      4. リストから、このチュートリアルについて学習した方法のオプション(Otherなど)を選択します。
      5. 人の性別(Femaleなど)を選択します。
      6. 興味のあるトピック(Client-side developmentServer-side developmentなど)を選択します。

      初期画面が表示されます。

      これで、UserSessionImplオブジェクトからwelcomeUserメソッドを注入できました。

まとめ

    このチュートリアルでは、Java EE 6プラットフォームのContexts and Dependency Injectionの基本について学習しました。また、CDIの機能についても学習しました。

    さらに、次の方法についても学習しました。

    • HTML5フォームの作成
    • サーブレットを使用したフォーム要素の処理
    • CDIを使用したサーブレットへの基本コンポーネントの注入

    参考資料

    このチュートリアルのトピックについて詳しくは、以下を参照してください。

    著者

    • カリキュラムのおもな開発者:Miguel Salazar
    • 共著者:Eduardo Moranchel、Edgar Martinez

このOracle by Exampleをナビゲートする際、以下の機能を使用できます。

ヘッダー・ボタンの非表示:
ヘッダー内のボタンを非表示にするには、タイトルをクリックします。ボタンを再表示するには、もう一度タイトルをクリックします。
トピック一覧ボタン:
すべてのトピックの一覧です。いずれかのトピックをクリックすると、その項に移動します。
すべてのトピックを開く/閉じる:
すべての項に対する詳細を表示または非表示にします。デフォルトでは、すべてのトピックが閉じられています。
すべてのイメージを表示/非表示:
すべてのスクリーンショットを表示または非表示にします。デフォルトでは、すべてのイメージが表示されています。
印刷:
コンテンツを印刷します。現在表示または非表示にされているコンテンツが印刷されます。

このチュートリアルの特定の項に移動するには、一覧からトピックを選択してください。