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

servlet的每个实例与servlet中的servlet的每个线程之间的区别?

蓬森
2023-03-14
问题内容

servlet类有多个实例吗?当我听到“每个servlet实例”时,有人可以详细说明吗?


问题答案:

Servlet容器启动时,它:

  1. web.xml;
  2. 在类路径中找到已声明的Servlet;和
  3. 加载和实例化每个Servlet一次。
    大概是这样的:
String urlPattern = parseWebXmlAndRetrieveServletUrlPattern();
String servletClass = parseWebXmlAndRetrieveServletClass();
HttpServlet servlet = (HttpServlet) Class.forName(servletClass).newInstance();
servlet.init();
servlets.put(urlPattern, servlet); // Similar to a map interface.

这些Servlet都存储在内存中,并且每次请求URL与Servlet的关联的匹配时都可以重用url-pattern。然后,Servlet容器执行类似于以下内容的代码:

for (Entry<String, HttpServlet> entry : servlets.entrySet()) {
    String urlPattern = entry.getKey();
    HttpServlet servlet = entry.getValue();
    if (request.getRequestURL().matches(urlPattern)) {
        servlet.service(request, response);
        break;
    }
}

GenericServlet#service()其反过来决定其中doGet()doPost()要调用基础上,等HttpServletRequest#getMethod()

您会看到,servlet容器为每个请求重用了相同的servlet实例。换句话说:servlet在每个request之间共享。这就是为什么它是要编写servlet代码的线程安全的方式,可呈现其实很简单极为重要的:只是做不分配请求或会话范围的数据作为servlet实例变量,但正如方法的局部变量。例如

public class MyServlet extends HttpServlet {

    private Object thisIsNOTThreadSafe;

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        Object thisIsThreadSafe;

        thisIsNOTThreadSafe = request.getParameter("foo"); // BAD!! Shared among all requests!
        thisIsThreadSafe = request.getParameter("foo"); // OK, this is thread safe.
    } 
}


 类似资料:
  • 问题内容: 在我的Maven存储库中的groupId下,我有这两个单独的servlet工件。我很困惑应该使用哪个来构建一个简单的servlet应用程序?这两个工件之间有什么区别? 问题答案: javax.servlet-api版本3.0.1具有注释文件夹,其中包含不同的注释类,其中servlet- api版本2.5或更低版本(即版本2.4)不包含注释。 注释表示元数据。如果使用注释,则不需要部署描

  • 本文向大家介绍Servlet和JSP之间的区别,包括了Servlet和JSP之间的区别的使用技巧和注意事项,需要的朋友参考一下 简而言之,可以将其定义为Servlet是在Web服务器上运行的Java程序,它们充当HTTP客户端发出的请求与HTTP服务器上的数据库或应用程序之间的中间层。而JSP只是一个文本文件,其中包含两种类型的文本:预定义的静态文本和在收到服务器响应后呈现的动态文本。 以下是Ar

  • 问题内容: 您能否解释一下已经在各种servlet实现中实现的两种方法: 每个连接线程 每个请求的线程 以上两种策略中的哪一种可以更好地扩展,为什么? 问题答案: 以上两种策略中的哪一种可以更好地扩展,为什么? 每个请求线程的可伸缩性比每个连接线程的可伸缩性更好。 Java线程非常昂贵,通常每个线程都使用1Mb的内存段,无论它们是活动的还是空闲的。如果为每个连接提供自己的线程,则该线程通常在连接的

  • 本文向大家介绍Servlet和Filter之间的区别与联系,包括了Servlet和Filter之间的区别与联系的使用技巧和注意事项,需要的朋友参考一下 filter是一个可以复用的代码片段,可以用来转换HTTP请求、响应和头信息。Filter不像Servlet,它不能产生一个请求或者响应,它只是修改对某一资源的请求,或者修改从某一的响应。 最近使用插装的时候,改用cookie对计算机进行识别,加入

  • 问题内容: 我正在使用servlet,有两种方法重定向和转发都将请求发送到同一页面,但是它们之间有什么区别。 问题答案: redirect-它使用浏览器重定向。它发送代码为3xx的http响应(请参阅Wikipedia),然后浏览器向新页面发出另一个请求。 forward-Forward是Servlet容器的内部组件。浏览器从不了解页面已更改。因此,URL不会更改(例如重定向),并且在新页面中您也

  • 问题内容: 到现在为止,因为它适用于服务的HTTP请求,我想条款- 和意味着同样的事情。但是显然,它们分别在Servlet 3.0和3.1中分别实现。我正在努力了解这里的区别… 请问有人可以进一步阐明这个话题吗?具体来说,我正在寻找一个示例,该示例说明服务器的Servlet 3.0实现如何异步而又在线程上阻塞?我想可能是,如果我理解了这一点,可能更容易理解Servlet 3.1中的非阻塞I / O