Servlet - 註解



到目前為止,您已經瞭解了 Servlet 如何使用部署描述符(web.xml 檔案)將您的應用程式部署到 Web 伺服器。Servlet API 3.0 引入了一個名為 javax.servlet.annotation 的新包。它提供了可用於註釋 Servlet 類的註解型別。如果您使用註解,則不需要部署描述符(web.xml)。但是您應該使用 Tomcat 7 或更高版本的 Tomcat。

註解可以替換 web 部署描述符檔案 (web.xml) 中等效的 XML 配置,例如 Servlet 宣告和 Servlet 對映。Servlet 容器將在部署時處理帶註解的類。

Servlet 3.0 中引入的註解型別如下:

序號 註解 & 描述
1

@WebServlet

用於宣告 Servlet。

2

@WebInitParam

用於指定初始化引數。

3

@WebFilter

用於宣告 Servlet 過濾器。

4

@WebListener

用於宣告 WebListener

5

@HandlesTypes

用於宣告 ServletContainerInitializer 可以處理的類型別。

6

@HttpConstraint

此註解用於 ServletSecurity 註解中,表示要應用於所有 HTTP 協議方法的安全約束,對於這些方法,在 ServletSecurity 註解中不存在相應的 HttpMethodConstraint 元素。

7

@HttpMethodConstraint

此註解用於 ServletSecurity 註解中,表示對特定 HTTP 協議訊息的安全約束。

8

@MultipartConfig

可以指定在 Servlet 類上的註解,表示 Servlet 的例項期望符合 multipart/form-data MIME 型別的請求。

9

@ServletSecurity

此註解用於 Servlet 實現類上,用於指定 Servlet 容器在 HTTP 協議訊息上強制執行的安全約束。

這裡我們詳細討論了一些註解。

@WebServlet

使用 @WebServlet 來宣告 Servlet 的容器配置。下表包含 WebServlet 註解使用的屬性列表。

序號 屬性 & 描述
1

String name

Servlet 的名稱

2

String[] value

URL 模式的陣列

3

String[] urlPatterns

此過濾器應用的 URL 模式的陣列

4

Int loadOnStartup

整數值提供啟動順序提示

5

WebInitParam[] initParams

此 Servlet 的初始化引數陣列

6

Boolean asyncSupported

此 Servlet 支援非同步操作

7

String smallIcon

此 Servlet 的小圖示(如果存在)

8

String largeIcon

此 Servlet 的大圖示(如果存在)

9

String description

此 Servlet 的描述(如果存在)

10

String displayName

此 Servlet 的顯示名稱(如果存在)

必須在註解的 valueurlPattern 屬性中宣告至少一個 URL 模式,但不能同時宣告兩者。

當 URL 模式是唯一設定的屬性時,建議使用 value 屬性,否則應使用 urlPattern 屬性。

示例

以下示例描述瞭如何使用 @WebServlet 註解。這是一個簡單的 Servlet,顯示文字 Hello Servlet

import java.io.IOException; 
import java.io.PrintWriter; 
import javax.servlet.ServletException; 
import javax.servlet.annotation.WebInitParam; 
import javax.servlet.annotation.WebServlet; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
@WebServlet(value = "/Simple") 
public class Simple extends HttpServlet {

   private static final long serialVersionUID = 1L; 

   protected void doGet(HttpServletRequest request, HttpServletResponse response)  
      throws ServletException, IOException { 
   
      response.setContentType("text/html");   
      PrintWriter out = response.getWriter();   
      out.print("<html><body>");   
      out.print("<h3>Hello Servlet</h3>");   
      out.print("</body></html>");         
   }   
}

以通常的方式編譯 Simple.java,並將您的類檔案放在 <Tomcat-安裝目錄>/webapps/ROOT/WEB-INF/classes 中。

現在嘗試透過執行 https://:8080/Simple 來呼叫任何 Servlet。您將在網頁上看到以下輸出。

Hello servlet

@WebInitParam

使用 @WebInitParam 註解來為 Servlet 或過濾器指定初始化引數。它用於 WebFilter 或 WebSevlet 註解中。下表包含 WebInitParam 註解使用的屬性列表。

序號 屬性 & 描述
1

String name

初始化引數的名稱

2

String value

初始化引數的值

3

String description

初始化引數的描述

示例

