到目前为止,您已经了解了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协议方法的安全约束,对于这些方法,ServletSecurity注解中没有相应的HttpMethodConstraint元素。 |
| 7 | @HttpMethodConstraint 此注解在ServletSecurity注解中用于表示特定HTTP协议消息的安全约束。 |
| 8 | @MultipartConfig 可以在 Servlet 类上指定的注解,表示 Servlet 的实例期望符合多部分/表单数据 MIME 类型的请求。 |
| 9 | @ServletSecurity 此注解用于Servlet实现类,以指定Servlet容器对HTTP协议消息实施的安全约束。 |
这里我们已经详细讨论了一些注解。
@WebServlet用于声明带有容器的Servlet的配置。下表包含用于WebServlet注解的属性列表。
| Sr.No. | 属性和描述 |
|---|---|
| 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注解。它是一个显示文本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。您将在web页面上看到以下输出。
Hello servlet
@WebInitParam注解用于为Servlet或过滤器指定初始化参数。它在WebFilter或webevlet注解中使用。下表包含用于WebInitParam注解的属性列表。
| Sr.No. | 属性和描述 |
|---|---|
| 1 | String name 初始化参数的名称 |
| 2 | String value 初始化参数的值 |
| 3 | String description 初始化参数的描述 |
@WebInitParam注解用于为Servlet或过滤器指定初始化参数。它在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 中。
现在尝试通过运行http://localhost:8080/Simple调用任何servlet。您将在web页面上看到以下输出。
Hello Servlet Hello World!
这是用于声明servlet过滤器的注解。它在部署时由容器处理,并将相应的过滤器应用于指定的URL模式、servlet和dispatcher类型。
@WebFilter注解定义了web应用程序中的过滤器。此注解是在类上指定的,并包含有关所声明筛选器的元数据。带注解的筛选器必须至少指定一个URL模式。下表列出了用于WebFilter注解的属性。
| Sr.No. | 属性和描述 |
|---|---|
| 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.*;
//实现筛选器类
@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( ) {
/* 在删除筛选器实例之前调用
从web容器提供的服务*/
}
}用通常的方式编译 Simple.java,并将类文件放在 <tomcat-installationdirectory>/webapps/ROOT/WEB-INF/classes 中。
现在尝试通过运行http://localhost:8080/Simple调用任何servlet。您将在web页面上看到以下输出。
Hello Servlet Hello World!
现在,打开servlet控制台。在那里,你会发现的值初始化参数testparam和当前时间戳与servlet的通知消息一起。