深入分析JavaWeb Item16 -- jsp 四大域(属性)范围_javaweb的四大域

对象篇

模块化编程-自研模块加载器

开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】

3.2、request属性范围

request属性范围表示在一次服务器跳转中有效,只要是服务器跳转,则设置的request属性可以一直传递下去。

这里写图片描述

范例:requestScopeDemo01.jsp

<%@page contentType="text/html;charset=UTF-8"%>
<%@page import="java.util.\*"%>
<%
    request.setAttribute("name","孤傲苍狼");  
    request.setAttribute("date",new Date()); 
%>
<%--使用jsp:forward标签进行服务器端跳转--%>
<jsp:forward page="/requestScopeDemo02.jsp" />

范例:requestScopeDemo02.jsp

<%@page contentType="text/html;charset=UTF-8"%>
<%@page import="java.util.\*"%>
<%
 //取得requestScopdemo01.jsp设置的属性
 String refName = (String)request.getAttribute("name"); 
 Date refDate = (Date)request.getAttribute("date");
%>
<h1>姓名:<%=refName%></h1>
<h1>日期:<%=refDate%></h1>

运行结果如下:

这里写图片描述

从运行结果来看,程序跳转了,但是与page范围相比,内容可以向下继续传递,即在第一个页面设置的属性跳转到第二个页面后在第二个页面中依然可以取得第一个页面设置的属性。

如果现在有第三个页面了,则也可以继续向后传递

范例:修改requestScopeDemo02.jsp

 <%@page contentType="text/html;charset=UTF-8"%>
 <%@page import="java.util.\*"%>
 <%--使用jsp:forward标签进行服务器端跳转--%>
 <jsp:forward page="/requestScopeDemo03.jsp" />

范例:requestScopeDemo03.jsp

<%@page contentType="text/html;charset=UTF-8"%>
<%@page import="java.util.\*"%>
<%
 //取得requestScopdemo01.jsp设置的属性
 String refName = (String)request.getAttribute("name"); 
 Date refDate = (Date)request.getAttribute("date");
%>
<h1>姓名:<%=refName%></h1>
<h1>日期:<%=refDate%></h1>

以上的结果依然可以访问,但是如果,此时使用了超链接的方式传递的话,则属性是无法向下继续传递的。

范例:修改requestScopeDemo03.jsp

<%@page contentType="text/html;charset=UTF-8"%>
<%@page import="java.util.\*"%>
<%
 //取得requestScopdemo01.jsp设置的属性
 String refName = (String)request.getAttribute("name"); 
 Date refDate = (Date)request.getAttribute("date");
%>
<h1>姓名:<%=refName%></h1>
<h1>日期:<%=refDate%></h1>
<h1>
<%--使用超链接的形式跳转,这是客户端跳转,URL地址会改变--%>
<a href="${pageContext.request.contextPath}/requestScopeDemo04.jsp">跳转到requestScopeDemo04.jsp</a>
</h1>

此时使用了超链接跳转,一旦跳转之后,地址栏改变,所以此种跳转也可以称为客户端跳转。

requestScopeDemo04.jsp

<%@page contentType="text/html;charset=UTF-8"%>
<%@page import="java.util.\*"%>
<%
 //取得requestScopdemo01.jsp设置的属性
 String refName = (String)request.getAttribute("name"); 
 Date refDate = (Date)request.getAttribute("date");
%>
<h1>姓名:<%=refName%></h1>
<h1>日期:<%=refDate%></h1>

运行结果:

这里写图片描述

requestScopeDemo04.jsp页面显示的结果是null。这说明了在requestScopeDemo01.jsp这个页面设置的属性经过超链接这种客户端跳转到别的页面时别的页面是无法取得requestScopeDemo01.jsp中设置的属性的。

如果还想进一步扩大属性范围,则可以使用session范围属性

3.3、session属性范围

session设置的属性不管如何跳转,都可以取得的。当然,session只针对一个用户

这里写图片描述

在第一个页面上设置的属性,跳转(服务器跳转/客户端跳转)到其他页面之后,其他的页面依然可以取得第一个页面上设置的属性。

下面通过代码来观察session属性范围

范例:sessionScopeDemo01.jsp

<%@page contentType="text/html;charset=UTF-8"%>
<%@page import="java.util.\*"%>
<%
    //此时设置的属性只能够在与本页相关的任何页面中取得
    session.setAttribute("name","孤傲苍狼");  //设置属性
    session.setAttribute("date",new Date());