以下示例描述瞭如何將 @WeInitParam 註解與 @WebServlet 註解一起使用。這是一個簡單的 Servlet,顯示文字 Hello Servlet 和字串值 Hello World!,這些值取自 init 引數。

import java.io.IOException; 
import java.io.PrintWriter; 
import javax.servlet.ServletException; 
import javax.servlet.annotation.WebInitParam; 
import javax.servlet.annotation.WebServlet; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse;

@WebServlet(value = "/Simple", initParams = { 
   @WebInitParam(name = "foo", value = "Hello "), 
   @WebInitParam(name = "bar", value = " World!") 
}) 
public class Simple extends HttpServlet {

   private static final long serialVersionUID = 1L; 

   protected void doGet(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {   
      
      response.setContentType("text/html");   
      PrintWriter out = response.getWriter();   
      out.print("<html><body>");   
      out.print("<h3>Hello Servlet</h3>");   
      out.println(getInitParameter("foo")); 
      out.println(getInitParameter("bar")); 
      out.print("</body></html>");         
   }   
}

以通常的方式編譯 Simple.java,並將您的類檔案放在 <Tomcat-安裝目錄>;/webapps/ROOT/WEB-INF/classes 中。

現在嘗試透過執行 https://:8080/Simple 來呼叫任何 Servlet。您將在網頁上看到以下輸出。

Hello Servlet

Hello World! 

@Webfilter

這是用於宣告 Servlet 過濾器的註解。它由容器在部署時處理,並將相應的過濾器應用於指定的 URL 模式、Servlet 和排程程式型別。

@WebFilter 註解在 Web 應用程式中定義過濾器。此註解指定在類上,幷包含有關正在宣告的過濾器的元資料。帶註解的過濾器必須指定至少一個 URL 模式。下表列出了 WebFilter 註解使用的屬性。

序號 屬性 & 描述
1

String filterName

過濾器的名稱

2

String[] urlPatterns

提供過濾器應用的 value 或 urlPatterns 陣列

3

DispatcherType[] dispatcherTypes

指定過濾器應用的排程程式(請求/響應)型別

4

String[] servletNames

提供 Servlet 名稱陣列

5

String displayName

過濾器的名稱

6

String description

過濾器的描述

7

WebInitParam[] initParams

此過濾器的初始化引數陣列

8

Boolean asyncSupported

此過濾器支援非同步操作

9

String smallIcon

此過濾器的圖示(如果存在)

10

String largeIcon

此過濾器的圖示(如果存在)

示例

以下示例描述瞭如何使用 @WebFilter 註解。這是一個簡單的 LogFilter,它在控制檯上顯示 Init-param test-param 的值和當前時間戳。這意味著,過濾器充當請求和響應之間的介面層。這裡我們對 urlPattern 使用“/*”。這意味著此過濾器適用於所有 Servlet。

import java.io.IOException; 
import javax.servlet.annotation.WebFilter; 
import javax.servlet.annotation.WebInitParam; 
import javax.servlet.*; 
import java.util.*;  

// Implements Filter class

@WebFilter(urlPatterns = {"/*"}, initParams = { 
   @WebInitParam(name = "test-param", value = "Initialization Paramter")}) 
public class LogFilter implements Filter {
   
   public void init(FilterConfig config) throws ServletException { 
      // Get init parameter  
      String testParam = config.getInitParameter("test-param");
            
      //Print the init parameter  
      System.out.println("Test Param: " + testParam);  
   } 

   public void doFilter(ServletRequest request, ServletResponse response,
      FilterChain chain) throws IOException, ServletException { 
	  
      // Log the current timestamp. 
      System.out.println("Time " + new Date().toString());  
         
      // Pass request back down the filter chain 
      chain.doFilter(request,response); 
   }

   public void destroy( ) {
      /* Called before the Filter instance is removed  
      from service by the web container*/ 
   } 
}

以通常的方式編譯 Simple.java,並將您的類檔案放在 <Tomcat-安裝目錄>/webapps/ROOT/WEB-INF/classes 中。

現在嘗試透過執行 https://:8080/Simple 來呼叫任何 Servlet。您將在網頁上看到以下輸出。

Hello Servlet
  
Hello World!

現在,開啟 Servlet 控制檯。在那裡,您將找到 init 引數 testparam 的值以及 當前時間戳以及 Servlet 通知訊息。

廣告

© . All rights reserved.