Servlets - 注解

  • 简述

    到目前为止,您已经了解了 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 中引入的注解类型是 -
    序号 注解和描述
    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 注解的属性列表。
    序号 属性和描述
    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 的显示名称(如果存在)
    必须至少声明一个 URL 模式 value 或者 urlPattern 注解的属性,但不能同时具有。
    value 建议在 URL 模式是唯一设置的属性时使用属性,否则 urlPattern 应该使用属性。

    例子

    下面的例子描述了如何使用@WebServlet 注解。它是一个显示文本的简单 servletHello 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 或过滤器指定初始化参数。它在 WebFilter 或 WebSevlet 注解中使用。下表包含用于 WebInitParam 注解的属性列表。
    序号 属性和描述
    1
    String name
    初始化参数名称
    2
    String value
    初始化参数的值
    3
    String description
    初始化参数说明

    例子

    下面的例子描述了如何使用@WeInitParam 注解和@WebServlet 注解。它是一个显示文本的简单 servletHello 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 注解的属性。
    序号 属性和描述
    1
    String filterName
    过滤器名称
    2
    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.*;  
    // 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-installationdirectory>/webapps/ROOT/WEB-INF/classes 中。
    现在尝试通过运行http://localhost:8080/Simple来调用任何 servlet 。您将在网页上看到以下输出。
    
    Hello Servlet
      
    Hello World!
    
    现在,打开 servlet 控制台。在那里,你会发现init 范围 testparamcurrent timestamp 连同 servlet 通知消息。