gpt4 book ai didi

java - Servlet 2.5 和 3 有什么区别?

转载 作者:IT老高 更新时间:2023-10-28 11:34:44 27 4
gpt4 key购买 nike

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

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

最佳答案

更新

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

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

在 servlets 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 的模块化(可插拔性)

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

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

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

异步支持

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

  • 对于 servlets 2.5,如果这个 servlet 容器同时接收到五个请求并且五个可用线程开始执行该进程,则该 servlet 容器将耗尽可用线程,因为线程不会返回,直到 service( )(或doGet()doPost()等)从头到尾执行并返回响应。

  • 使用servlets 3.0,这个长时间的进程可以委托(delegate)给另一个线程并在发送响应之前完成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

// ...
}

}

小服务程序 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.

// ...

}

}

接口(interface)AsyncContext也有获取request对象、response对象和添加监听器的方法,以便在进程完成时通知它们。

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

在 servlet 3 中,接口(interface) HttpServletRequest 增加了两个新方法:login(username, password)logout()

更多详情,请查看Java EE 6 API .

关于java - Servlet 2.5 和 3 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1638865/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com