写在前面,这一篇是讲jsp的,非常基础,如果你看到了肯定和我一样也是新手。所以顺便建议看一下下面这个链接:
https://blog.csdn.net/u014653854/article/details/80811004(原生JSP已经被淘汰了)
我们知道,pageContext一共有四个作用域,即
PAGE_SCOPE REQUEST_SCOPE SESSION_SCOPE APPLICATION_SCOPE
servlet中request.setAttribute()设置的值就和上面的request_scope一样
顾名思义,很容易想到这四个作用域的意思,即,页面有效,请求有效,session(会话)有效,application(应用)有效。也许大家会直接跳过写代码验证的过程,但是由于本人基础不好,而且感觉到处都是setAttribute()很容易晕。就写了一个测试程序,如下:
先看代码:pagecontext.jsp
<body>
<%
HttpServletRequest req=(HttpServletRequest)pageContext.getRequest();
pageContext.setAttribute("name", "pig",pageContext.PAGE_SCOPE);
pageContext.setAttribute("name", "dog",pageContext.REQUEST_SCOPE);
pageContext.setAttribute("name", "cat",pageContext.SESSION_SCOPE);
pageContext.setAttribute("name", "fish",pageContext.APPLICATION_SCOPE);
%>
<%
String pagename=(String)pageContext.getAttribute("name", pageContext.PAGE_SCOPE);
String reqname=(String)pageContext.getAttribute("name", pageContext.REQUEST_SCOPE);
String sessionname=(String)pageContext.getAttribute("name", pageContext.SESSION_SCOPE);
String appname=(String)pageContext.getAttribute("name", pageContext.APPLICATION_SCOPE);
%>
name in page:<%=pagename %><br>
name in request:<%=reqname %><br>
name in session:<%=sessionname %><br>
name in application:<%=appname %><br>
<jsp:forward page="pageContext2.jsp"></jsp:forward>//与下一行会交换被注释
<!-- <a href="pageContext2.jsp">Go to another site</a> -->
</body>
pagecontext2.jsp,代码就是上面除去设置四个属性的部分的和转发(还有重定向)以外的代码。就不贴了,截图如下:
1.运行程序访问pagecontext.jsp——此时代码区的jsp:forward被注释,a href未被注释掉
四个name值都正确显示,因为才刚刚定义嘛。然后点击<a href>,重定向(注意不是转发)到pageContext2.jsp
2.重定向到pagecontext2.jsp
发现,页面属性丢失,请求属性丢失(因为已经是第二次请求)
3.修改pagecontext.jsp代码,修改成代码区的样子——即直接jsp:forward转发
发现,界面丢失,请求还在(因为是一个请求)
4.关闭所有窗口(上面窗口我是在eclipse打开的),重新打开(我用了firefox)
发现,session属性也丢失了(因为会话已经结束了)
5.重启Tomcat,直接访问pagecontext2
这次所有的属性都未定义
值得注意的是,session对象可以设置超时时间(甚至直接禁用session,不过禁用了session再获取session属性值会直接报错),如果超过了也会成null的