- Servlet 教程
- Servlet - 首頁
- Servlet - 概述
- Servlet - 環境設定
- Servlet - 生命週期
- Servlet - 示例
- Servlet - 表單資料
- Servlet - 客戶端請求
- Servlet - 伺服器響應
- Servlet - HTTP 狀態碼
- Servlet - 編寫過濾器
- Servlet - 異常
- Servlet - Cookie 處理
- Servlet - 會話跟蹤
- Servlet - 資料庫訪問
- Servlet - 檔案上傳
- Servlet - 處理日期
- Servlet - 頁面重定向
- Servlet - 訪問計數器
- Servlet - 自動重新整理
- Servlet - 傳送電子郵件
- Servlet - 打包
- Servlet - 除錯
- Servlet - 國際化
- Servlet - 註解
- Servlet 有用資源
- Servlet - 問答
- Servlet - 快速指南
- Servlet - 有用資源
- Servlet - 討論
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 的顯示名稱(如果存在) |
必須在註解的 value 或 urlPattern 屬性中宣告至少一個 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 通知訊息。
