- Servlet 教程
- Servlet - 首页
- Servlet - 概述
- Servlet - 环境设置
- Servlet - 生命周期
- Servlet - 示例
- Servlet - 表单数据
- Servlet - 客户端请求
- Servlet - 服务器响应
- Servlet - HTTP 状态码
- Servlet - 编写过滤器
- Servlet - 异常
- Servlet - Cookie 处理
- Servlet - 会话跟踪
- Servlet - 数据库访问
- Servlet - 文件上传
- Servlet - 处理日期
- Servlet - 页面重定向
- Servlet - 访问计数器
- Servlet - 自动刷新
- Servlet - 发送电子邮件
- Servlet - 打包
- Servlet - 调试
- Servlet - 国际化
- Servlet - 注解
- Servlet 有用资源
- Servlet - 问答
- Servlet - 快速指南
- Servlet - 有用资源
- Servlet - 讨论
Servlet - 注解
到目前为止,您已经了解了 Servlet 如何使用部署描述符(web.xml 文件)将您的应用程序部署到 Web 服务器。Servlet API 3.0 引入了一个名为 javax.servlet.annotation 的新包。它提供了可用于注释 Servlet 类的注解类型。如果您使用注解,则不需要部署描述符(web.xml)。但是您应该使用 Tomcat 7 或更高版本的 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 协议方法的安全约束,对于这些方法,在 ServletSecurity 注解中不存在相应的 HttpMethodConstraint 元素。 |
| 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 的显示名称(如果存在) |
必须在注解的 value 或 urlPattern 属性中声明至少一个 URL 模式,但不能同时声明两者。
当 URL 模式是唯一设置的属性时,建议使用 value 属性,否则应使用 urlPattern 属性。
示例
以下示例描述了如何使用 @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-安装目录>/webapps/ROOT/WEB-INF/classes 中。
现在尝试通过运行 https://:8080/Simple 来调用任何 Servlet。您将在网页上看到以下输出。
Hello servlet
@WebInitParam
使用 @WebInitParam 注解来为 Servlet 或过滤器指定初始化参数。它用于 WebFilter 或 WebSevlet 注解中。下表包含 WebInitParam 注解使用的属性列表。
| 序号 | 属性 & 描述 |
|---|---|
| 1 | String name 初始化参数的名称 |
| 2 | String value 初始化参数的值 |
| 3 | String description 初始化参数的描述 |
示例
以下示例描述了如何将 @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-安装目录>;/webapps/ROOT/WEB-INF/classes 中。
现在尝试通过运行 https://:8080/Simple 来调用任何 Servlet。您将在网页上看到以下输出。
Hello Servlet Hello World!
@Webfilter
这是用于声明 Servlet 过滤器的注解。它由容器在部署时处理,并将相应的过滤器应用于指定的 URL 模式、Servlet 和调度程序类型。
@WebFilter 注解在 Web 应用程序中定义过滤器。此注解指定在类上,并包含有关正在声明的过滤器的元数据。带注解的过滤器必须指定至少一个 URL 模式。下表列出了 WebFilter 注解使用的属性。
| 序号 | 属性 & 描述 |
|---|---|
| 1 | String filterName 过滤器的名称 |
| 2 | String[] urlPatterns 提供过滤器应用的 value 或 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-安装目录>/webapps/ROOT/WEB-INF/classes 中。
现在尝试通过运行 https://:8080/Simple 来调用任何 Servlet。您将在网页上看到以下输出。
Hello Servlet Hello World!
现在,打开 Servlet 控制台。在那里,您将找到 init 参数 testparam 的值以及 当前时间戳以及 Servlet 通知消息。
