06月07, 2019

Java Web--JSP--JSP属性范围

JSP属性范围

所谓的属性范围就是一个属性设置之后,可以经过多少个其他页面后仍然可以访问的保存范围。

一、JSP属性范围

  JSP中提供了四种属性范围,四种属性范围分别指以下四种:

当前页:一个属性只能在一个页面中取得,跳转到其他页面无法取得 一次服务器请求:一个页面中设置的属性,只要经过了服务器跳转,则跳转之后的页面可以继续取得。 一次会话:一个用户设置的内容,只要是与此用户相关的页面都可以访问(一个会话表示一个人,这个人设置的东西只要这个人不走,就依然有效) 上下文中:在整个服务器上设置的属性,所有人都可以访问

二、属性的操作方法

  既然JSP中提供了四种属性范围,则四种属性范围中都将包含以下的属性操作方法。

No. 方法 描述
1 public void setAttribute(String name,Object value) 设置属性
2 public object getAttribute(String name) 取得属性
3 public void removeAttribute(String name) 删除属性

属性的操作无外乎就是增加、取得和删除这个几个操作。

  单词Attribute的意思是“属性”,setAttribute(String name,Object value)从单词的组合来看就可以知道是这个方法的是设置属性,设置属性的名字和属性的值,名字(name)为String类型,值(value)为Object类型,由于值为Object类型,这表示可以设置任意类型的数据作为值,因为所有的类都是从Object类型继承而来。因此设置属性值的时候可以是任意类型的数据。getAttribute(String name)方法是根据属性的名字取得属性,removeAttribute(String name)方法是根据属性的名字删除属性。   

三、JSP四种属性范围的具体介绍

3.1、page属性范围(pageContext)

  page属性范围相对好理解一些:在一个页面设置的属性,跳转到其他页面就无法访问了。但是在使用page属性范围的时候必须注意的是,虽然习惯上将页面范围的属性称为page范围,但是实际上操作的时候是使用pageContext内置对象完成的。

pageContext属性范围操作流程图

pageContext从字面上的定义,可以发现,是表示一个页面(page)的上下文(Context),可以表示一个页面中的所有内容。

示例:pageScopeDemo01.jsp

<%@ page import="java.util.*" language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
    //此时设置的属性只能够在本页中取得
    pageContext.setAttribute("name","英雄联盟");  //设置属性
    pageContext.setAttribute("date",new Date()); //设置属性
    //注意:这里设置的两个属性的名字分别为namedate,这两个是字符串类型的数据,但对应的属性值英雄联盟和new Date这个两个值却不是字符串类型,而是两个Object类型的数据。
%>
<%
    //取得设置的属性
    String refName = (String)pageContext.getAttribute("name");  
    //由于取得的值为Object类型,因此必须使用String强制向下转型,转换成String类型
    Date refDate = (Date)pageContext.getAttribute("date");
%>
<h1>姓名:<%=refName%></h1>
<h1>日期:<%=refDate%></h1>
</body>
</html>

程序运行结果如下:

这说明了在本页设置的pageContext范围属性在本页确实可以取得,下面使用跳转语句,观察跳转之后是否还可以取得属性。

示例:pageScopeDemo02.jsp

<%@ page import="java.util.*" language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
    //此时设置的属性只能够在本页中取得
    pageContext.setAttribute("name","英雄联盟");  //设置属性
    pageContext.setAttribute("date",new Date()); //设置属性
    //注意:这里设置的两个属性的名字分别为namedate,这两个是字符串类型的数据,但对应的属性值英雄联盟和new Date这个两个值却不是字符串类型,而是两个Object类型的数据。
%>
<%--使用jsp:forward标签进行服务器端跳转--%>
<jsp:forward page="/scope/pageScopeDemo03.jsp" />
</body>
</html>

示例:pageScopeDemo03.jsp

<%@ page import="java.util.*" language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
    String refName = (String)pageContext.getAttribute("name");  
    Date refDate = (Date)pageContext.getAttribute("date");
%>
<h1>姓名:<%=refName%></h1>
<h1>日期:<%=refDate%></h1>
</body>
</html>

在以上程序中的pageScopeDemo02.jsp只是设置了两个属性,跳转到pageScopeDemo03.jsp之后再在pageScopeDemo03.jsp中取在pageScopeDemo02.jsp设置的page属性。此时,运行结果如下: 使用了服务器端跳转,但是发现内容并不能取得,证明page范围的属性只能在本页中取得,跳转到其他页面之中不能取得。如果现在希望跳转到其他页面之中,依然可以取得,则可以扩大属性范围,使用request属性范围即可。

3.2、request属性范围

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

示例:requestScopeDemo01.jsp

<%@ page import="java.util.*" language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
    request.setAttribute("name","英雄联盟");  
    request.setAttribute("date",new Date()); 
%>
<%--使用jsp:forward标签进行服务器端跳转--%>
<jsp:forward page="/scope/requestScopeDemo02.jsp" />
</body>
</html>

示例:requestScopeDemo02.jsp

<%@ page import="java.util.*" language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
    //取得requestScopdemo01.jsp设置的属性
    String refName = (String)request.getAttribute("name");  
    Date refDate = (Date)request.getAttribute("date");
%>
<h1>姓名:<%=refName%></h1>
<h1>日期:<%=refDate%></h1>
</body>
</html>

运行结果如下:

思考: 1.如果使用<jsp:forward>标签继续向下传递到requestScopeDemo03.jsp是否能获取到值?

2.如果在requestScopeDemo02.jsp上使用超链接标签,能够将值传递给requestScopeDemo03.jsp?

3.3、session属性范围

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

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

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

示例:sessionScopeDemo01.jsp

<%@ page import="java.util.*" language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
    session.setAttribute("name","英雄联盟");  
    session.setAttribute("date",new Date());
%>
</body>
</html>

示例:sessionScopeDemo02.jsp

<%
    String refName = (String)session.getAttribute("name");  
    Date refDate = (Date)session.getAttribute("date");
%>
<h1>姓名:<%=refName%></h1>
<h1>日期:<%=refDate%></h1>

使用session,只要访问过sessionScopeDemo01.jsp之后,sessionScopeDemo02.jsp直接通过浏览器访问就能直接获取session里面存放的值了

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

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

3.4、application属性范围

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

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

示例:applicationScopeDemo01.jsp

<%@ page import="java.util.*" language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
    //此时设置的属性任何用户都可以取得
    application.setAttribute("name","英雄联盟");  //设置属性
    application.setAttribute("date",new Date());
%>
<h1><a href="${pageContext.request.contextPath}/scope/applicationScopeDemo02.jsp">applicationScopeDemo02</a></h1>
</body>
</html>

示例:applicationScopeDemo02.jsp

<%@ page import="java.util.*" language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
    String refName = (String)application.getAttribute("name");
    Date refDate = (Date)application.getAttribute("date");
%>
<h1>姓名:<%=refName%></h1>
<h1>日期:<%=refDate%></h1>
</body>
</html>

思考: 如把Tomcat服务器先关闭后再重新启动,打开浏览器窗口运行applicationScopeDemo02.jsp时会得到什么结果呢?

本文链接:http://www.yanhongzhi.com/post/jsp_5.html

-- EOF --

Comments