我正在推出符合Servlet 2.5的J2EE代码,我想知道2.5和3之间的主要区别是什么。非常感谢官方Sun文档和个人体验的指针。
如果我不应该暂时关注自己3,那就这么说吧。谢谢!
答案 0 :(得分:140)
更新
就像更新和更明确一样,这些是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 { ... }
在servlet 3中,ServletContextListener
可以使用添加到SevletContext
addServlet()
,addFilter()
和addListener()
的以下方法添加动态servlet,过滤器和侦听器
示例:假设某个servlet容器的线程池中有五个线程,并且每个请求都需要执行一个耗时的过程(如复杂的SQL查询)。
使用servlet 2.5,如果同时收到五个请求并且五个可用线程开始执行该过程,则此servlet容器将耗尽可用线程,因为线程在service()
之前不会返回(或doGet()
,doPost()
等)从头到尾执行并返回一个回复。
使用servlet 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
还有获取请求对象,响应对象和添加侦听器的方法,以便在进程完成时通知它们。
在servlet 3中,界面HttpServletRequest
添加了两个新方法:login(username, password)
和logout()
。
有关详细信息,请查看Java EE 6 API。
答案 1 :(得分:21)
Servlet 3.0尚未发布,但它看起来非常接近。 3.0中最重要的变化是:可插拔性,易于开发,异步Servlet,安全性。我不可能说这些对你来说是否重要。
其中最重要的可能是对异步Servlet的支持。这里的an article详细描述了这一点。完整规范可以下载here。
答案 2 :(得分:13)
正如唐所提到的,改进和增加的主要领域是:
有关详细信息,请查看Javaone 2008演示文稿“Java Servlet 3.0 API: What's new and exciting”。
答案 3 :(得分:1)
This link will give enough info on Servlet 3
Servlet 3支持注释以消除import xml.dom.minidom as minidom
xml = """
<root>
<a />
<b />
<a />
</root>
"""
doc = minidom.parseString(xml) # or minidom.parse(filename)
root = doc.getElementsByTagName('root')[0] # or doc.documentElement
items = [n for n in root.childNodes if n.nodeType == doc.ELEMENT_NODE]
for item in items:
print item.nodeName
web.xml