7--jsp中四个范围

在JSP中提供了四种属性的保存范围,所谓属性范围就是指一个内置对象,可以在多少个页面中保存并继续使用:

  1. page :只在一个页面中保存属性,跳转后无效
  2. request:只在一次请求中有效,服务器跳转后依然有效
  3. session:在一次会话中有效,无论何种跳转,跳转后依然可以使用,但是新开的浏览器无法使用
  4. application:在整个服务器上保存,所有的用户都可以使用
    以上这四种内置对象都有以下操作方法:
  5. public void setAttribute(String name,Object o)//设置属性的名称和内容
  6. public Object getAttribute(String name)//根据属性名称取得属性内容
  7. public void removeAttribute(String name)//删除指定的属性

page范围

Page属性范围(使用pageContext表示,但是一般习惯将这种范围称为page范围),表示将一个属性设置在本页上,跳转之后无法使用。
实例1:设置和取得page范围的属性:page_scope_demo1.jsp

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<html>
<head>
<title>My JSP 'page_scope_demo1.jsp' starting page</title>
</head>
<body>
	<%
		//设置page属性范围,此属性值在当前的jsp页面起作用
		pageContext.setAttribute("name", "齐老师");
		pageContext.setAttribute("birthday", new Date());
	%>
	<%
		//从page属性范围中取出属性,并向下转型操作
		String username = (String) pageContext.getAttribute("name");
		Date userbirthday = (Date) pageContext.getAttribute("birthday");
	%>
	<h2>
		姓名:<%=username%></h2>
	<h2>
		生日:<%=userbirthday%></h2>
</body>
</html>

实例2:修改实例1的代码

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<html>
<head>
<title>My JSP 'page_scope_demo1.jsp' starting page</title>
</head>
<body>
	<%
		//设置page属性范围,此属性值在当前的jsp页面起作用
		pageContext.setAttribute("name", "齐老师");
		pageContext.setAttribute("birthday", new Date());
	%>
	<%
		//从page属性范围中取出属性,并向下转型操作
		String username = (String) pageContext.getAttribute("name");
		Date userbirthday = (Date) pageContext.getAttribute("birthday");
	%>
	<!-- 请求转发 -->
	<jsp:forward page="page_scope_demo2.jsp"></jsp:forward>
</body>
</html>

页面设置了跳转语句.

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<html>
<head>
<title>My JSP 'page_scope_demo2.jsp' starting page</title>
</head>
<body>
	<%
		//从page属性范围中取出属性,并向下转型操作
		String username = (String) pageContext.getAttribute("name");
		Date userbirthday = (Date) pageContext.getAttribute("birthday");
	%>
	<h2>
		姓名:<%=username%></h2>
	<h2>
		生日:<%=userbirthday%></h2>
</body>
</html>

执行完毕之后,page_scope_demo2.jsp是无法取得属性值的,内容为null.

request范围

如果在服务器跳转后想让属性继续保持下来,则可以使用request属性范围操作,request属性范围表示在服务器跳转后,所有设置的内容依然被保留下来。
实例3:设置请求转发

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<html>
  <head>
    <title>My JSP 'page_scope_demo1.jsp' starting page</title>
  </head>
  <body>
    <%
    	//设置request属性范围,此属性值在当前的jsp页面起作用
    	request.setAttribute("name","齐老师");
    	request.setAttribute("birthday",new Date());
    %>
   <jsp:forward page="page_scope_demo2.jsp"></jsp:forward>
  </body>
</html>

接收请求转发的数据:

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<html>
<head>
<title>My JSP 'page_scope_demo2.jsp' starting page</title>
</head>
<body>
	<%
		//从page属性范围中取出属性,并向下转型操作
		String username = (String) request.getAttribute("name");
		Date userbirthday = (Date) request.getAttribute("birthday");
	%>
	<h2>
		姓名:<%=username%></h2>
	<h2>
		生日:<%=userbirthday%></h2>
</body>
</html>

