Servlet 3.0在Servlet 2.5版本的基础上提供了若干新特性用于简化Web应用的开发和部署。其中有几项特性的引入获得了Java开发人员的赞誉:
(1) 新增的注解支持
(2) 异步处理支持
(3) 可插性支持
1.注解代替配置文件
需要注意的是,如果使用Servlet3.0版本的话:首先Tomcat服务器必须使用7.0版本以上的(老版本不提供3.0版本),其次Eclipse创建Web工程时选择3.0版本。
Servlet3.0版本允许使用注解方式来替代web.xml文件中配置Servlet、Filter和Listener的信息
(1)使用注解替代web.xml文件配置Servlet
@WebServlet(urlPatterns="/*",initParams={@WebInitParam(name="lanmin",value="蓝敏")},loadOnStartup=0)
public class ServletTest extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req,
HttpServletResponse resp)throws ServletException, IOException{
super.doGet(req, resp);
}
}
(2)使用注解替代web.xml文件配置Filter
@WebFilter(urlPatterns="/*",initParams={@WebInitParam(name="lanmin",value="蓝敏")})
public class FilterTest implements Filter {
@Override public void init(FilterConfig arg0) throws ServletException {}
@Override
public void doFilter(ServletRequest arg0, ServletResponse arg1,
FilterChain arg2) throws IOException, ServletException {}
@Override
public void destroy() {}
(3)使用注解替代web.xml文件配置Listener
@WebListenerpublic class ListenerTest implements HttpSessionListener {
@Override public void sessionCreated(HttpSessionEvent arg0) {}
@Override public void sessionDestroyed(HttpSessionEvent arg0) {}
}
下表对新增的@WebFilter注解支持作进一步的介绍。
属性名 | 类型 | 描述 |
filterName | String | 指定过滤器的name属性,等价于<filter-name> |
value | String[] | 该属性等价于urlPatterns 属性。但是两者不应该同时使用。 |
urlPatterns | String[] | 指定一組过滤器的URL匹配模式。等价于<url-patterm>标签。 |
ServletNames | String[] | 指定过滤器将应用于哪些Servlet。取値是@WebServlet中的name 属性的取值,或者是web.xml中<servlet-name> 的取值。 |
dispatcherTypes | DispatcherType | 指定过滤器的转发模式。具体取值包括: ASYNC、 ERROR、 FORWARD、 INCLUDE、 REQUEST。 |
initParams | WeblnitParam[] | 指定一組过滤器初始化参数,等价于<init-param>标签。 |
asyncSupported | boolean | 声明过滤器是否支持异步操作模式,等价于<async-supported>标签。 |
description | String | 该过滤器的描述信息,等价于<description>标签。 |
displayName | String | 该过滤器的显示名,通常配合工具使用,等价于<dis play-name>标签。 |
2.servlet异步处理
所谓异步处理就是指数据发送方发送数据给数据接收方后,不必等待数据接收方作出响应,可以继续发送下一个数据的通信方式。
Servlet3.0版本提供了相关异步处理的功能,具体实现方式如下:
(1)需要使用注解在对应Servlet配置asyncSupported=true,表示当前Servlet支持异步。
(2)通过Request对象的startAsync(Request,Response)方法获取异步上下文对象。
(3)通过异步上下文对象调用start(newRunnable(){})方法开始。
【案例6-7】servlet异步处理AsyncServlet.java。
3.servlet可插性支持
如果说 3.0 版本新增的注解支持是为了简化 Servlet、Filter和Listener的声明,从而使得web.xml变为可选配置, 那么新增的可插性(pluggability)支持则将 Servlet 配置的灵活性提升到了新的高度。
使用该特性,现在我们可以在不修改已有 Web 应用的前提下,只需将按照一定格式打成的 JAR 包放到 WEB-INF/lib 目录下,即可实现新功能的扩充,不需要额外的配置。
现在,为一个 Web 应用增加一个 Servlet 配置有如下三种方式 ( 过滤器、监听器与 Servlet 三者的配置都是等价的,故在此以 Servlet 配置为例进行讲述,过滤器和监听器具有与之非常类似的特性 ):
编写一个类继承自 HttpServlet,将该类放在 classes 目录下的对应包结构中,修改 web.xml,在其中增加一个 Servlet 声明。这是最原始的方式;
编写一个类继承自 HttpServlet,并且在该类上使用 @WebServlet 注解将该类声明为 Servlet,将该类放在 classes 目录下的对应包结构中,无需修改 web.xml 文件。
编写一个类继承自 HttpServlet,将该类打成 JAR 包,并且在 JAR 包的 META-INF 目录下放置一个web-fragment.xml 文件,该文件中声明了相应的 Servlet 配置。
web-fragment.xml 文件示例如下:
<?xml version="1.0" encoding="UTF-8"?><web-fragment xmlns=http://java.sun.com/xml/ns/javaee xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="3.0" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-fragment_3_0.xsd" metadata-complete="true">
<servlet>
<servlet-name>fragment</servlet-name>
<servlet-class>footmark.servlet.FragmentServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>fragment</servlet-name>
<url-pattern>/fragment</url-pattern>
</servlet-mapping>
</web-fragment>

