本章目标
掌握属性的操作方法
掌握JSP中的四种属性范围的作用
掌握pageContext对象设置四种属性范围的方法

 

四种属性范围
在JSP中提供了四种属性的保存范围,所谓的属性保存范围,指的就是一个设置的对象,可以在多少个页面中保存并可以继续使用
四种属性范围:
pageContext:只在一个页面中保存属性,跳转之后无效。
request:只在一次请求中保存,服务器跳转后依然有效。
session:在一次会话范围中,无论何种跳转都可以使用,但是新开浏览器无法使用。
application:在整个服务器上保存,所有用户都可以使用

四种属性范围_html

 

属性操作方法

四种属性范围_html_02


 page属性范围(pageContext范围)

page属性范围(使用pageContext表示,但是一般来讲都习惯于将这种范围称为page范围)表示将一个属性设置在本页上,跳转之后无法取得。

四种属性范围_html_03


 

设置和取得page范围的属性

<%@ page language="java" contentType="text/html" pageEncoding="utf-8"%>
<%@ page import="java.util.*"%><!-- 导入java.util包 -->
<html>
<head>
<title>设置和取得page范围的属性</title>
</head>
<body>
	<%//设置page属性范围,此属性只在当前的JSP页面中起作用
		pageContext.setAttribute("name", "chaoyi");
		pageContext.setAttribute("time", new Date());
	%>
	<%//从page属性范围中取出属性,并执行向下转型操作
		String userName = (String) pageContext.getAttribute("name");
		Date userTime = (Date) pageContext.getAttribute("time");
	%>
	<h2>姓名:<%=userName %></h2><!-- 输出取得的属性内容 -->
	<h2>生日:<%=userTime %></h2><!-- 输出取得的属性内容 -->
</body>
</html>

 效果图:

四种属性范围_java_04

 

设置page范围的属性

<%@ page language="java" contentType="text/html" pageEncoding="utf-8"%>
<%@ page import="java.util.*"%><!-- 导入java.util包 -->
<html>
<head>
<title>设置page范围的属性</title>
</head>
<body>
	<%//设置page属性范围,此属性只在当前的JSP页面中起作用
		pageContext.setAttribute("name", "chaoyi");
		pageContext.setAttribute("time", new Date());
	%>
	<jsp:forward page="demo3.jsp"></jsp:forward>
</body>
</html>

取得page范围的属性

<%@ page language="java" contentType="text/html" pageEncoding="utf-8"%>
<%@ page import="java.util.*"%><!-- 导入java.util包 -->
<html>
<head>
<title>取得page范围的属性</title>
</head>
<body>
	<%//从page属性范围中取出属性,并执行向下转型操作
		String userName = (String) pageContext.getAttribute("name");
		Date userTime = (Date) pageContext.getAttribute("time");
	%>
	<h2>姓名:<%=userName %></h2><!-- 输出取得的属性内容 -->
	<h2>生日:<%=userTime %></h2><!-- 输出取得的属性内容 -->
</body>
</html>

 效果图:

四种属性范围_html_05

 

request属性范围

如果要在服务器跳转之后属性可以继续保存下来,则可以使用request属性范围操作,request属性范围表示的是在服务器跳转之后,所有设置的内容依然会被保留下来

四种属性范围_java_06


 

设置request范围的属性 

<%@ page language="java" contentType="text/html" pageEncoding="utf-8"%>
<%@ page import="java.util.*"%><!-- 导入java.util包 -->
<html>
<head>
<title>设置request范围的属性</title>
</head>
<body>
	<%//设置request属性范围,此属性只在服务器跳转中起作用
		request.setAttribute("name", "chaoyi");
		request.setAttribute("time", new Date());
	%>
	<jsp:forward page="demo2.jsp"></jsp:forward>
</body>
</html>

取得request范围的属性

<%@ page language="java" contentType="text/html" pageEncoding="utf-8"%>
<%@ page import="java.util.*"%><!-- 导入java.util包 -->
<html>
<head>
<title>取得request范围的属性</title>
</head>
<body>
	<%//从request属性范围中取出属性,并执行向下转型操作
		String userName = (String) request.getAttribute("name");
		Date userTime = (Date) request.getAttribute("time");
	%>
	<h2>姓名:<%=userName %></h2><!-- 输出取得的属性内容 -->
	<h2>生日:<%=userTime %></h2><!-- 输出取得的属性内容 -->
</body>
</html>

 效果图:

四种属性范围_html_07


 

使用超链接跳转

<%@ page language="java" contentType="text/html" pageEncoding="utf-8"%>
<%@ page import="java.util.*"%><!-- 导入java.util包 -->
<html>
<head>
<title>设置request范围的属性</title>
</head>
<body>
	<%//设置request属性范围,此属性只在服务器跳转中起作用
		request.setAttribute("name", "chaoyi");
		request.setAttribute("time", new Date());
	%>
	<!-- 通过超链接跳转后,地址栏改变,属于客户端跳转 -->
	<a href="demo2.jsp">通过超链接取得属性</a>
</body>
</html>

效果图:

四种属性范围_java_08


四种属性范围_html_05

关于request属性范围的理解

