session:在当前会话中有效,即从浏览器访问做事器开始,这个指的是用户的一个访问过程,即这次会话的开始到结束
request:在当前要求中有效,卖力多个servlet之间的信息共享,即将信息放入到request中,在全体要求阶段都是有效的,即用户访问的这个阶段都可以获取到这个数据
page:在当前页面有效,即在一个jsp页面上是有效的。
首先要声明一点,所谓\公众浸染域\公众便是\公众信息共享的范围\公众,也便是说一个信息能够在多大的范围内有效。
Web交互的最基本单位为HTTP要求。每个用户从进入网站到离开网站这段过程称为一个HTTP会话,一个做事器的运行过程中会有多个用户访问,便是多个HTTP会话。浸染域阐明如下。
application:做事器启动到停滞这段韶光。
session:HTTP会话开始到结束这段韶光。
request:HTTP要求开始到结束这段韶光。
page:当前页面从打开到关闭这段韶光。
1. application 浸染域
application浸染域便是做事器启动到关闭的整段韶光,在这个浸染域内设置的信息可以被所有运用程序利用。application浸染域上的信息通报是通过ServletContext实现的,它供应的紧张方法如下所示:
Object getAttribute(String name):从application中获取信息。
void setAttribute(String name, Object value):向application浸染域中设置信息。
2. session浸染域
session浸染域比较随意马虎理解,同一浏览器对做事器进行多次访问,在这多次访问之间通报信息,便是session浸染域的表示。session是通过HttpSession接口实现的,它供应的紧张方法如下所示。
Object HttpSession.getAttribute(String name):从session中获取信息。
void HttpSession.setAttribute(String name, Object value):向session中保存信息。
HttpSession HttpServletRequest.getSession():获取当前要求所在的session的工具。
session的开始时候比较随意马虎判断,它从浏览器发出第一个HTTP要求即可认为会话开始。但结束时候就不好判断了,由于浏览器关闭时并不会关照做事器,以是只能通过如下这种方法判断:如果一定的韶光内客户端没有反应,则认为会话结束。Tomcat的默认值为120分钟,但这个值也可以通过HttpSession的setMaxInactiveInterval(int interval)方法来设置,如果想主动让会话结束,例如用户单击\公众注销\"大众按钮的时候,可以利用 HttpSession 的 invalidate()方法,用于逼迫结束当前session。
3. request浸染域
一个HTTP要求的处理可能须要多个Servlet互助,而这几个Servlet之间可以通过某种办法通报信息,但这个信息在要求结束后就无效了。
Servlet之间的信息共享是通过HttpServletRequest接口的两个方法来实现的。
void setAttribute(String name, Object value):将工具value以name为名称保存到request浸染域中。
Object getAttribute(String name):从request浸染域中取得指定名字的信息。
JSP中的doGet()、doPost()方法的第一个参数便是HttpServletRequest工具,利用这个工具的 setAttribute()方法即可通报信息。
那么在设置好信息之后,要通过何种办法将信息传给其他的Servlet呢?这就要用到RequestDispatcher接口的forward()方法,通过它将要求转发给其他Servlet。
RequestDispatcher ServletContext.getRequestDispatcher(String path):取得Dispatcher以便转发。path为转发的目的Servlet。
void RequestDispatcher.forward(ServletRequest request, ServletResponse response):将request和response转发。
因此,只须要在当前Servlet中先通过setAttribute()方法设置相应的属性,然后利用forward()方法进行跳转,末了在跳转到的Servlet中通过利用getAttribute()方法即可实现信息通报。
PHP的程序员可能不太好理解这一段,由于PHP中没有转发的观点,一个要求只能由一个PHP文件来处理,以是PHP中根本没有request浸染域的观点。而Servlet则不同,要求可以在运用程序中任意转发,以是用request浸染域在不同Servlet之间通报信息。
把稳两点:
转发不是重定向,转发是在Web运用内部进行的。PHP支持重定向但没有转发。
转发对浏览器是透明的,也便是说,无论在做事器上如何转发,浏览器地址栏中显示的仍旧是最初那个Servlet的地址。重定向的浏览器地址是变革的。
4. page浸染域
page工具的浸染范围仅限于用户要求确当前页面,对付page工具的引用将在相应返回给客户端之后被开释,或者在要求被转发到其他地方后被开释。对page工具的引用常日存储在pageContext工具中。
以上先容的浸染范围越来越小,request和page的生命周期都是短暂的,它们之间的差异:一个request可以包含多个page页(include,forward及filter)。