学习JavaWeb这一篇就够了,从入门到精通,由浅至深,共八章,此篇为第八章第1小节。附带安装包下载。
配套资料,免费下载
链接:
https://pan.baidu.com/s/1G1YUANaBvGjzE-c-Z0xUWw
提取码:txnf
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 目录下,即可实现新功能的扩充,不需要额外的配置。
8.1、注解开发
8.1.1、servlet注解
如何创建:
package com.caochenlei.servlet3.annotation;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;import java.io.IOException;@WebServlet( //代表servlet名称 name = "AnnotationServlet", //代表servlet映射地址,可以写多个,value与urlPatterns一样,二者不能同时出现 value = {"/AnnotationServlet"}, //代表servlet初始化顺序 loadOnStartup = 2, //代表servlet初始化参数,可以写多个 initParams = {@WebInitParam(name = "user",value = "zhangsan")}, //代表servlet是否支持异步,默认为false asyncSupported = 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 ..."); }}
属性列表:
![a2dbc0d57e6ff698547e5cf70d0b52ca.png](https://img-blog.csdnimg.cn/img_convert/a2dbc0d57e6ff698547e5cf70d0b52ca.png)
如何测试:
打开浏览器输入:http://localhost:8080/servlet3_0_war_exploded/AnnotationServlet
检测控制台输出:
![ba199eb4a65531303779624a2ec83b2c.png](https://img-blog.csdnimg.cn/img_convert/ba199eb4a65531303779624a2ec83b2c.png)
8.1.2、filter注解
如何创建:
package com.caochenlei.servlet3.annotation;import javax.servlet.*;import javax.servlet.annotation.WebFilter;import javax.servlet.annotation.WebInitParam;import java.io.IOException;@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() { }}
属性列表:
![e177d0ecd5c862870454c334d8638cbe.png](https://img-blog.csdnimg.cn/img_convert/e177d0ecd5c862870454c334d8638cbe.png)
如何测试:
打开浏览器输入:http://localhost:8080/servlet3_0_war_exploded/AnnotationServlet
检测控制台输出:
![1cd52aa2ee86aa75ca649315335d9481.png](https://img-blog.csdnimg.cn/img_convert/1cd52aa2ee86aa75ca649315335d9481.png)
8.1.3、listener注解
如何创建:
package com.caochenlei.servlet3.annotation;import javax.servlet.ServletContextEvent;import javax.servlet.ServletContextListener;import javax.servlet.annotation.WebListener;@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 ..."); }}
如何测试:
重启服务器,观察控制台:
![ab7128dda9730136343598d749640c02.png](https://img-blog.csdnimg.cn/img_convert/ab7128dda9730136343598d749640c02.png)
8.1.4、两种配置同时存在
- 对于servlet来说:若两种配置方式的url-pattern值相同,则应用无法启动。若两种配置方式的url-pattern值相同,那么相当该servlet具有两个映射url-pattern。
- 对于filter来说:无论两种配置方式的url-pattern值是否相同,其都是作为独立的filter出现的。
- 对于listener来说:如果两种配置方式都进行了同一个listener注册,那么也只能算一个listener。
8.1.5、如何禁用注解组件
如果只想要使用web.xml中的配置而忽略注解注册的组件,只需要在web.xml跟标签添加一个属性即可。
<?xml version="1.0" encoding="UTF-8"?>