到目前為止,您已經了解了Servlet如何使用部署描述符(web.xml文件)將應用程序部署到Web服務器中。 Servlet API 3.0引入了一個名為javax.servlet.annotation的新程序包。 它提供了可用于對Servlet類進行注解的注解類型。 如果使用注解,則不需要部署描述符(web.xml)。 但是您應該使用tomcat7或任何更高版本的tomcat。
注解可以替換Web部署描述符文件(web.xml)中的等效XML配置,例如servlet聲明和servlet映射。 Servlet容器將在部署時處理帶注解的類。
Servlet 3.0中引入的注解類型為
| Sr.No. | 注解和描述 |
|---|---|
| 1 | @WebServlet 聲明servlet。 |
| 2 | @WebInitParam 指定初始化參數(shù) |
| 3 | @WebFilter 聲明servlet篩選器 |
| 4 | @WebListener 聲明WebListener |
| 5 | @HandlesTypes 聲明ServletContainerInitializer可以處理的類類型。 |
| 6 | @HttpConstraint 此注解在ServletSecurity注解中用于表示要應用于所有HTTP協(xié)議方法的安全約束,對于這些方法,ServletSecurity注解中沒有相應的HttpMethodConstraint元素。 |
| 7 | @HttpMethodConstraint 此注解在ServletSecurity注解中用于表示特定HTTP協(xié)議消息的安全約束。 |
| 8 | @MultipartConfig 可以在 Servlet 類上指定的注解,表示 Servlet 的實例期望符合多部分/表單數(shù)據(jù) MIME 類型的請求。 |
| 9 | @ServletSecurity 此注解用于Servlet實現(xiàn)類,以指定Servlet容器對HTTP協(xié)議消息實施的安全約束。 |
這里我們已經詳細討論了一些注解。
@WebServlet用于聲明帶有容器的Servlet的配置。下表包含用于WebServlet注解的屬性列表。
| Sr.No. | 屬性和描述 |
|---|---|
| 1 | String name Servlet 的名稱 |
| 2 | String[] value URL模式數(shù)組 |
| 3 | String[] urlPatterns 應用此篩選器的 URL 模式數(shù)組 |
| 4 | Int loadOnStartup 整數(shù)值給出啟動排序提示 |
| 5 | WebInitParam[] initParams Servlet初始化數(shù)組參數(shù) |
| 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注解。它是一個顯示文本Hello servlet的簡單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-installationdirectory>/webapps/ROOT/WEB-INF/classes 中。
現(xiàn)在嘗試通過運行http://localhost:8080/Simple調用任何servlet。您將在web頁面上看到以下輸出。
Hello servlet
@WebInitParam注解用于為Servlet或過濾器指定初始化參數(shù)。它在WebFilter或webevlet注解中使用。下表包含用于WebInitParam注解的屬性列表。
| Sr.No. | 屬性和描述 |
|---|---|
| 1 | String name 初始化參數(shù)的名稱 |
| 2 | String value 初始化參數(shù)的值 |
| 3 | String description 初始化參數(shù)的描述 |
@WebInitParam注解用于為Servlet或過濾器指定初始化參數(shù)。它在WebFilter或webevlet注解中使用。下表包含用于WebInitParam注解的屬性列表。
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-installationdirectory>/webapps/ROOT/WEB-INF/classes 中。
現(xiàn)在嘗試通過運行http://localhost:8080/Simple調用任何servlet。您將在web頁面上看到以下輸出。
Hello Servlet Hello World!
這是用于聲明servlet過濾器的注解。它在部署時由容器處理,并將相應的過濾器應用于指定的URL模式、servlet和dispatcher類型。
@WebFilter注解定義了web應用程序中的過濾器。此注解是在類上指定的,并包含有關所聲明篩選器的元數(shù)據(jù)。帶注解的篩選器必須至少指定一個URL模式。下表列出了用于WebFilter注解的屬性。
| Sr.No. | 屬性和描述 |
|---|---|
| 1 | String filterName 篩選器的名稱 |
| 2 | String[] urlPatterns 提供應用篩選器的值或 urlPatterns 數(shù)組 |
| 3 | DispatcherType[] dispatcherTypes 指定篩選器應用的調度器(請求/響應)的類型 |
| 4 | String[] servletNames 提供 servlet 名稱的數(shù)組 |
| 5 | String displayName 篩選器的名稱 |
| 6 | String description 過濾器說明 |
| 7 | WebInitParam[] initParams 此篩選器的初始化數(shù)組參數(shù) |
| 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.*;
//實現(xiàn)篩選器類
@WebFilter(urlPatterns = {"/*"}, initParams = {
@WebInitParam(name = "test-param", value = "Initialization Paramter")})
public class LogFilter implements Filter {
public void init(FilterConfig config) throws ServletException {
// 獲取初始化參數(shù)
String testParam = config.getInitParameter("test-param");
//打印init參數(shù)
System.out.println("Test Param: " + testParam);
}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
//記錄當前時間戳。
System.out.println("Time " + new Date().toString());
//將請求傳遞回篩選器鏈
chain.doFilter(request,response);
}
public void destroy( ) {
/* 在刪除篩選器實例之前調用
從web容器提供的服務*/
}
}用通常的方式編譯 Simple.java,并將類文件放在 <tomcat-installationdirectory>/webapps/ROOT/WEB-INF/classes 中。
現(xiàn)在嘗試通過運行http://localhost:8080/Simple調用任何servlet。您將在web頁面上看到以下輸出。
Hello Servlet Hello World!
現(xiàn)在,打開servlet控制臺。在那里,你會發(fā)現(xiàn)的值初始化參數(shù)testparam和當前時間戳與servlet的通知消息一起。