欢迎来到天天文库
浏览记录
ID:30777322
大小:54.50 KB
页数:4页
时间:2019-01-03
《javaservlet工作原理问答-java开发java经验技巧》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、JavaServletI*作原理问答-编程开发技术JavaServlet工作原理问答木文由ImportNew・honoka翻译自stackoverflowo欢迎加入翻译小组。转载请见文末耍求。导读本文来自stackoverflow的问答,讨论了JavaServlet的工作机制,如何进行实例化、共享变量和多线程处理。问题:Servlet是如何工作的?Servlet如何实例化、共享变量、并进行多线程处理?假设我有一个运行了大量Servlet的web服务器。通过Servlet之间传输信息得到Servlet上下文,并设置session
2、变量。现在,如果有两名或更多使用者向这个服务发送请求,接下來session变量会发生什么变化?究竟是所有用户都是用共同的变量?述是不同的用户使用的变量都不一样?如果是后者,服务器如何区分不同用户?另一个相似的问题,如果有*n*名用户访问一个特定的Servlet,那么该Servlet是仅在第一个用户首次访问的吋候实例化,还是分别为每个用户实例化?回答(BalusC):ServletContext当Servlet容器(比如ApacheTomcat)启动后,会部署和加载所有web应用。当web应用被加载,Servlet容器会创建一次
3、ServletContext,然后将其保存在服务器的内存中。web应用的web.xml被解析,找到其中所有servlet、filter和Listener或@WebServlet>@WebFilter和@WebListener注解的内容,创建一次并保存到服务器的内存中。对于所有过滤器会立即调用initOo当Servlet容器停止,将卸载所有web应用,调用所有初始化的Servlet和过滤器的destroy()方法,最后回收ServletContext和所有Servlet>FiIter与Listener实例。当问题中的Servle
4、t配置的load-on-startup或者QWebServlet(loadOnStartup)设置了一个大于0的值,则同样会在启动的时候立即调用init()方法。"load-on-startup”中的值表示那些Servlet会以相同顺序初始化。如果配置的值相同,会遵循web.xml中指定的顺序或@WebServlet类加载的顺序。另外,如果不设置“load-on-startup”值,init()方法只在第一次HTTP请求命中问题中的Servlet时才被调用。HttpServletRequest与HttpServletRespo
5、nseServlet容器附加在一个web服务上,这个web服务会在某个端口号上监听HTTP请求,在开发环境中这个端口通常为8080,生产环境中通常为80o当客户端(web浏览器)发送了一个HTTP请求,Servlet容器会创建新的HttpServletRequest和HttpServletResponse对象,传递给已创建好并J_L请求的URL匹配url-pattcrn的Filter和Servlet实例中的方法,所有工作都在同一个线程屮处理。request对象可以访问所有该HTTP请求中的信息,例如requestheader和
6、requestbody。response对象为你提供需要的控制和发送HTTP响应方法,例如设置header和body(通常会带有JSP文件中的HTML内容)。提交并完成HTTP响应后,将回收request和response对象。HttpSession当用户笫一次访问该web应用时,会通过request.getSession()笫一次获得HttpSessiorio之后Servlet容器将会创建HttpSession,生成一个唯一的ID(可以通过session.getTd()获取)并储存在服务器内存中。然后Servlet容器在该次
7、IITTP响应的Set-Cookie头部设置一个Cookie,以JSESSIONID作为Cookie名字,那个唯一的sessionID作为Cookie的值。按照HTTPcookie规则(正常web浏览器和web服务端必须遵循的标准),当cookie有效吋,要求客户端(浏览器)在后续请求的Cookie头屮返冋这个cookie。使用浏览器内置的HTTP流量监控器,你可以查看它们(在Chrome、Fircfox23+、IE9+中按F12,然后杳看Net/Network标签)。Servlet容器将会确定每个进入的HTTP请求的Cook
8、ie头屮是否存在名为JSESSIONID的cookie,然后用它的值(sessionID)从服务端内存中找到关联的HttpSession。你可以在web.xml中设置session-timeout,默认值为30分钟。超时到达Z前HttpSession会一宜存活。所以当客户端不
此文档下载收益归作者所有