更新
正如更新并更明确地说明的那样,这些是Servlet 2.5和3之间的主要区别(我并不想穷尽所有,我只是在提到最有趣的部分):
声明Servlet,过滤器和侦听器的注释(易于开发)
在Servlet 2.5中,要使用一个init参数声明一个Servlet,您需要将此参数添加到 web.xml中 :
<servlet> <servlet-name>myServlet</servlet-name> <servlet-class>my.server.side.stuff.MyAwesomeServlet</servlet-class> <init-param> <param-name>configFile</param-name> <param-value>config.xml</param-value> </init-param></servlet><servlet-mapping> <servlet-name>myServlet</servlet-name> <url-pattern>/path/to/my/servlet</url-pattern></servlet-mapping>
在Servlet 3中, web.xml 是可选的,您可以使用注释而不是XML。相同的例子:
@WebServlet(name="myServlet", urlPatterns={"/path/to/my/servlet"}, initParams={@InitParam(name="configFile", value="config.xml")})public class MyAwesomeServlet extends HttpServlet { ... }对于过滤器,您需要在Servlet 2.5 中的 web.xml 中添加它:
<filter> <filter-name>myFilter</filter-name> <filter-class>my.server.side.stuff.MyAwesomeServlet</filter-class></filter><filter-mapping> <filter-name>myFilter</filter-name> <url-pattern>/path/to/my/filter</url-pattern></filter-mapping>
相当于在Servlet中使用注释3:
@ServletFilter(name="myFilter", urlPatterns={"/path/to/my/filter"})public class MyAwesomeFilter implements Filter { ... }对于侦听器(在本例中为ServletContextListener),在Servlet 2.5中:
<listener> <listener-class>my.server.side.stuff.MyAwesomeListener</listener-class></listener>
使用注释也是如此:
@WebServletContextListenerpublic class MyAwesomeListener implements ServletContextListener { ... }web.xml的模块化(可插入性)
- 在Servlet 2.5中,只有一个整体式的 web.xml 文件。
- 在servlet 3中,每个“可加载” jar都可以在其 meta-INF* 目录中包含一个 web-fragment.xml ,用于指定servlet,过滤器等。这是为了允许库和框架指定其自己的servlet或其他对象。 *
在上下文初始化时动态注册servlet,过滤器和侦听器(可插入性)
在小服务程序3中,
ServletContextListener可以动态地添加加入到小服务程序,过滤器和使用以下方法听众
SevletContext:
addServlet(),
addFilter()和
addListener()
异步支持
示例:假设某个Servlet容器的线程池中有五个线程,并且每个请求都要执行一个耗时的过程(例如复杂的SQL查询)。
使用Servlet 2.5这个servlet容器将耗尽可用线程,如果它收到与此同时五个请求和五个可用线程开始做的过程中,因为线程不会返回,直到
service()
(或者doGet()
,doPost()
等)从开始执行结束并返回响应。使用Servlet 3.0,可以将此长时间过程委派给另一个线程并
service()
在发送响应之前完成(现在,响应将由最新线程发送)。这样,线程可以自由接收新的响应。
异步支持的示例:
Servlet 2.5:
public class MyAwesomeServlet extends HttpSerlvet { @Override public void doGet(HttpServletRequest request, HttpServletResponse response) { // ... runSlowProcess(); // no async support, thread will be free when runSlowProcess() and // doGet finish // ... }}Servlet 3:
@WebServlet(name="myServlet", urlPatterns={"/mySlowProcess"}, asyncSupported=true) // asyncSupported MUST be specified for // servlets that support asynchronous // processingpublic class MyAwesomeServlet extends HttpSerlvet { @Override public void doGet(HttpServletRequest request, HttpServletResponse response) { // an AsyncContext is created, now the response will be completed // not when doGet finalizes its execution, but when // myAsyncContext.complete() is called. AsyncContext myAsyncContext = request.startAsync(request, response); // ... // myAsyncContext is passed to another thread delegateExecutionToProcessingThread(myAsyncContext); // done, now this thread is free to serve another request }}// ... and somewhere in another part of the pre:public class MyProcessingObject { public void doSlowProcess() { // ... runSlowProcess(); myAsyncContext.complete(); // request is now completed. // ... }}该接口
AsyncContext还具有获取请求对象,响应对象以及添加侦听器的方法,以在进程完成时通知它们。
程序化登录和注销(安全性增强)
在Servlet 3中,接口
HttpServletRequest已添加了两个新方法:
login(username,password)和
logout()。
有关更多详细信息,请参阅Java EE 6 API。



