Java servlet是如何工作的?实例化、会话、共享变量和多线程

Java servlet是如何工作的?实例化、会话、共享变量和多线程,java,multithreading,servlets,session-variables,instance-variables,Java,Multithreading,Servlets,Session Variables,Instance Variables,假设我有一个Web服务器,其中包含许多servlet。对于在这些servlet之间传递的信息,我正在设置会话和实例变量 现在,如果两个或更多用户向该服务器发送请求,那么会话变量会发生什么变化? 它们对所有用户都是通用的还是对每个用户都是不同的? 如果它们不同,那么服务器如何区分不同的用户 还有一个类似的问题,如果有n用户访问一个特定的servlet,那么这个servlet只会在第一个用户第一次访问它时被实例化,还是会分别为所有用户实例化? 换句话说,实例变量会发生什么变化?Java servle

假设我有一个Web服务器,其中包含许多servlet。对于在这些servlet之间传递的信息,我正在设置会话和实例变量

现在,如果两个或更多用户向该服务器发送请求,那么会话变量会发生什么变化?
它们对所有用户都是通用的还是对每个用户都是不同的?
如果它们不同,那么服务器如何区分不同的用户

还有一个类似的问题,如果有
n
用户访问一个特定的servlet,那么这个servlet只会在第一个用户第一次访问它时被实例化,还是会分别为所有用户实例化?

换句话说,实例变量会发生什么变化?

Java servlet中的会话与PHP等其他语言中的会话相同。它是用户独有的。服务器可以通过不同的方式跟踪它,如cookies、url重写等。本文将在Javaservlet的上下文中对此进行解释,并指出会话的具体维护方式是留给服务器设计者的一个实现细节。该规范仅规定,它必须在与服务器的多个连接中保持为用户独有。查看这两个问题的更多信息


编辑有一个关于如何在servlet内部使用会话的优秀教程。Sun的一章介绍了Java servlet,它们是什么以及如何使用它们。在这两篇文章之间,你应该能够回答你所有的问题

会话——克里斯·汤普森说的话

实例化-当容器收到映射到servlet的第一个请求时,servlet被实例化(除非servlet配置为在启动时使用
web.xml
中的
元素加载)。同一实例用于服务后续请求。

ServletContext
当servlet容器(like)启动时,它将部署并加载其所有web应用程序。加载web应用程序时,servlet容器创建一次并将其保存在服务器内存中。解析web应用程序的
web.xml
和所有包含的
web fragment.xml
文件,并找到每个
(或分别用
@WebServlet
@WebFilter
@WebListener
注释的每个类)被实例化一次并保存在服务器的内存中。对于每个实例化的筛选器,其
init()
方法将使用新的

Servlet
@WebServlet(loadOnStartup)
值大于
0
时,其
init()
方法也会在启动时使用新的。这些servlet按照该值指定的相同顺序初始化(
1
为第一,
2
为第二,以此类推)。如果为多个servlet指定了相同的值,则这些servlet的加载顺序与它们在
web.xml
web fragment.xml
@WebServlet
类加载中出现的顺序相同。在缺少“启动时加载”值的情况下,只要HTTP请求第一次命中该servlet,就会调用
init()
方法


当servlet容器完成上述所有初始化步骤后,将调用


当servlet容器关闭时,它卸载所有web应用程序,调用其所有初始化servlet和筛选器的
destroy()
方法,所有
ServletContext
servlet
筛选器
Listener
实例都被破坏。最后,将调用

HttpServletRequest和HttpServletResponse servlet容器连接到web服务器,该服务器侦听特定端口号上的HTTP请求(端口8080通常在开发期间使用,端口80通常在生产中使用)。当客户端(例如,使用web浏览器的用户或)发送HTTP请求时,servlet容器将创建新的和对象,并将它们传递给链中任何定义的
过滤器
,最终传递给
servlet
实例

在的情况下,将调用
doFilter()
方法。当servlet容器的代码调用
chain.doFilter(request,response)
时,请求和响应将继续到下一个过滤器,如果没有剩余的过滤器,则点击servlet

在的情况下,调用
service()
方法。默认情况下,此方法根据
request.getMethod()
确定要调用的
doXxx()
方法之一。如果servlet中缺少确定的方法,则在响应中返回HTTP 405错误

request对象提供对HTTP请求的所有信息的访问,例如其URL、头、查询字符串和正文。响应对象提供了控制和发送HTTP响应的能力,例如,允许您设置标题和正文(通常使用JSP文件生成的HTML内容)。当HTTP响应提交并完成时,请求和响应对象都将被回收并可重用

会话 当客户端第一次访问webapp和/或第一次通过
请求.getSession()
获取时,servlet容器创建一个新的
HttpSession
对象,生成一个长且唯一的ID(可以通过
会话.getId()
获取),并将其存储在服务器内存中。servlet容器还在HTTP响应的
Set Cookie
头中设置一个,将
JSESSIONID
作为其名称,将唯一会话ID作为其值

根据(a)合同,任何像样的网络浏览器和我们
public class ExampleServlet 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.
    } 
}
public Synchronized class service(ServletRequest request,ServletResponse response)throws ServletException,IOException
Synchronized(Object)

{

----Instructions-----

}