本章目标
掌握属性的操作方法
掌握JSP中的四种属性范围的作用
掌握pageContext对象设置四种属性范围的方法
四种属性范围
在JSP中提供了四种属性的保存范围,所谓的属性保存范围,指的就是一个设置的对象,可以在多少个页面中保存并可以继续使用
四种属性范围:
pageContext:只在一个页面中保存属性,跳转之后无效。
request:只在一次请求中保存,服务器跳转后依然有效。
session:在一次会话范围中,无论何种跳转都可以使用,但是新开浏览器无法使用。
application:在整个服务器上保存,所有用户都可以使用
属性操作方法
page属性范围(pageContext范围)
page属性范围(使用pageContext表示,但是一般来讲都习惯于将这种范围称为page范围)表示将一个属性设置在本页上,跳转之后无法取得。
设置和取得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>
效果图:
设置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>
效果图:
request属性范围
如果要在服务器跳转之后属性可以继续保存下来,则可以使用request属性范围操作,request属性范围表示的是在服务器跳转之后,所有设置的内容依然会被保留下来
设置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>
效果图:
使用超链接跳转
<%@ 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>
效果图:
关于request属性范围的理解
request表示的是客户端的请求,正常情况下,一次请求服务器只会给予一次回应,那么这个时候如果是服务器端跳转,请求的地址栏没有改变,所以也就相当于回应了一次,而如果地址栏改变了,就相当于是发出了第二次请求,则第一次请求的内容肯定就已经消失了,所以无法取得。
session属性范围
如果现在希望一个属性设置之后,可以在任何一个与设置页面相关的页面中取得的话,则就可以使用session属性范围,使用session设置属性之后,不管是客户端跳转还是服务器端跳转,只要属性设置了就都可以取得
设置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>
效果图:
application属性范围
如果现在希望设置一个属性,可以让所有的用户(每一个session)都能看得见的话,则可以将属性范围设置成application,这样属性就保存在了服务器之上。
设置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>
效果图:
小结
四种属性范围是整个WEB的核心操作
属性范围规定了属性的有效范围
PageContext对象可以直接操作四种属性范围