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

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

    四种属性范围:

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

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

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

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

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

page属性范围:
[java] view plain copy
  1. <?xml version="1.0" encoding="UTF-8" ?>  
  2. <%@ page language="java" contentType="text/html; charset=UTF-8"  
  3.     pageEncoding="UTF-8"%>  
  4. <%@ page import = "java.util.*" %>  
  5. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  
  6. <html xmlns="http://www.w3.org/1999/xhtml">  
  7. <head>  
  8. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />  
  9. <title>page属性</title>  
  10. </head>  
  11. <body>  
  12. <%  
  13.     pageContext.setAttribute("name","你好!");  
  14.     pageContext.setAttribute("birthday",new Date());      
  15. %>  
  16. <%   
  17.          String username=(String) pageContext.getAttribute("name");  
  18.          Date userbirthday=(Date) pageContext.getAttribute("birthday");  
  19. %>  
  20. <h1><%=username%></h1>  
  21. <h1>现在时刻:<%=userbirthday%></h1>  
  22. </body>  
  23. </html>  

 

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

 

request属性范围:

request_scope01.jsp

[java] view plain copy
  1. <?xml version="1.0" encoding="UTF-8" ?>  
  2. <%@ page language="java" contentType="text/html; charset=UTF-8"  
  3.     pageEncoding="UTF-8"%>  
  4.     <%@ page import = "java.util.*" %>  
  5. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  
  6. <html xmlns="http://www.w3.org/1999/xhtml">  
  7. <head>  
  8. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />  
  9. <title>request属性</title>  
  10. </head>  
  11. <body>  
  12. <%  
  13.     request.setAttribute("name","你好!");  
  14.     request.setAttribute("nowtime",new Date());   
  15. %>  
  16. <jsp:forward page="request_scope02.jsp" />   
  17. </body>  
  18. </html>  


request_scope02.jsp

[java] view plain copy
  1. <?xml version="1.0" encoding="UTF-8" ?>  
  2. <%@ page language="java" contentType="text/html; charset=UTF-8"  
  3.     pageEncoding="UTF-8"%>  
  4.     <%@ page import = "java.util.*" %>  
  5. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  
  6. <html xmlns="http://www.w3.org/1999/xhtml">  
  7. <head>  
  8. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />  
  9. <title>request属性</title>  
  10. </head>  
  11. <body>  
  12. <%  
  13.         String user=(String)request.getAttribute("name");  
  14.         Date time=(Date)request.getAttribute("nowtime");  
  15.  %>  
  16. <h1><%=user%></h1>  
  17. <h1><%=time%></h1>  
  18. </body>  
  19. </html>  


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

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

request_scope03.jsp

[java] view plain copy
  1. <?xml version="1.0" encoding="UTF-8" ?>  
  2. <%@ page language="java" contentType="text/html; charset=UTF-8"  
  3.     pageEncoding="UTF-8"%>  
  4.     <%@ page import = "java.util.*" %>  
  5. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  
  6. <html xmlns="http://www.w3.org/1999/xhtml">  
  7. <head>  
  8. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />  
  9. <title>request属性</title>  
  10. </head>  
  11. <body>  
  12. <%  
  13.     request.setAttribute("name","你好!");  
  14.     request.setAttribute("nowtime",new Date());  
  15.  %>  
  16. <a href="request_scope02.jsp">通过超链接取得request属性</a>  
  17. </body>  
  18. </html>  

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

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

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

 

session属性范围:

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

session_scope01.jsp

[java] view plain copy
  1. <?xml version="1.0" encoding="UTF-8" ?>  
  2. <%@ page language="java" contentType="text/html; charset=UTF-8"  
  3.     pageEncoding="UTF-8"%>  
  4.     <%@ page import = "java.util.*" %>  
  5. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  
  6. <html xmlns="http://www.w3.org/1999/xhtml">  
  7. <head>  
  8. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />  
  9. <title>session属性</title>  
  10. </head>  
  11. <body>  
  12. <%  
  13.     session.setAttribute("name","你好!");  
  14.     session.setAttribute("nowtime",new Date());  
  15.  %>  
  16.  <jsp:forward page="session_scope02.jsp" />  
  17. </body>  
  18. </html>  


session_scope02.jsp