%>
<%--使用服务器端跳转--%>
<jsp:forward page="/sessionScopeDemo02.jsp"/>

这里使用的是服务器端跳转

sessionScopeDemo02.jsp

<%@page contentType="text/html;charset=UTF-8"%>
<%@page import="java.util.\*"%>
<%
 String refName = (String)session.getAttribute("name");
 Date refDate = (Date)session.getAttribute("date");
%>
<h1>姓名:<%=refName%></h1>
<h1>日期:<%=refDate%></h1>
<%--使用超链接这种客户端跳转--%>
<h1><a href="${pageContext.request.contextPath}/sessionScopeDemo03.jsp">sessionScopeDemo03</a></h1>

这里使用的是超链接这种客户端跳转

运行程序sessionScopeDemo01.jsp结果如下所示:

这里写图片描述

sessionScopeDemo03.jsp

<%@page contentType="text/html;charset=UTF-8"%>
<%@page import="java.util.\*"%>
<%
 String refName = (String)session.getAttribute("name");
 Date refDate = (Date)session.getAttribute("date");
%>
<h1>姓名:<%=refName%></h1>
<h1>日期:<%=refDate%></h1>

点击超链接sessionScopeDemo03,跳转到了sessionScopeDemo03.jsp这个页面,此时程序的运行结果如下:

这里写图片描述

这说明了即使是采用客户端跳转,在别的页面依然可以取得第一个页面中设置的session属性。但是,如果,此时新开了一个浏览器,则sessionScopeDemo03.jsp肯定无法取得sessionScopeDemo01.jsp中设置的session对象的属性,因为session只是保留了一个人的信息。

如果一个属性想让所有的用户都可以访问,则可以使用最后一种属性范围:application范围。

3.4、application属性范围

这里写图片描述

因为application属性范围是在服务器上设置的一个属性,所以一旦设置之后任何用户都可以浏览到此属性。

下面通过代码来观察application属性范围

范例:applicationScopeDemo01.jsp

<%@ page contentType="text/html;charset=GBK"%>
<%@ page import="java.util.\*"%>
<%
 //此时设置的属性任何用户都可以取得
 application.setAttribute("name","孤傲苍狼"); //设置属性
 application.setAttribute("date",new Date());
%>
<h1><a href="${pageContext.request.contextPath}/applicationScopeDemo02.jsp">applicationScopeDemo02</a></h1>

范例:applicationScopeDemo02.jsp

<%@ page contentType="text/html;charset=GBK"%>
<%@ page import="java.util.\*"%>
<%
 String refName = (String)application.getAttribute("name");
 Date refDate = (Date)application.getAttribute("date");
%>
<h1>姓名:<%=refName%></h1>
<h1>日期:<%=refDate%></h1>

观察页面的运行效果:

这里写图片描述

开启多个浏览器窗口,运行applicationScopeDemo02.jsp时,都可以显示出上图所示的结果,因为属性范围设置在了服务器中,所以只要是连接到此服务器的任意用户都可以取得此属性,当然,如果服务器关闭的话,则此属性肯定消失。

如把Tomcat服务器先关闭后再重新启动,打开浏览器窗口运行applicationScopeDemo02.jsp时,得到的结果如下图所示:

这里写图片描述

注意:如果在服务器上设置了过多的application属性,则会影响到服务器的性能。

3.5、关于pageContext属性范围的进一步补充

之前所讲解的四种属性范围,实际上都是通过pageContext属性范围设置上的。打开pageContext所在的说明文档。

这里写图片描述

PageContext类继承了JspContext类,在JspContext类中定义了setAttribute方法,如下:

     public abstract void setAttribute(String name,Object value,int scope) 

此方法中存在一个scope的整型变量,此变量就表示一个属性的保存范围。

这里写图片描述

PageContext类继承了JspContext类,所以在PageContext类中实现了抽象的setAttribute方法:

更多面试题

**《350页前端校招面试题精编解析大全》**内容大纲主要包括 HTML,CSS,前端基础,前端核心,前端进阶,移动端开发,计算机基础,算法与数据结构,项目,职业发展等等

开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】

0205937583)

PageContext类继承了JspContext类,所以在PageContext类中实现了抽象的setAttribute方法:

更多面试题

**《350页前端校招面试题精编解析大全》**内容大纲主要包括 HTML,CSS,前端基础,前端核心,前端进阶,移动端开发,计算机基础,算法与数据结构,项目,职业发展等等

开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】

[外链图片转存中…(img-s0CnKJFy-1715270723521)]

  • 18
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值