JavaWebServlet3.0(了解)

Posted 王六六的IT日常

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JavaWebServlet3.0(了解)相关的知识,希望对你有一定的参考价值。

Servlet 3.0 作为 Java EE 6 规范体系中一员,随着 Java EE 6 规范一起发布。该版本在前一版本(Servlet 2.5)的基础上提供了若干新特性用于简化 Web 应用的开发和部署。其中有几项特性的引入让开发者感到非常兴奋,同时也获得了 Java 社区的一片赞誉之声:

  • 新增的注解支持:该版本新增了若干注解,用于简化 Servlet、过滤器(Filter)和监听器(Listener)的声明,这使得 web.xml 部署描述文件从该版本开始不再是必选的了
  • 文件上传API简化:从该版本开始,极大地简化了文件上传的操作
  • 异步处理支持: 有了该特性,Servlet 线程不再需要一直阻塞,直到业务处理完毕才能再输出响应,最后才结束该 Servlet 线程。在接收到请求之后,Servlet 线程可以将耗时的操作委派给另一个线程来完成,自己在不生成响应的情况下返回至容器。针对业务处理较耗时的情况,这将大大减少服务器资源的占用,并且提高并发处理速度。
  • 动态注册组件: 在初始化ServletContext容器的时候,可以支持动态注册三大组件。
  • 可插性支持: 如果说 3.0 版本新增的注解支持是为了简化 Servlet/ 过滤器 / 监听器的声明,从而使得 web.xml 变为可选配置, 那么新增的可插性 (pluggability) 支持则将 Servlet 配置的灵活性提升到了新的高度
    熟悉 Struts2 的开发者都知道,Struts2 通过插件的形式提供了对包括 Spring 在内的各种开发框架的支持,开发者甚至可以自己为 Struts2 开发插件,而 Servlet 的可插性支持正是基于这样的理念而产生的。使用该特性,现在我们可以在不修改已有 Web 应用的前提下,只需将按照一定格式打成的 JAR 包放到 WEB-INF/lib 目录下,即可实现新功能的扩充,不需要额外的配置。

servlet注解

@WebServlet(
        name = "AnnotationServlet",//代表servlet名称
        value = {"/AnnotationServlet"},//代表servlet映射地址,可以写多个,value与urlPatterns一样,二者不能同时出现
        loadOnStartup = 2,//代表servlet初始化顺序
        initParams = {@WebInitParam(name = "user",value = "zhangsan")},//代表servlet初始化参数,可以写多个
        asyncSupported = false//代表servlet是否支持异步,默认为false
)
public class AnnotationServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        System.out.println("doPost ...");
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        System.out.println("doGet ...");
    }
}

属性列表:

测试:
打开浏览器输入:http://localhost:8080/AnnotationServlet

检测控制台输出:

filter注解

@WebFilter(
        filterName = "AnnotationFilter",//代表filter名称
        value = {"/*"},//代表filter映射路径,可以写多个,value与urlPatterns一样,二者不能同时出现
        dispatcherTypes = {DispatcherType.REQUEST},//代表filter拦截类型
        initParams = {@WebInitParam(name = "user", value = "zhansan")},//代表filter初始化参数,可以写多个
        asyncSupported = false,//代表filter是否支持异步,默认为false
        servletNames = {"AnnotationServlet"}//代表filter指定拦截哪几个servlet
)
public class AnnotationFilter implements Filter {
    public void init(FilterConfig config) throws ServletException {
    }

    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain)
            throws ServletException, IOException {
        System.out.println("doFilter ...");
        chain.doFilter(req, resp);
    }

    public void destroy() {
    }
}

属性列表:

listener注解

@WebListener()
public class AnnotationListener implements ServletContextListener {
    @Override
    public void contextInitialized(ServletContextEvent servletContextEvent) {
        System.out.println("contextInitialized ...");
    }

    @Override
    public void contextDestroyed(ServletContextEvent servletContextEvent) {
        System.out.println("contextDestroyed ...");
    }
}

两种配置同时存在

对于servlet来说:

  • 若两种配置方式的url-pattern值相同,则应用无法启动。
  • 若两种配置方式的url-pattern值相同,那么相当该servlet具有两个映射url-pattern。
    对于filter来说:
  • 无论两种配置方式的url-pattern值是否相同,其都是作为独立的filter出现的。
    对于listener来说:
  • 如果两种配置方式都进行了同一个listener注册,那么也只能算一个listener。

如何禁用注解组件
如果只想要使用web.xml中的配置而忽略注解注册的组件,只需要在web.xml跟标签添加一个属性即可。

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0" metadata-complete="false">
</web-app>

metadata-complete=“false”:表示web.xml配置和注解配置同时生效,默认是false。

metadata-complete=“true”:表示web.xml配置有效,而注解配置则被忽略。

以上是关于JavaWebServlet3.0(了解)的主要内容,如果未能解决你的问题,请参考以下文章

了解 BitTorrent 片段输出

VS中添加自定义代码片段——偷懒小技巧

Apollo Codegen 没有找到生成代码的操作或片段

调用模板化成员函数:帮助我理解另一个 *** 帖子中的代码片段

与另一个片段通信的片段接口

有人可以解释啥是 SVN 平分算法吗?理论上和通过代码片段[重复]