更新
正如一个更新和更明确,这些是servlet 2.5和3之间的主要区别(我不想穷举,我只是提到最有趣的部分):
声明servlet,过滤器和监听器的注释(易于开发)
在servlets 2.5中,要声明具有一个init参数的servlet,您需要将其添加到web.xml:
myServlet
my.server.side.stuff.MyAwesomeServlet
configFile
config.xml
myServlet
/path/to/my/servlet
在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中添加:
myFilter
my.server.side.stuff.MyAwesomeServlet
myFilter
/path/to/my/filter
在servlet中使用注释的等效方式3:
@ServletFilter(name="myFilter", urlPatterns={"/path/to/my/filter"})
public class MyAwesomeFilter implements Filter { ... }
对于侦听器(在本例中为ServletContextListener),在servlet 2.5:
my.server.side.stuff.MyAwesomeListener
同样使用注释:
@WebServletContextListener
public class MyAwesomeListener implements ServletContextListener { ... }
web.xml的模块化(可插入性)
>在servlets 2.5中只有一个整体web.xml文件。
>在servlet 3中,每个“可加载”jar在其META-INF目录中都有一个web-fragment.xml,指定servlet,过滤器等。这是为了允许库和框架指定自己的servlet或其他对象。
在上下文初始化时动态注册servlet,过滤器和侦听器(可插入性)
在Servlet 3中,ServletContextListener可以使用添加到SevletContext的以下方法动态添加servlet,过滤器和侦听器:addServlet(),addFilter()和addListener()
异步支持
示例:假设某个servlet容器在其线程池中有五个线程,并且每个请求都需要执行一个耗时的进程(如复杂的SQL查询)。
>使用servlet 2.5,如果servlet容器同时接收到五个请求,并且五个可用线程开始执行该进程,则此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()。