Servlet 2.5和3有什么区别?

我正在滚动遵循Servlet 2.5的J2EE代码,我想知道2.5和3之间的主要区别是什么。指向官方Sun文档和个人经验的指针是最受赞赏的。

如果我暂时不应该对自己说3,那就这样说吧。 谢谢!

UPDATE

就像更新和更加明确一样,这些是servlet 2.5和3之间的主要区别(我并不想穷尽,我只是提到最有趣的部分):

声明servlet,filter和监听器的注释(易于开发)

在servlets 2.5中,要声明一个servlet有一个init参数,你需要把它添加到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 { ... } 

对于filter,您需要在servlet 2.5的web.xml中添加这个filter:

 <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),在servlets 2.5中:

 <listener> <listener-class>my.server.side.stuff.MyAwesomeListener</listener-class> </listener> 

相同的使用注释:

 @WebServletContextListener public class MyAwesomeListener implements ServletContextListener { ... } 

web.xml的模块化(可插拔性)

  • 在servlet 2.5中,只有一个单一的web.xml文件。
  • 在servlet 3中,每个“可加载的”jar在其META-INF目录中都可以有一个web-fragment.xml文件,用于指定servlet,filter等。这允许库和框架指定自己的servlet或其他对象。

上下文初始化时的servlet,filter和监听器的dynamic注册(可插入性)

在Servlet 3中, ServletContextListener可以使用添加到SevletContext的以下方法dynamic添加servlet,filter和侦听器: addServlet()addFilter()addListener()

asynchronous支持

例如:说一些servlet容器在其线程池中有五个线程,并且每个请求执行一个耗时的过程(如复杂的SQL查询)。

  • 使用servlet 2.5这个servlet容器如果同时收到五个请求,并且五个可用的线程开始执行这个过程,那么这个servlet容器就会耗尽可用的线程,因为线程不会返回到service() (或者doGet()doPost()等)从开始到结束执行并返回响应。

  • 使用servlet 3.0,这个长时间的进程可以委托给另一个线程,并在发送响应之前完成service() (响应现在将由最新的线程发送)。 这样线程可以自由地接收新的响应。

asynchronous支持的一个例子:

Servlets 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 // ... } } 

Servlets 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也有方法来获取请求对象,响应对象和添加侦听器,以在进程完成时通知它们。

程序化login和注销(安全增强)

在servlet 3中,接口HttpServletRequest已经添加了两个新的方法: login(username, password)logout()

有关更多详细信息,请参阅Java EE 6 API 。

Servlet 3.0尚未发布,但看起来非常接近。 3.0中最重要的变化是:可插拔性,易于开发,asynchronousServlet,安全性。 这些对你来说是否重要是不可能的。

其中最重要的可能是对asynchronousServlet的支持。 这里有一篇文章详细描述了这一点。 完整的规格可以在这里下载。

正如唐所言,改进和增加的主要领域是:

  • 可插拔性(web.xml的模块化)
  • 易于开发(注释,generics,约定configuration)
  • asynchronousservlet支持(彗星风格编程,asynchronousWeb代理,asynchronousWeb服务)
  • 安全性增强(程序化login/注销)
  • 其他(HttpOnly Cookie,会话跟踪,WAR文件中的EJB)

有关详细信息,请参阅Javaone 2008演示文稿“ Java Servlet 3.0 API:什么是新的和令人兴奋的 ”。

此链接将提供有关Servlet 3的足够信息

Servlet 3支持注释以消除web.xml

 @WebServlet @WebServletContextListener @ServletFilter @InitParam