首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Servlet2.5和Servlet3之间有什么区别?

Servlet2.5和Servlet3之间有什么区别?
EN

Stack Overflow用户
提问于 2009-10-29 01:39:24
回答 4查看 62.9K关注 0票数 92

我正在运行遵循Servlet2.5的J2EE代码,我想知道2.5和3之间的主要区别是什么。非常感谢指向Sun官方文档和个人经验的指针。

如果我暂时不关心3,那就直说吧。谢谢!

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-08-12 20:46:41

更新

作为更新,更明确地说,这些是Servlet2.5和Servlet3之间的主要区别(我不是想要详尽无遗,我只是提到最有趣的部分):

用于声明servlet、过滤器和侦听器的注释(易于开发)

在Servlet2.5中,要使用一个初始化参数声明servlet,需要将以下代码添加到web.xml

代码语言:javascript
复制
<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>

在Servlet3中,web.xml是可选的,您可以使用注释代替XML。同样的例子:

代码语言:javascript
复制
@WebServlet(name="myServlet",
    urlPatterns={"/path/to/my/servlet"},
    initParams={@InitParam(name="configFile", value="config.xml")})
public class MyAwesomeServlet extends HttpServlet { ... }

对于过滤器,您需要在Servlet2.5的web.xml中添加以下内容:

代码语言:javascript
复制
<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中使用注释的等价物:

代码语言:javascript
复制
@ServletFilter(name="myFilter", urlPatterns={"/path/to/my/filter"})
public class MyAwesomeFilter implements Filter { ... }

对于监听器(在本例中是ServletContextListener),在Servlet2.5中:

代码语言:javascript
复制
<listener>
    <listener-class>my.server.side.stuff.MyAwesomeListener</listener-class>
</listener>

使用注解也是如此:

代码语言:javascript
复制
@WebServletContextListener
public class MyAwesomeListener implements ServletContextListener { ... }

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

  • 在servlets 2.5中,只有一个完整的web.xml文件。
  • 在servlets 3中,每个“可加载”的jar都可以在其META-INF目录中具有一个指定servlets、筛选器等的web-fragment.xml。这是为了允许库和框架指定它们自己的servlets或其他对象。

在上下文初始化时动态注册servlet、过滤器和侦听器(可推导性)

在Servlet3中,ServletContextListener可以使用添加到SevletContext中的以下方法动态添加servlets、过滤器和侦听器:addServlet()addFilter()addListener()

异步支持

例如:假设某个servlet容器的线程池中有5个线程,每个请求都要执行一个耗时的进程(就像一个复杂的SQL查询)。

Servlet2.5的

  • 如果同时收到5个请求,并且5个可用线程开始执行该过程,则servlet容器将耗尽可用线程,因为线程直到service() (或doGet()doPost()等)才会返回。从头到尾执行并返回一个response.
  • With Servlet3.0,这个长时间的进程可以委托给另一个线程,并在发送响应之前完成service() (响应现在将由最新的线程发送)。这样线程就可以自由地接收新的响应。

异步支持的一个示例:

Servlet 2.5:

代码语言:javascript
复制
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:

代码语言:javascript
复制
@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还具有获取请求对象、响应对象和添加侦听器以在流程完成时通知它们的方法。

程序化登录和注销(安全性增强)

在Servlet3中,接口HttpServletRequest添加了两个新方法:login(username, password)logout()

有关更多详细信息,请查看Java EE 6 API

票数 150
EN

Stack Overflow用户

发布于 2009-10-29 02:28:52

Servlet 3.0还没有发布,但看起来已经非常接近了。3.0中最重要的变化是:可移植性、易开发性、异步Servlet、安全性。这些对你来说是否重要,我不可能说。

其中最重要的可能是对异步Servlets的支持。下面是详细描述这一点的an article。完整的规范可以从here下载。

票数 21
EN

Stack Overflow用户

发布于 2009-10-29 03:35:45

正如Don提到的,改进和添加的主要领域是:

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

  • 易于开发(批注、泛型、基于configuration)

  • Async servlet的约定支持(用于comet风格编程、异步web代理、异步web services)

  • Security增强功能(编程式login/logout)

  • Others ( EJB、会话跟踪、WAR文件中的

  • ))

有关详细信息,请查看JavaOne2008演示文稿"Java Servlet 3.0 API: What's new and exciting“。

票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1638865

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档