servlet如何工作?实例化,会话,共享变量和多线程

servlet如何工作?实例化,会话,共享变量和多线程

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

现在,如果有2个或更多用户向此服务器发送请求,那么会话变量会发生什么?它们对所有用户都是通用的,或者对于每个用户而言都是不同的。如果它们不同,那么服务器如何区分不同的用户?

还有一个类似的问题,如果有n用户访问特定的servlet,那么这个servlet只在第一个用户第一次访问它时实例化,或者是否为所有用户单独实例化?换句话说,实例变量会发生什么?


泛舟湖上清波郎朗
浏览 772回答 5
5回答

慕神8447489

Java servlet中的会话与其他语言(如PHP)中的会话相同。它对用户来说是独一无二的。服务器可以用不同的方式跟踪它,例如cookie,url重写等。这篇Java doc文章在Java servlet的上下文中解释它,并指出会话的确切维护是服务器设计者留下的实现细节。规范仅规定必须通过与服务器的多个连接将其维护为对用户唯一。有关这两个问题的详细信息,请查看Oracle的这篇文章。

慕的地6264312

当servlet容器(如Apache Tomcat)启动时,如果出现任何问题或者在容器侧控制台出现错使用web.xml的应用程序(将其命名为部署描述符)。在servlet的实例化阶段,servlet实例已准备就绪,但它无法为客户端请求提供服务,因为它缺少两条信息:1:上下文信息2:初始配置信息Servlet引擎创建servletConfig接口对象,将上面缺少的信息封装到servlet引擎中,通过提供servletConfig对象引用作为参数来调用servlet的init()。一旦init()完全执行,servlet就可以为客户端请求提供服务。Q)在servlet的生命周期中实例化和初始化发生了多少次?A)只有一次(对于每个客户端请求创建一个新线程),只有一个servlet实例服务于任意数量的客户端请求,即在服务一个客户端请求服务器之后不会死亡。它等待其他客户端请求,即使用servlet(内部servlet引擎创建线程)克服了CGI(为每个客户端请求创建新进程)的限制。问)会话概念如何运作?A)每当在HttpServletRequest对象上调用getSession()时步骤1:评估请求对象的传入会话ID。步骤2:如果ID不可用,则创建全新的HttpSession对象并生成其对应的会话ID(即HashTable)会话ID存储到httpservlet响应对象中,并将HttpSession对象的引用返回给servlet(doGet / doPost) 。步骤3:如果未创建ID可用的全新会话对象,则从请求对象中拾取会话ID,通过使用会话ID作为密钥在会话集合中进行搜索。搜索成功后,会话ID将存储到HttpServletResponse中,现有的会话对象引用将返回给UserDefineservlet的doGet()或doPost()。注意:1)当控制从servlet代码离开到客户端时,不要忘记servlet容器正在保存会话对象,即servlet引擎2)多线程留给servlet开发人员实现ie。,处理客户端的多个请求无需担心多线程代码简短形式:在应用程序启动时(它部署在servlet容器上)或首次访问时(取决于启动时加载设置),在实例化servlet时创建servlet,调用servlet的init()方法然后servlet(它的唯一实例)处理所有请求(由多个线程调用其service()方法)。这就是为什么不建议在其中进行任何同步,并且在取消部署应用程序(servlet容器停止)时应该避免servlet的实例变量,调用destroy()方法。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java
MySQL