先给出结论(取自狂神的javaweb)
pageContext.setAttribute("name1","秦疆1号"); //保存的数据只在一个页面中有效
request.setAttribute("name2","秦疆2号"); //保存的数据只在一次请求中有效,请求转发会携带这个数据
session.setAttribute("name3","秦疆3号"); //保存的数据只在一次会话中有效,从打开浏览器到关闭浏览器
application.setAttribute("name4","秦疆4号"); //保存的数据只在服务器中有效,从打开服务器到关闭服务器
request:客户端向服务器发送请求,产生的数据,用户看完就没用了,比如:新闻,用户看完没用的!
session:客户端向服务器发送请求,产生的数据,用户用完一会还有用,比如:购物车;
application:客户端向服务器发送请求,产生的数据,一个用户用完了,其他用户还可能使用,比如:聊天数据;
编写一个PageContextDemo01.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
Title
<%--内置对象--%>
<% pageContext.setAttribute("name1","donric1");
request.setAttribute("name2","donric2");
session.setAttribute("name3","donric3");
application.setAttribute("name4","donric4");
%>
<% String name1 = (String) pageContext.findAttribute("name1");
String name2 = (String) pageContext.findAttribute("name2");
String name3 = (String) pageContext.findAttribute("name3");
String name4 = (String) pageContext.findAttribute("name4");
String name5 = (String) pageContext.findAttribute("name5");
%>
<%--使用EL表达式输出--%>
${name1}
${name2}
${name3}
${name4}
${name5}
<%=name5%>
启动tomact,在地址栏输入完整文件地址
结果:
原因:name5是不存在的,所以内有取出来,但是其他几个都顺利取出,那就是在当前页面对这几个容器进行存数据操作之后,都可以在当前页面进行取数据操作。
补充:这里的EL表达式也可以换成<%=name5%>这个样子来输出数据,但是有一个区别,就是使用EL表达式的话,那么如果没找到数据就什么都不输出,而<%=name5%>没找到数据的话就会输出一个null。
再编写一个PageDemo02.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
Title
<% String name1 = (String) pageContext.findAttribute("name1");
String name2 = (String) pageContext.findAttribute("name2");
String name3 = (String) pageContext.findAttribute("name3");
String name4 = (String) pageContext.findAttribute("name4");
String name5 = (String) pageContext.findAttribute("name5");
%>
<%--使用EL表达式输出--%>
${name1}
${name2}
${name3}
${name4}
${name5}
然后我们再启动tomcat,然后先访问一下之前那个PageContextDemo01.jsp,之后再访问一下,PageDemo02.jsp
结果:
只出现了两个,让我们看一下是对应的哪两个。是 session和application,也就是说明这两个时可以跨页面存储数据的
这个想法就是直接在PageContextDemo01.jsp上请求转发到PageDemo02.jsp
做法就是在PageContextDemo01.jsp加上一行代码
<%pageContext.forward("/PageDemo02.jsp");%>
,然后启动tomcat,然后访问PageContextDemo01.jsp,然后请求就会转发到PageDemo02.jsp
结果:
这些是request、session、application容器所存入的值。
通过上面的实例也可以看出
PageContext在当前页面存值,那么也就只能在当前页面取值,转到别的页面就会被清除数据,就不可以取出值。
request可以通过请求转发到其他页面,那么也就是可以在当前页面存值,请求转发到的页面也就保存了request存的这些数据,没有被请求转发的页面就会被清除数据。
text在当前页面存值,那么也就只能在当前页面取值,转到别的页面就会被清除数据,就不可以取出值。
request可以通过请求转发到其他页面,那么也就是可以在当前页面存值,请求转发到的页面也就保存了request存的这些数据,没有被请求转发的页面就会被清除数据。
session和application都可以在当前页面存值,然后再其他页面进行取值,而session会随着浏览器关闭而被清除数据,而application会随着服务器的关闭而被清除数据。