我正在编写遵循Servlet 2.5的J2EE代码,想知道2.5和3之间的主要区别。最好提供官方Sun文档和个人经验。
如果我暂时不需要关注3,请告诉我。谢谢!
我正在编写遵循Servlet 2.5的J2EE代码,想知道2.5和3之间的主要区别。最好提供官方Sun文档和个人经验。
如果我暂时不需要关注3,请告诉我。谢谢!
更新
为了更明确地说明,以下是servlet 2.5和3之间的主要区别(我不是在详尽阐述,只是提到最有趣的部分):
在servlet 2.5中,如果要声明一个具有一个初始化参数的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>
在Servlets 3中,web.xml是可选的,您可以使用注释替代XML。相同的示例:@WebServlet(name="myServlet",
urlPatterns={"/path/to/my/servlet"},
initParams={@InitParam(name="configFile", value="config.xml")})
public class MyAwesomeServlet extends HttpServlet { ... }
过滤器需要在servlets 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>
使用Servlets 3中的注释实现相同效果:
@ServletFilter(name="myFilter", urlPatterns={"/path/to/my/filter"})
public class MyAwesomeFilter implements Filter { ... }
在 Servlet 2.5 中,对于一个监听器(在本例中是 ServletContextListener):
<listener>
<listener-class>my.server.side.stuff.MyAwesomeListener</listener-class>
</listener>
使用注释的方式:
@WebServletContextListener
public class MyAwesomeListener implements ServletContextListener { ... }
在Servlets 3中,ServletContextListener可以使用添加到SevletContext的以下方法动态添加servlets、filters和listeners:addServlet()、addFilter()和addListener()
例如:假设某个servlet容器具有五个线程池中的线程,并且需要执行每个请求的耗时进程(如复杂的SQL查询)。
对于Servlets 2.5,如果同时接收到五个请求并且五个可用线程开始处理进程,该servlet容器将耗尽可用线程,因为线程将一直等待直到service()(或doGet()、doPost()等)从头到尾执行并返回响应。
对于Servlets 3.0,这个长时间的进程可以被委托给另一个线程,在发送响应之前完成service()(现在最新的线程将发送响应)。这样,该线程就可以空闲地接收新的响应。
异步支持的示例:
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
还有获取请求对象、响应对象和添加监听器以在进程结束时通知它们的方法。
在servlets 3中,接口 HttpServletRequest
新增了两个方法:login(username, password)
和 logout()
。
更多细节请参考Java EE 6 API。
@ServletFilter
被翻译为 @WebFilter
,而 @WebServletContextListener
则被翻译为 @WebListener
。 - lapo正如Don所提到的,改进和添加的主要领域包括:
请查看Javaone 2008演示文稿 "Java Servlet 3.0 API: 有什么新特性和激动人心的地方"以获取详细信息。
Servlet 3 支持注解以消除 web.xml
@WebServlet
@WebServletContextListener
@ServletFilter
@InitParam