Servlets 简明教程

Servlets - Annotations

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

Annotation & Description

1

@WebServlet To declare a servlet.

2

@WebInitParam 指定初始化参数。

3

@WebFilter 声明 Servlet 过滤器。

4

@WebListener To declare a WebListener

5

*@HandlesTypes *声明 ServletContainerInitializer 可处理的类类型。

6

@HttpConstraint 此注释用在 ServletSecurity 注释中,用于表示对所有未在 ServletSecurity 注释中与相应的 HttpMethodConstraint 元素一起出现的 HTTP 协议方法应用的安全约束。

7

*@HttpMethodConstraint *该注解用于ServletSecurity注解中,以表示对特定HTTP协议消息的安全约束。

8

*@MultipartConfig *可指定在Servlet类中以指示Servlet的实例期望符合multipart/form-data MIME类型的请求的注解。

9

@ServletSecurity 该注解用于Servlet实现类中以指定Servlet容器在HTTP协议消息中强制执行的安全约束。

此处我们已详细讨论了一些注解。

@WebServlet

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

Sr.No.

Attribute & Description

1

String name Servlet的名称

2

String[] value URL模式数组

3

String[] urlPatterns 应用此Filter的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 属性。

Example

以下示例介绍如何使用@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-installationdirectory>/webapps/ROOT/WEB-INF/classes。

现在只需运行 [role="bare"] [role="bare"]http://localhost:8080/Simple 即可尝试调用任何 servlet。您将在网页上看到以下输出。

Hello servlet

@WebInitParam

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

Sr.No.

Attribute & Description

1

String name 初始化参数的名称

2

String value 初始化参数的值

3

String description 初始化参数的描述

Example

以下示例介绍如何将 @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 中。

现在只需运行 [role="bare"] [role="bare"]http://localhost:8080/Simple 即可尝试调用任何 servlet。您将在网页上看到以下输出。

Hello Servlet

Hello World!

@Webfilter

这是用于声明 servlet 过滤器的注释。它在部署时由容器处理,并向指定的 URL 模式、servlet 和分派器类型应用相应的过滤器。

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

Sr.No.

Attribute & Description

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 此过滤器的图标(如果存在)

Example

以下示例描述了如何使用 @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。

现在只需运行 [role="bare"] [role="bare"]http://localhost:8080/Simple 即可尝试调用任何 servlet。您将在网页上看到以下输出。

Hello Servlet

Hello World!

现在,打开 servlet 控制台。在那里,您将看到 init 参数 testparamcurrent timestamp 的值以及 servlet 通知消息。