1. 概要

Java EEアノテーションは、アプリケーションコンポーネントがコンテナー内でどのように動作するかを指定できるようにすることで、開発者の作業を楽にします。 これらはXML記述子の最新の代替手段であり、基本的に、ボイラープレートコードを回避することを可能にします。

この記事では、JavaEE7のサーブレットAPI3.1で導入されたアノテーションに焦点を当てます。 それらの目的を調べ、その使用法を見ていきます。

2. Web注釈

サーブレットAPI3.1では、サーブレットクラスで使用できる新しい注釈タイプのセットが導入されました。

  • @WebServlet
  • @WebInitParam
  • @WebFilter
  • @WebListener
  • @ServletSecurity
  • @HttpConstraint
  • @HttpMethodConstraint
  • @MultipartConfig

これらについては、次のセクションで詳しく説明します。

3. @WebServlet

簡単に言えば、このアノテーションにより、Javaクラスをサーブレットとして宣言できます

@WebServlet("/account")
public class AccountServlet extends javax.servlet.http.HttpServlet {
    
    public void doGet(HttpServletRequest request, HttpServletResponse response) 
      throws IOException {
        // ...
    }
 
    public void doPost(HttpServletRequest request, HttpServletResponse response) 
      throws IOException {
        // ...
    }
}

3.1. @WebServletアノテーションの属性の使用

@WebServlet には、サーブレットをカスタマイズできる一連の属性があります。

  • 名前
  • 説明
  • urlPatterns
  • initParams

以下の例に示すように、これらを使用できます。

@WebServlet(
  name = "BankAccountServlet", 
  description = "Represents a Bank Account and it's transactions", 
  urlPatterns = {"/account", "/bankAccount" }, 
  initParams = { @WebInitParam(name = "type", value = "savings")})
public class AccountServlet extends javax.servlet.http.HttpServlet {

    String accountType = null;

    public void init(ServletConfig config) throws ServletException {
        // ...
    }

    public void doGet(HttpServletRequest request, HttpServletResponse response) 
      throws IOException {
        // ... 
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response) 
      throws IOException {
        // ...  
    }
}

name 属性は、デフォルトの完全修飾クラス名であるデフォルトのサーブレット名をオーバーライドします。 サーブレットの機能の説明を提供する場合は、description属性を使用できます。

urlPatterns 属性は、サーブレットを使用できるURLを指定するために使用されます(コード例に示すように、この属性に複数の値を指定できます)。

4. @WebInitParam

このアノテーションは、@WebServletアノテーションのinitParams属性およびサーブレットの初期化パラメーターとともに使用されます。

この例では、サーブレット初期化パラメータtypeを’savings’の値に設定します。

@WebServlet(
  name = "BankAccountServlet", 
  description = "Represents a Bank Account and it's transactions", 
  urlPatterns = {"/account", "/bankAccount" }, 
  initParams = { @WebInitParam(name = "type", value = "savings")})
public class AccountServlet extends javax.servlet.http.HttpServlet {

    String accountType = null;

    public void init(ServletConfig config) throws ServletException {
        accountType = config.getInitParameter("type");
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response) 
      throws IOException {
        // ...
    }
}

5. @WebFilter

内部ロジックに触れずにサーブレットの要求と応答を変更したい場合は、WebFilterアノテーションを使用できます。 URLパターンを指定することで、フィルタをサーブレットまたはサーブレットのグループと静的コンテンツに関連付けることができます。

以下の例では、 @WebFilter アノテーションを使用して、不正アクセスをログインページにリダイレクトしています。

@WebFilter(
  urlPatterns = "/account/*",
  filterName = "LoggingFilter",
  description = "Filter all account transaction URLs")
public class LogInFilter implements javax.servlet.Filter {
    
    public void init(FilterConfig filterConfig) throws ServletException {
    }

    public void doFilter(
        ServletRequest request, ServletResponse response, FilterChain chain) 
          throws IOException, ServletException {
        HttpServletRequest req = (HttpServletRequest) request;
        HttpServletResponse res = (HttpServletResponse) response;

        res.sendRedirect(req.getContextPath() + "/login.jsp");
        chain.doFilter(request, response);
    }

    public void destroy() {
    }

}

6. @WebListener

サーブレットとそのリクエストが初期化または変更される方法とタイミングについての知識や制御が必要な場合は、@WebListenerアノテーションを使用できます。

Webリスナーを作成するには、次の1つ以上のインターフェースを拡張する必要があります。

  • ServletContextListener – ServletContextライフサイクルに関する通知用
  • ServletContextAttributeListener – ServletContext属性が変更されたときの通知用
  • ServletRequestListener –リソースのリクエストが行われるたびの通知用
  • ServletRequestAttributeListener – ServletRequest で属性が追加、削除、または変更されたときの通知用
  • HttpSessionListener –新しいセッションが作成および破棄されたときの通知用
  • HttpSessionAttributeListener –新しい属性がセッションに追加またはセッションから削除されるときの通知用

以下は、ServletContextListenerを使用してWebアプリケーションを構成する方法の例です。

