当前位置: 首页 > 面试题库 >

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

慕宏博
2023-03-14
问题内容

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

如果我暂时不考虑自己与3相关,那就这么说。谢谢!


问题答案:

更新

正如更新并更明确地说明的那样,这些是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>

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

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

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

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

在小服务程序3中,ServletContextListener可以动态地添加加入到小服务程序,过滤器和使用以下方法听众SevletContextaddServlet()addFilter()addListener()

异步支持

示例:假设某个Servlet容器的线程池中有五个线程,并且每个请求都要执行一个耗时的html" target="_blank">过程(例如复杂的SQL查询)。

  • 使用Servlet 2.5这个servlet容器将耗尽可用线程,如果它收到与此同时五个请求和五个可用线程开始做的过程中,因为线程不会返回,直到service()(或者doGet()doPost()等)从开始执行结束并返回响应。

  • 使用Servlet 3.0,可以将此长时间过程委派给另一个线程并service()在发送响应之前完成(现在,响应将由最新线程发送)。这样,线程可以自由接收新的响应。

异步支持的示例:

Servlet 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

        // ...
    }

}

Servlet 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。我推断这是因为Python将计算为。为了解决这个问题,我发现可以使用,问题解决了。 但我找到了另一个解决方案,即(为了进行比较,我包含了前面的示例): 我无法解释为什么包括0有帮助。我已经阅读了关于“组织”的文件,但我在那里没有找到任何帮助。我以为可能是因为评审顺序的原因: null

  • 问题内容: 在此示例中: 无法编译为: 而被编译器接受。 这个答案说明唯一的区别是,与不同,它允许您稍后引用类型,似乎并非如此。 是什么区别,并在这种情况下,为什么不第一编译? 问题答案: 通过使用以下签名定义方法: 并像这样调用它: 在jls§8.1.2中,我们发现(有趣的部分被我加粗了): 通用类声明定义了一组参数化类型(第4.5节), 每种可能通过类型arguments调用类型参数节的类型

  • 问题内容: 今天,我按照一些说明在Linux中安装软件。有一个脚本需要首先运行。它设置一些环境变量。 指令告诉我要执行,但是我执行错误了。因此未设置环境。最后,我注意到了这一点并继续进行。 我想知道这两种调用脚本方法的区别。我对Linux完全陌生,所以请尽可能详细。 问题答案: 运行脚本,将启动一个新的运行脚本的外壳。新的外壳程序不会影响启动脚本的父外壳程序。 是的简写形式,它将在当前shell中

  • 问题内容: 我刚开始使用Spring。我遇到了很多教程。我看到使用更多的例子比。我查看了Spring文档,但无法弄清楚使用其中一个的好处。有人可以提供一些解释吗? 问题答案: 是的便捷子类。 JavaDoc描述了一些添加的属性,这些属性在某些情况下可能有用: UrlBasedViewResolver的便利子类,它支持InternalResourceView(即Servlet和JSP)以及诸如Jst

  • 问题内容: 我刚刚看到了包含标签的CSS代码。我看着MDN看看是什么,但我真的不明白。 有人可以解释它是如何工作的吗? 它会在我们通过CSS选择之前创建DOM元素吗? 问题答案: 根据这些文档,它们是等效的: 唯一的区别是CSS3中使用了双冒号,而单冒号是旧版本。 推理: CSS 3中引入了:: before表示法,以便在伪类和伪元素之间建立区别。浏览器还接受:在CSS 2中引入的表示法。

  • 问题内容: 以下哪个更好? 要么 我知道的唯一区别是,当“ a”为null时,第一个返回false,而第二个抛出异常。除此之外,它们是否总是给出相同的结果? 问题答案: 使用时,你需要B在编译时知道类。使用时可以是动态的,并且可以在运行时更改。