Servlet可以使用setAttribute("name","value")来设置共享变量的名称和变量的值。其他Servlet可以通过调用getAttribute("name")来获取name所对应的value,而且返回的是Object类型。
request session servletcontext的作用域如下代码得出:
TestScopeServlet页面
//request请求,请求结束作用域结束
request.setAttribute("request_name","request_value");
//session会话
HttpSession session = request.getSession();
session.setAttribute("session_name", "session_value");
//servlet全局,所有用户共享
ServletContext cxt =this.getServletContext();
cxt.setAttribute("servletcontext_name", "servletcontext_value");
request.getRequestDispatcher("/servlet/ResultServlet").forward(request, response);//使用request请求转发功能,本页面不可以flush
ResultServelt页面
String request_value = (String)request.getAttribute("request_name");
HttpSession session = request.getSession();
String session_value = (String)session.getAttribute("session_name");
ServletContext cxt = this.getServletContext();
String servletcontext_value = (String)cxt.getAttribute("servletcontext_name");
PrintWriter pw = response.getWriter();
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out
.println("<!DOCTYPE HTML PUBLIC /"-//W3C//DTD HTML 4.01 Transitional//EN/">");
out.println("<HTML>");
out.println(" <HEAD><TITLE>A Servlet</TITLE></HEAD>");
out.println(" <BODY>");
out.println(request_value);
out.println(session_value);
out.println(servletcontext_value);
out.println(" </BODY>");
out.println("</HTML>");
out.flush();
out.close();
通过实验所得结果:
调用servlet/TestScope页面则直接跳转到ResultServlet页面 并且request,session,servletcontext共享变量都在后者显示出来。
而直接调用ResultServlet 结果为:null session_value servletcontext_value。得出结论request的作用域是针对请求的,请求结束共享变量作用域则结束。
而新开一个IE再进入ResultServlet结果为:null null servletcontext_value。得出结论session是针对浏览器的,servletcontext是作用于全部对象的全局共享变量。
得出结果 作用域大小由小到大依次为 request<session<servletcontext即请求作用域小于同一浏览器作用域小于全局作用域.实际上最小的作用域是page。
jsp原理同理
可以新建test.jsp页面
在body中编写
${requestScope.request_name}
${sessionScope.session_name}
${Application.servletcontext_name}
与之相对应
比如统计在线人数可以使用全局作用域
比如上网帐号或银行帐号密码放到session
请求里放一个共享变量则放到request里