深入剖析jsp四种属性范围(简单实例)

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

    四种属性范围:

     page( pageContex表现t):只在一个页面中保存属性,跳转之后无效

      request:只在一次请求中保存,服务器跳转后依然有效

      session:再一次会话范围中,无论何种跳转都可以使用但是新开浏览器无法使用

      application:在整个服务器上保存,所有用户都可以使用

以下用简单的实例进行说明:

page属性范围:
<?xml version="1.0" encoding="UTF-8" ?>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import = "java.util.*" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>page属性</title>
</head>
<body>
<%
	pageContext.setAttribute("name","你好!");
	pageContext.setAttribute("birthday",new Date());	
%>
<% 
         String username=(String) pageContext.getAttribute("name");
         Date userbirthday=(Date) pageContext.getAttribute("birthday");
%>
<h1><%=username%></h1>
<h1>现在时刻:<%=userbirthday%></h1>
</body>
</html>

 

page属性范围表示讲一个属性设置在本页上,跳转之后无法取得。

 

request属性范围:

request_scope01.jsp

<?xml version="1.0" encoding="UTF-8" ?>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <%@ page import = "java.util.*" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>request属性</title>
</head>
<body>
<%
	request.setAttribute("name","你好!");
	request.setAttribute("nowtime",new Date());	
%>
<jsp:forward page="request_scope02.jsp" /> 
</body>
</html>


request_scope02.jsp

<?xml version="1.0" encoding="UTF-8" ?>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <%@ page import = "java.util.*" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>request属性</title>
</head>
<body>
<%
        String user=(String)request.getAttribute("name");
        Date time=(Date)request.getAttribute("nowtime");
 %>
<h1><%=user%></h1>
<h1><%=time%></h1>
</body>
</html>


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

页面跳转之后,可以取得了,但是如果现在一直有服务器端跳转,则可以一直传递过去,但是如果现在换了一种形式使用超链接进行页面的跳转:

request_scope03.jsp

<?xml version="1.0" encoding="UTF-8" ?>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <%@ page import = "java.util.*" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>request属性</title>
</head>
<body>
<%
	request.setAttribute("name","你好!");
	request.setAttribute("nowtime",new Date());
 %>
<a href="request_scope02.jsp">通过超链接取得request属性</a>
</body>
</html>

   如果使用了超链接,首先会发生改变,所以一旦地址栏发生改变的跳转,都统一称为客户端跳转,客户端跳转无法传递request属性的。

* 关于request属性范围的理解:

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

 

session属性范围:

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

session_scope01.jsp

<?xml version="1.0" encoding="UTF-8" ?>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <%@ page import = "java.util.*" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>session属性</title>
</head>
<body>
<%
	session.setAttribute("name","你好!");
	session.setAttribute("nowtime",new Date());
 %>
 <jsp:forward page="session_scope02.jsp" />
</body>
</html>


session_scope02.jsp

<?xml version="1.0" encoding="UTF-8" ?>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <%@ page import = "java.util.*" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>session属性</title>
</head>
<body>
<%
	String user=(String)session.getAttribute("name");
	Date time=(Date)session.getAttribute("nowtime");
 %>
<h1><%=user%></h1>
<h1><%=time%></h1>
</body>
</html>


session_scope03.jsp

<?xml version="1.0" encoding="UTF-8" ?>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <%@ page import = "java.util.*" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>session属性</title>
</head>
<body>
<%
	session.setAttribute("name","你好!");
	session.setAttribute("nowtime",new Date());
 %>
<a href="session_scope02.jsp">通过超链接取得session属性</a>
</body>
</html>

 

     如果此时,再打开一个新的浏览器的话,则就无法取得之前设置的session了,因为每一个session只保存在当前的浏览器中,并且可以从相关的页面中取得。

     对于服务器而言  ,每一个连接到它的客户端都是一个session

 

application属性范围:

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

application_scope01.jsp

<?xml version="1.0" encoding="UTF-8" ?>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <%@ page import = "java.util.*" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>application属性</title>
</head>
<body>
<%
	application.setAttribute("name","你好!");
	application.setAttribute("nowtime",new Date());
 %>
 <jsp:forward page="session_scope02.jsp" />
</body>
</html>


application_scope02.jsp

<?xml version="1.0" encoding="UTF-8" ?>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <%@ page import = "java.util.*" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>application属性</title>
</head>
<body>
<%
	String user=(String)session.getAttribute("name");
	Date time=(Date)session.getAttribute("nowtime");
 %>
<h1><%=user%></h1>
<h1><%=time%></h1>
</body>
</html>


application_scope03.jsp

<?xml version="1.0" encoding="UTF-8" ?>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <%@ page import = "java.util.*" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>application属性</title>
</head>
<body>
<%
	application.setAttribute("name","你好!");
	application.setAttribute("nowtime",new Date());
 %>
<a href="application_scope02.jsp">通过超链接取得application属性</a>
</body>
</html>

 

        只要是通过application设置属性,则所有的session都可以取得,表示公共的内容,但是如果此时服务器重新启动了,则无法取得了,因为关闭后属性消失,要想再次访问,则可以重新设置。

        既然application属性范围的内容都是保存在了服务器上,如果现在要同时设置很多application的话,则服务器的性能肯定会有所降低,而且四种属性范围都是保存在服务器的,这个时候就给出了一个原则:能使用page范围的就不要用request,能用request的就不要用session,能使用session的就不要使用application,因为保存范围越窄,则肯定对于服务器的压力就越低。

 

深入研究page范围:

    page范围是通过pageContext对象设置的,但是在pageContext对象中存在以下的一个设置方法(设置成request属性):

<%
  pageContext.setAttribute("name","你好!",PageContext REQUEST_SCOPE);
  pageContext.setAttribute("nowtime",new Date(),PageContext REQUEST_SCOPE);
 %>


 


 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值