JSP隐式对象pageContext的四个作用域

写在前面,这一篇是讲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的

猜你喜欢

转载自blog.csdn.net/qq_25929565/article/details/89002371