gpt4 book ai didi

java - servlet中每个servlet实例和servlet每个线程的区别?

转载 作者:IT老高 更新时间:2023-10-28 11:39:46 25 4
gpt4 key购买 nike

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()根据 HttpServletRequest#getMethod() 轮流决定调用 doGet()doPost() 等中的哪一个。 .

你看,servletcontainer 为每个请求重用相同的 servlet 实例。换句话说:servlet 在每个请求 之间共享。这就是为什么以线程安全的方式编写 servlet 代码非常重要——这实际上很简单:只需将请求或 session 范围的数据分配为 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.
}
}

关于java - servlet中每个servlet实例和servlet每个线程的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2183974/

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