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

2022-08-31 10:51:32

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

如果我暂时不应该关心3,那就这么说吧。谢谢!


答案 1

更新

作为一个更新,更明确地说,这些是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>

在 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 { ... }

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

<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 { ... }

卷筒纸.xml模块化(可插拔性)

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

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

在 servlet 3 中,可以使用以下添加到 以下方法动态添加 servlet、过滤器和侦听器:ServletContextListenerSevletContextaddServlet()addFilter()addListener()

异步支持

示例:假设某个 servlet 容器的线程池中有五个线程,并且每个请求需要执行一个耗时的过程(如复杂的 SQL 查询)。

  • 对于 servlet 2.5,如果这个 servlet 容器同时收到五个请求并且五个可用线程开始执行该进程,则该 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

        // ...
    }

}

服务 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 中,添加了两个新方法:和 。HttpServletRequestlogin(username, password)logout()

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


答案 2

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

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


推荐