Answers:
更新
正如更新并更明确地说明的那样,这些是Servlet 2.5和3之间的主要区别(我并不想穷尽所有,我只是在提到最有趣的部分):
在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>
使用注释也是如此:
@WebServletContextListener
public class MyAwesomeListener implements ServletContextListener { ... }
在小服务程序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
// processing
public 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 code:
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。
@ServletFilter
→ @WebFilter
和@WebServletContextListener
→ @WebListener
在官方规格AFAICT中。
Servlet 3.0尚未发布,但看起来非常接近。3.0中最重要的更改包括:可插入性,易于开发,异步Servlet,安全性。这些对您是否重要,我无法说。
正如Don所提到的,主要的改进和补充领域是:
有关详细信息,请查看Javaone 2008演示文稿“ Java Servlet 3.0 API:新增功能和令人兴奋的内容 ”。
Servlet 3支持注释以消除 web.xml
@WebServlet
@WebServletContextListener
@ServletFilter
@InitParam