request表示的是客户端的请求,正常情况下,一次请求服务器只会给予一次回应,那么这个时候如果是服务器端跳转,请求的地址栏没有改变,所以也就相当于回应了一次,而如果地址栏改变了,就相当于是发出了第二次请求,则第一次请求的内容肯定就已经消失了,所以无法取得。

四种属性范围_html_10


 

 

session属性范围

如果现在希望一个属性设置之后,可以在任何一个与设置页面相关的页面中取得的话,则就可以使用session属性范围,使用session设置属性之后,不管是客户端跳转还是服务器端跳转,只要属性设置了就都可以取得

四种属性范围_Time_11

 

设置session范围的属性

<%@ page language="java" contentType="text/html" pageEncoding="utf-8"%>
<%@ page import="java.util.*"%><!-- 导入java.util包 -->
<html>
<head>
<title>设置session范围的属性</title>
</head>
<body>
	<%//设置session属性范围,此属性在一个浏览器中始终有效
		session.setAttribute("name", "chaoyi");
		session.setAttribute("time", new Date());
	%>
	<!-- 通过超链接跳转后,地址栏改变,属于客户端跳转 -->
	<a href="demo2.jsp">通过超链接取得属性</a>
</body>
</html>

取出session范围的属性

<%@ page language="java" contentType="text/html" pageEncoding="utf-8"%>
<%@ page import="java.util.*"%><!-- 导入java.util包 -->
<html>
<head>
<title>取得session范围的属性</title>
</head>
<body>
	<%//从session属性范围中取出属性,并执行向下转型操作
		String userName = (String) session.getAttribute("name");
		Date userTime = (Date) session.getAttribute("time");
	%>
	<h2>姓名:<%=userName %></h2><!-- 输出取得的属性内容 -->
	<h2>生日:<%=userTime %></h2><!-- 输出取得的属性内容 -->
</body>
</html>

效果图:

四种属性范围_java_08


四种属性范围_java_04

 

application属性范围

如果现在希望设置一个属性,可以让所有的用户(每一个session)都能看得见的话,则可以将属性范围设置成application,这样属性就保存在了服务器之上。

四种属性范围_html_14


 

设置application范围的属性
 

<%@ page language="java" contentType="text/html" pageEncoding="utf-8"%>
<%@ page import="java.util.*"%><!-- 导入java.util包 -->
<html>
<head>
<title>设置application范围的属性</title>
</head>
<body>
 <%//设置application属性范围,此属性保存在服务器上
  application.setAttribute("name", "chaoyi");
  application.setAttribute("time", new Date());
 %>
 <!-- 通过超链接跳转后,地址栏改变,属于客户端跳转 -->
 <a href="demo2.jsp">通过超链接取得属性</a>
</body>
</html>

 

取得application范围的属性

<%@ page language="java" contentType="text/html" pageEncoding="utf-8"%>
<%@ page import="java.util.*"%><!-- 导入java.util包 -->
<html>
<head>
<title>取得application范围的属性</title>
</head>
<body>
 <%//从application属性范围中取出属性,并执行向下转型操作
  String userName = (String) application.getAttribute("name");
  Date userTime = (Date) application.getAttribute("time");
 %>
 <h2>姓名:<%=userName %></h2><!-- 输出取得的属性内容 -->
 <h2>生日:<%=userTime %></h2><!-- 输出取得的属性内容 -->
</body>
</html>

 

深入研究page属性范围
之前研究过的page属性范围中使用的是pageContext进行属性设置的,但是从javax.servlet.jsp.PageContext类中可以发现,有以下的一种设置属性的方法
public void setAttribute(String name,Object value,int scope)
在PageContext类中存在四个表示属性范围的常量,可以直接通过这些常量指定scope的内容:

public static final int PAGE_SCOPE
public static final int REQUEST_SCOPE
public static final int SESSION_SCOPE
public static final int APPLICATION_SCOPE

 

设置request范围的属性

<%@ page language="java" contentType="text/html" pageEncoding="utf-8"%>
<%@ page import="java.util.*"%><!-- 导入java.util包 -->
<html>
<head>
<title>设置request范围的属性</title>
</head>
<body>
	<%//设置request属性范围,此属性只在服务器跳转中起作用
		pageContext.setAttribute("name", "chaoyi",PageContext.REQUEST_SCOPE);
		pageContext.setAttribute("time", new Date(),PageContext.REQUEST_SCOPE);
	%>
	<jsp:forward page="demo2.jsp"></jsp:forward>
</body>
</html>

取得request范围的属性

<%@ page language="java" contentType="text/html" pageEncoding="utf-8"%>
<%@ page import="java.util.*"%><!-- 导入java.util包 -->
<html>
<head>
<title>取得request范围的属性</title>
</head>
<body>
	<%//从request属性范围中取出属性,并执行向下转型操作
		String userName = (String) request.getAttribute("name");
		Date userTime = (Date) request.getAttribute("time");
	%>
	<h2>姓名:<%=userName %></h2><!-- 输出取得的属性内容 -->
	<h2>生日:<%=userTime %></h2><!-- 输出取得的属性内容 -->
</body>
</html>

效果图:

四种属性范围_java_04


 

小结
四种属性范围是整个WEB的核心操作
属性范围规定了属性的有效范围
PageContext对象可以直接操作四种属性范围