在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);
- %>