@WebListener
public class BankAppServletContextListener 
  implements ServletContextListener {

    public void contextInitialized(ServletContextEvent sce) { 
        sce.getServletContext().setAttribute("ATTR_DEFAULT_LANGUAGE", "english"); 
    } 
    
    public void contextDestroyed(ServletContextEvent sce) { 
        // ... 
    } 
}

7. @ServletSecurity

ロール、アクセス制御、認証要件など、サーブレットのセキュリティモデルを指定する場合は、アノテーション@ServletSecurityを使用します。

この例では、 @ServletSecurity アノテーションを使用して、AccountServletへのアクセスを制限します。

@WebServlet(
  name = "BankAccountServlet", 
  description = "Represents a Bank Account and it's transactions", 
  urlPatterns = {"/account", "/bankAccount" }, 
  initParams = { @WebInitParam(name = "type", value = "savings")})
@ServletSecurity(
  value = @HttpConstraint(rolesAllowed = {"Member"}),
  httpMethodConstraints = {@HttpMethodConstraint(value = "POST", rolesAllowed = {"Admin"})})
public class AccountServlet extends javax.servlet.http.HttpServlet {

    String accountType = null;

    public void init(ServletConfig config) throws ServletException {
        // ...
    }

    public void doGet(HttpServletRequest request, HttpServletResponse response) 
      throws IOException {
       // ...
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response) 
      throws IOException {        
        double accountBalance = 1000d;

        String paramDepositAmt = request.getParameter("dep");
        double depositAmt = Double.parseDouble(paramDepositAmt);
        accountBalance = accountBalance + depositAmt;

        PrintWriter writer = response.getWriter();
        writer.println("<html> Balance of " + accountType + " account is: " + accountBalance 
        + "</html>");
        writer.flush();
    }
}

この場合、 AccountServletを呼び出すと、ブラウザはユーザーが有効なユーザー名とパスワードを入力するためのログイン画面をポップアップします。

@HttpConstraintおよび@HttpMethodConstraintアノテーションを使用して、 @ServletSecurity[のおよびhttpMethodConstraints、の値を指定できます。 X194X]注釈。

@HttpConstraintアノテーションはすべてのHTTPメソッドに適用されます。 つまり、デフォルトのセキュリティ制約を指定します。

@HttpConstraintには次の3つの属性があります。

  • 価値
  • 許可されたroles
  • TransportationGuarantee

これらの属性のうち、最も一般的に使用される属性はrolesAllowedです。 上記のサンプルコードスニペットでは、ロールMemberに属するユーザーはすべてのHTTPメソッドを呼び出すことができます。

@HttpMethodConstraint アノテーションを使用すると、特定のHTTPメソッドのセキュリティ制約を指定できます。

@HttpMethodConstraintには次の属性があります。

  • 価値
  • emptyRoleSemantic
  • 許可されたroles
  • TransportationGuarantee

上記のコードスニペットの例では、 doPostメソッドがAdmin ロールに属するユーザーに対してのみ制限され、によってのみデポジット機能を実行できるようになっています。 Adminユーザー。

8. @MultipartConfig

このアノテーションは、 multipart / form-data リクエストを処理するためにサーブレットにアノテーションを付ける必要がある場合に使用されます(通常、ファイルアップロードサーブレットに使用されます)。

これにより、 getParts()および getPart(name)メソッドが公開されます。 HttpServletRequest メソッドを使用して、個々のパーツだけでなくすべてのパーツにアクセスできます。

アップロードしたファイルは、Partオブジェクトの write(fileName)を呼び出すことでディスクに書き込むことができます。

次に、その使用法を示すサーブレットUploadCustomerDocumentsServletの例を見ていきます。

@WebServlet(urlPatterns = { "/uploadCustDocs" })
@MultipartConfig(
  fileSizeThreshold = 1024 * 1024 * 20,
  maxFileSize = 1024 * 1024 * 20,
  maxRequestSize = 1024 * 1024 * 25,
  location = "./custDocs")
public class UploadCustomerDocumentsServlet extends HttpServlet {

    protected void doPost(HttpServletRequest request, HttpServletResponse response) 
      throws ServletException, IOException {
        for (Part part : request.getParts()) {
            part.write("myFile");
        }
    }

}

@MultipartConfigには4つの属性があります。

  • fileSizeThreshold –これはアップロードされたファイルを一時的に保存するときのサイズのしきい値です。 アップロードされたファイルのサイズがこのしきい値よりも大きい場合、そのファイルはディスクに保存されます。 それ以外の場合、ファイルはメモリに保存されます(バイト単位のサイズ)
  • maxFileSize –これはアップロードされたファイルの最大サイズ(バイト単位のサイズ)です
  • maxRequestSize –これは、アップロードされたファイルと他のフォームデータ(バイト単位のサイズ)の両方を含む、リクエストの最大サイズです。
  • location –アップロードされたファイルが保存されるディレクトリです

9. 結論

この記事では、サーブレットAPI3.1で導入されたJavaEEアノテーションと、その目的および使用法について説明しました。

この記事に関連するソースコードは、GitHubにあります。