Servlet - 注解

到目前为止,您已经了解了 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

指定初始化参数。

3

@WebFilter

声明一个 servlet 过滤器。

4

@WebListener

声明一个 WebListener

5

@HandlesTypes

声明 ServletContainerInitializer 可以处理的类类型。

6

@HttpConstraint

此注解在 ServletSecurity 注解中用于表示要应用于所有 HTTP 协议方法的安全约束,对于这些方法,相应的 HttpMethodConstraint 元素未出现在 ServletSecurity 注解中。

7

@HttpMethodConstraint

此注解在 ServletSecurity 注解中用于表示对特定 HTTP 协议消息的安全约束。

8

@MultipartConfig

可在 Servlet 类上指定的注解,表示 Servlet 的实例需要符合 multipart/form-data MIME 类型的请求。

9

@ServletSecurity

此注解用于 Servlet 实现类,以指定 Servlet 容器对 HTTP 协议消息强制执行的安全约束。

这里我们详细讨论了一些注解。

@WebServlet

@WebServlet 用于声明带有容器的 Servlet 的配置。下表包含用于 WebServlet 注解的属性列表。

Sr.No. 属性 &描述
1

字符串名称

Servlet 的名称

字符串[] 值

URL 模式数组

3

字符串[] 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 注解。这是一个显示文本 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 中。

现在尝试通过运行 http://localhost:8080/Simple 来调用任何 servlet。您将在网页上看到以下输出。

Hello servlet

@WebInitParam

@WebInitParam 注解用于为 Servlet 或 Filter 指定初始化参数。它在 WebFilter 或 WebSevlet 注解中使用。下表包含用于 WebInitParam 注解的属性列表。

Sr.No. 属性 &描述
1

字符串名称

初始化参数的名称

2

字符串值

初始化参数的值

3

字符串描述

初始化参数的描述

示例

以下示例描述了如何将 @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-installationdirectory>;/webapps/ROOT/WEB-INF/classes。

现在尝试通过运行 http://localhost:8080/Simple 来调用任何 servlet。您将在网页上看到以下输出。

Hello Servlet

Hello World!

@Webfilter

这是用于声明 servlet 过滤器的注解。它在部署时由容器处理,并将相应的过滤器应用于指定的 URL 模式、servlet 和调度程序类型。

@WebFilter 注解定义 Web 应用程序中的过滤器。此注解在类上指定,并包含有关正在声明的过滤器的元数据。注解的过滤器必须至少指定一个 URL 模式。下表列出了用于 WebFilter 注解的属性。

Sr.No. 属性 &描述
1

String filterName

过滤器的名称

String[] urlPatterns

提供过滤器适用的值或 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.*;  

// 实现 Filter 类

@WebFilter(urlPatterns = {"/*"}, initParams = { 
   @WebInitParam(name = "test-param", value = "Initialization Paramter")}) 
public class LogFilter implements Filter {
   
   public void init(FilterConfig config) throws ServletException { 
      // 获取初始化参数
      String testParam = config.getInitParameter("test-param");
            
      // 打印 init 参数
      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( ) {
      /* Called before the Filter instance is removed  
      from service by the web container*/ 
   } 
}

以通常的方式编译 Simple.java,并将您的类文件放在 <Tomcat-installationdirectory>/webapps/ROOT/WEB-INF/classes 中。

现在尝试通过运行 http://localhost:8080/Simple 来调用任何 servlet。您将在网页上看到以下输出。

Hello Servlet

Hello World!

现在,打开 servlet 控制台。在那里,您将找到 init 参数 testparam 的值和 当前时间戳 以及 servlet 通知消息。