实例4:将服务端跳转(请求转发)换成超级链接(客户端跳转,重定向)
设置超链接跳转:重定向

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<html>
<head>
<title>My JSP 'request_scope_demo1.jsp' starting page</title>
</head>
<body>
	<%
		//设置request属性范围,此属性值在当前的jsp页面起作用
		request.setAttribute("name", "齐老师");
		request.setAttribute("birthday", new Date());
	%>
	<!-- 通过超级链接跳转后,地址栏改变,属于客户端的跳转 -->
	<a href="request_scope_demo2.jsp">通过超级链接取得request的属性</a>
</body>
</html>

接收重定向的数据:

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<html>
<head>
<title>My JSP 'page_scope_demo2.jsp' starting page</title>
</head>
<body>
	<%
		//从page属性范围中取出属性,并向下转型操作
		String username = (String) request.getAttribute("name");
		Date userbirthday = (Date) request.getAttribute("birthday");
	%>
	<h2>
		姓名:<%=username%></h2>
	<h2>
		生日:<%=userbirthday%></h2>
</body>
</html>

由于request范围只针对服务器端跳转,所以无法获取属性。
关于request属性范围的理解:其表示客户端的请求,在正常情况下,一次请求服务器只会给予一次回应,这时如果是服务器端跳转,请求的地址栏没有改变,相当于回应了一次,而如果地址栏改变了,就相当于发出第二次请求,则第一次请求的内容肯定就已经消失了 ,所以无法取得。

session范围

session属性范围可以在任何一个与设置页面相关的页面中取得,但是重新打开一个新的浏览器直接访问,范围中的属性失效。
实例5:

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<html>
  <head>
    <title>My JSP 'session_scope_demo1.jsp' starting page</title>
  </head>
  <body>
    <%
    	//设置session属性范围,此属性值在当前的jsp页面起作用
    	session.setAttribute("name","齐老师");
    	session.setAttribute("birthday",new Date());
    %>
    <!-- 通过超级链接跳转后,地址栏改变,属于客户端的跳转 -->
   <a href="session_scope_demo2.jsp">通过超级链接取得session的属性</a>
  </body>
</html>

接收跳转之后的数据:

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<html>
  <head>
    <title>My JSP 'session_scope_demo2.jsp' starting page</title>
  </head>
  <body>
    <% 
    	//从page属性范围中取出属性,并向下转型操作
    	String username=(String)session.getAttribute("name");
    	Date userbirthday=(Date)session.getAttribute("birthday");
    %>
    <h2>姓名:<%=username %></h2>
    <h2>生日:<%=userbirthday %></h2>
  </body>
</html>

application范围

如果希望设置一个属性,让所有的用户(每一个session)都看见,则可以将属性范围设置为application,这样属性就会保存在服务器上,服务器重启属性才消失。过多此属性影响服务器性能。
实例6:

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<html>
  <head>
    <title>My JSP 'application_scope_demo1.jsp' starting page</title>
  </head>
  <body>
    <%
    	//设置application属性范围,此属性值在当前的jsp页面起作用
    	application.setAttribute("name","齐老师");
    	application.setAttribute("birthday",new Date());
    %>
    <!-- 通过超级链接跳转后,地址栏改变,属于客户端的跳转 -->
   <a href="application_scope_demo2.jsp">通过超级链接取得application的属性</a>
  </body>
</html>

接收application范围中的数据

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<html>
  <head>
    <title>My JSP 'application_scope_demo2.jsp' starting page</title>
  </head>
  <body>
    <% 
    	//从appliaction属性范围中取出属性,并向下转型操作
    	String username=(String)application.getAttribute("name");
    	Date userbirthday=(Date)application.getAttribute("birthday");
    %>
    <h2>姓名:<%=username %></h2>
    <h2>生日:<%=userbirthday %></h2>
  </body>
</html>

总结:

page->request->session->application四个范围依次增大。
page:当前页面有效
request:当前页面有效,一次请求中有效,重新发起请求(重定向)后失效。
session:当前页面有效,一次会话中有效,浏览器关闭失效。其实session有一个有效时间,有效时间内有效,超时失效,默认Tomcat的有效时间为30分钟。可以自行设置。
application:整个容器中有效。

猜你喜欢

转载自blog.csdn.net/qwy715229258163/article/details/114012747
今日推荐