8.1 servlet注解介绍

从版本 7 开始,Tomcat 开始支持Servlet API 3.0 web servlet 规范。特别是,其中出现了一个名为javax.servlet.annotation. 它包含可用于注释 servlet 类的各种类型的注释。如果您使用注释,则不需要部署描述符 (web.xml)。

最有用的注释列表:

注解 描述
1个 @WebServlet 声明一个 servlet
2个 @WebInitParam 指定一个初始化参数
3个 @WebFilter 声明一个网页过滤器
4个 @WebListener 声明网络监听器
5个 @ServletSecurity 允许您配置安全设置

例子:

@WebServlet( urlPatterns = {"/api/*"} )
public class Example extends HttpServlet {
    protected void doGet( HttpServletRequest request, HttpServletResponse response) throws Exception {
         response.setContentType("text/html");
         PrintWriter out = response.getWriter();
         out.println("Hello World!");
    }
}

一个注解足以声明一个 servlet 并将其映射为服务所有将到达/api/*.

8.2 设置servlet映射

注释有@WebServlet许多参数,允许对其描述的 servlet 进行非常灵活的配置。让我们来看看主要的:

属性 描述
1个 name Servlet 唯一名称(如在 web.xml 中)
2个 displayName 人类可读的 servlet 名称
3个 description 服务小程序说明
4个 value 设置映射的 url
5个 urlPatterns 指定要映射的 url 列表(用于代替值)
6个 initParams 允许您设置 servlet 的启动参数
7 asyncSupported 指定 servlet 可以异步运行 (HTTP/2)
8个 loadOnStartup 控制servlet启动优先级的序号
9 smallIcon 设置一个小的 servlet 图标
10 largeIcon 设置一个大的 servlet 图标

这里有几个有趣的点。

首先,请注意valueurlPatterns是可互换的属性。它们都允许您指定 servlet 应映射到的 URL 列表。

其次,该参数asyncSupported指示 servlet 是否会正确处理通过 HTTP/2 协议的异步请求。

第三个重要的属性是initParams,它允许您设置将放置在 ServletContext 中的参数列表。

例子:

@WebServlet(
        urlPatterns = {"/sendFile", "/uploadFile"},
        loadOnStartup = 1,
        asyncSupported = true,
        initParams = {
            @WebInitParam(name = "saveDir", value = "c:/uploaded"),
            @WebInitParam(name = "allowedTypes", value = "jpg,gif,png")
        }
)
public class ImageUploadServlet extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response) throws Exception {
        String saveDir = getInitParameter("saveDir");
        String fileTypes = getInitParameter("allowedTypes");

        PrintWriter writer = response.getWriter();

        writer.println("saveDir = " + saveDir);
        writer.println("fileTypes = " + fileTypes);
    }
}

8.3 设置过滤器映射

如上所述,过滤器是一种实用类型的 servlet,它们的配置类似于 servlet。以下是注释具有的属性@WebFilter

属性 描述
1个 filterName 过滤器唯一名称(如在 web.xml 中)
2个 displayName 人类可读的过滤器名称
3个 description 过滤器说明
4个 value / urlPatterns 设置要映射的 url 列表
5个 dispatcherTypes 指定 DispatcherTypes 的列表
6个 servletNames 指定要应用的 servlet 列表
7 initParams 允许您设置过滤器的启动参数
8个 asyncSupported 指定过滤器可以异步运行 (HTTP/2)
9 smallIcon 设置一个小过滤器图标
10 largeIcon 设置一个大过滤器图标

拦截对特定 servlet 的所有请求的过滤器示例:

@WebFilter(servletNames = {"MyOwnServlet", "UploadServlet"})
public class MyFilter implements Filter {
    // implements Filter's methods here...
}

给定多个参数的过滤器示例:

@WebFilter(
        urlPatterns = "/uploadFilter",
        initParams = @WebInitParam(name = "fileTypes", value = "doc;xls;zip;txt;jpg;png;gif")
)
public class UploadFilter implements Filter {
    // implements Filter's methods here...
}

给定 RequestDispatcher 类型的过滤器示例:

@WebFilter(
        urlPatterns = "/admin",
        dispatcherTypes = {DispatcherType.REQUEST, DispatcherType.FORWARD}
)
public class MyFilter implements Filter {
    // implements Filter's methods here...
}

在接下来的课程中,您将了解有关过滤器和 servlet 用途的更多信息。