Servlet 2.5和3之间有什么区别?

Max*_* A. 89 java servlets java-ee

我正在推出符合Servlet 2.5的J2EE代码,我想知道2.5和3之间的主要区别是什么.官方Sun文档和个人经历的指针非常受欢迎.

如果我不应该暂时关注自己3,那就这么说吧.谢谢!

mor*_*ano 145

UPDATE

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

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

在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>
Run Code Online (Sandbox Code Playgroud)

在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 { ... }
Run Code Online (Sandbox Code Playgroud)

对于过滤器,您需要在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>
Run Code Online (Sandbox Code Playgroud)

使用servlet 3中的注释等效:

@ServletFilter(name="myFilter", urlPatterns={"/path/to/my/filter"})
public class MyAwesomeFilter implements Filter { ... }
Run Code Online (Sandbox Code Playgroud)

对于监听器(在本例中为ServletContextListener),在servlet 2.5中:

<listener>
    <listener-class>my.server.side.stuff.MyAwesomeListener</listener-class>
</listener>
Run Code Online (Sandbox Code Playgroud)

使用注释相同:

@WebServletContextListener
public class MyAwesomeListener implements ServletContextListener { ... }
Run Code Online (Sandbox Code Playgroud)

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

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

在上下文初始化时动态注册servlet,过滤器和监听器(Pluggability)

在小服务程序3中,ServletContextListener可以添加动态的servlets,加入到过滤器,并使用以下方法听众SevletContext:addServlet(),addFilter()addListener()

异步支持

示例:假设某个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

        // ...
    }

}
Run Code Online (Sandbox Code Playgroud)

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.

        // ...

    }

}
Run Code Online (Sandbox Code Playgroud)

该接口AsyncContext还具有获取请求对象,响应对象和添加侦听器的方法,以便在进程完成时通知它们.

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

在servlet 3中,界面HttpServletRequest添加了两个新方法:login(username, password)logout().

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

  • 值得一提的是,Servlet 3.0于2009年12月发布.问题和当前接受的答案答案早于那些. (3认同)

Dón*_*nal 21

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

其中最重要的可能是对异步Servlet的支持.这是一篇详细描述这一内容的文章.完整的规格可以在这里下载.

  • **更新**[Servlet 3.1规范](https://jcp.org/en/jsr/detail?id=340)1313-05发布.请参阅[新内容](https://blogs.oracle.com/arungupta/entry/what_s_new_in_servlet). (4认同)

Pas*_*ent 13

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

  • 可插拔性(web.xml的模块化)
  • 易于开发(注释,泛型,约定优于配置)
  • 异步servlet支持(用于彗星样式编程,异步Web代理,异步Web服务)
  • 安全性增强(程序化登录/注销)
  • 其他(HttpOnly Cookie,会话跟踪,WAR文件中的EJB)

有关详细信息,请查看Javaone 2008演示文稿" Java Servlet 3.0 API:有什么新内容和令人兴奋的内容 ".