[java] view plain copy
  1. <?xml version="1.0" encoding="UTF-8" ?>  
  2. <%@ page language="java" contentType="text/html; charset=UTF-8"  
  3.     pageEncoding="UTF-8"%>  
  4.     <%@ page import = "java.util.*" %>  
  5. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  
  6. <html xmlns="http://www.w3.org/1999/xhtml">  
  7. <head>  
  8. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />  
  9. <title>session属性</title>  
  10. </head>  
  11. <body>  
  12. <%  
  13.     String user=(String)session.getAttribute("name");  
  14.     Date time=(Date)session.getAttribute("nowtime");  
  15.  %>  
  16. <h1><%=user%></h1>  
  17. <h1><%=time%></h1>  
  18. </body>  
  19. </html>  


session_scope03.jsp

[java] view plain copy
  1. <?xml version="1.0" encoding="UTF-8" ?>  
  2. <%@ page language="java" contentType="text/html; charset=UTF-8"  
  3.     pageEncoding="UTF-8"%>  
  4.     <%@ page import = "java.util.*" %>  
  5. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  
  6. <html xmlns="http://www.w3.org/1999/xhtml">  
  7. <head>  
  8. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />  
  9. <title>session属性</title>  
  10. </head>  
  11. <body>  
  12. <%  
  13.     session.setAttribute("name","你好!");  
  14.     session.setAttribute("nowtime",new Date());  
  15.  %>  
  16. <a href="session_scope02.jsp">通过超链接取得session属性</a>  
  17. </body>  
  18. </html>  

 

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

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

 

application属性范围:

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

application_scope01.jsp

[java] view plain copy
  1. <?xml version="1.0" encoding="UTF-8" ?>  
  2. <%@ page language="java" contentType="text/html; charset=UTF-8"  
  3.     pageEncoding="UTF-8"%>  
  4.     <%@ page import = "java.util.*" %>  
  5. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  
  6. <html xmlns="http://www.w3.org/1999/xhtml">  
  7. <head>  
  8. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />  
  9. <title>application属性</title>  
  10. </head>  
  11. <body>  
  12. <%  
  13.     application.setAttribute("name","你好!");  
  14.     application.setAttribute("nowtime",new Date());  
  15.  %>  
  16.  <jsp:forward page="session_scope02.jsp" />  
  17. </body>  
  18. </html>  


application_scope02.jsp

[java] view plain copy
  1. <?xml version="1.0" encoding="UTF-8" ?>  
  2. <%@ page language="java" contentType="text/html; charset=UTF-8"  
  3.     pageEncoding="UTF-8"%>  
  4.     <%@ page import = "java.util.*" %>  
  5. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  
  6. <html xmlns="http://www.w3.org/1999/xhtml">  
  7. <head>  
  8. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />  
  9. <title>application属性</title>  
  10. </head>  
  11. <body>  
  12. <%  
  13.     String user=(String)session.getAttribute("name");  
  14.     Date time=(Date)session.getAttribute("nowtime");  
  15.  %>  
  16. <h1><%=user%></h1>  
  17. <h1><%=time%></h1>  
  18. </body>  
  19. </html>  


application_scope03.jsp

[java] view plain copy
  1. <?xml version="1.0" encoding="UTF-8" ?>  
  2. <%@ page language="java" contentType="text/html; charset=UTF-8"  
  3.     pageEncoding="UTF-8"%>  
  4.     <%@ page import = "java.util.*" %>  
  5. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  
  6. <html xmlns="http://www.w3.org/1999/xhtml">  
  7. <head>  
  8. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />  
  9. <title>application属性</title>  
  10. </head>  
  11. <body>  
  12. <%  
  13.     application.setAttribute("name","你好!");  
  14.     application.setAttribute("nowtime",new Date());  
  15.  %>  
  16. <a href="application_scope02.jsp">通过超链接取得application属性</a>  
  17. </body>  
  18. </html>  

 

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

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

 

深入研究page范围:

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

[java] view plain copy
  1. <%  
  2.   pageContext.setAttribute("name","你好!",PageContext REQUEST_SCOPE);  
  3.   pageContext.setAttribute("nowtime",new Date(),PageContext REQUEST_SCOPE);  
  4.  %>  

你可能感兴趣的:(jsp)