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