JSP内置对象的范围和属性-初学必看

来源:互联网 发布:谈谈你对java的理解 编辑:程序博客网 时间:2024/05/16 12:57
JSP内置对象的范围和属性

关键词: JSP内置对象                                          

 

●●●范围( Scope )
      有些 JSP 程序员会将 requestsessionapplication pageContext 归为一类,原因在于:它们皆能借助 setAttribute( ) getAttribute( )来设定和取得其属性(Attribute),通过这两种方法来做到数据分享
      我们先来看下面这段小程序:
Page1.jsp
<%@ page contentType="text/html;charset=GB2312" %>
<html>
<head>
 <title>Page1.jsp</title>
</head>
<body>
</br>
<%   
     application.setAttribute("Name","mike");      
     application.setAttribute("Password","browser");
%>
<jsp:forward page="Page2.jsp"/>

 

</body>
</html>
      在这个程序中,我们设定两个属性:NamePassword,其值为:mikebrowser。然后再转交(forward)Page2.jsp。我只要在Page2.jsp当中加入 application.getAttribute( ),就能取得在Page1.jsp设定的数据。
Page2.jsp
<%@ page contentType="text/html;charset=GB2312" %>
<html>
<head>
 <title>Page2.jsp</title>
</head>
<body>
<%
     String Name = (String) application.getAttribute("Name");
     String Password = (String) application.getAttribute("Password");
     out.println("Name = "+Name);
     out.println("Password = "+ Password);

 

%>
</body>
</html>
      执行结果为:
      Name=mike Password=browser
      由这个例子可以看出,JSP提供给开发人员一项传递数据的机制,那就是利用setAttribute( )getAttribute( )方法,如同Page1.jspPage2.jsp的做法。
      在上面Page1.jspPage2.jsp的程序当中,是将数据存入到 application 对象之中。除了application之外,还有requestpageContext session,也都可以设定和取得属性值,那它们之间有什么分别吗?
      它们之间最大的差别在于范围(Scope)不一样,这个概念有点像 CC++中的全局变量和局部变量的概念。接下来就介绍JSP的范围。
      JSP有四种范围,分别为PageRequestSessionApplication

 

     1JSP Scope—Page
      所谓的 Page,指的是单单一页JSP Page的范围。若要将数据存入 Page 范围时,可以用pageContext对象的 setAttribute()方法;若要取得Page范围的数据时,可以使用 pageContext对象的getAttribute( )方法。我们将之前的范例做小幅度的修改,将application改为 pageContext
PageScope1.jsp
<%@ page contentType="text/html;charset=GB2312" %>
<html>
<head>
 <title>PageScope1.jsp</title>
</head>
<body>
<h2>Page 范围 - pageContext</h2>
<%   
     pageContext.setAttribute("Name","mike");      
     pageContext.setAttribute("Password","browser");
%>
<jsp:forward page="PageScope2.jsp"/>
</body>
</html>
PageScope2.jsp
<%@ page contentType="text/html;charset=GB2312" %>
<html>
<head>
 <title>CH5 - PageScope2.jsp</title>
</head>
<body>
<h2>Page 范围 - pageContext</h2>
</br>
<%   
     String Name = (String)pageContext.getAttribute("Name");
     String Password = (String)pageContext.getAttribute("Password");
     out.println("Name = "+Name);
     out.println("Password = "+ Password);
%>
</body>
</html>
      执行结果为:
      Name=null Password=null
      这个范例程序和之前有点类似,只是之前的程序是 application,现在改为 pageContext,但是结果却大不相同,PageScope2.jsp 根本无法取得 PageScope1.jsp 设定的 Name Password 值,因为在PageScope1.jsp当中,是把NamePassword 的属性范围设为Page,所以Name Password 值只能PageScope1.jsp当中取得。若修改PageScope1.jsp的程序,重新命名为PageScope3.jsp,如下:
PageScope3.jsp
<%@ page contentType="text/html;charset=GB2312" %>

 

<html>
<head>
 <title>CH5 - PageScope3.jsp</title>
</head>
<body>
<h2>Page 范围 - pageContext</h2>
</br>
<%   
     pageContext.setAttribute("Name","mike");      
     pageContext.setAttribute("Password","browser");
     
     String Name = (String)pageContext.getAttribute("Name");    
     String Password = (String)pageContext.getAttribute("Password"); 
     
     out.println("Name = "+Name);    
     out.println("Password = "+ Password);
%>
</body>
</html>
      PageScope3.jsp的执行结果为:
      Name=mike Password=browser
      经过修改后的程序,Name Password 的值就能顺利显示出来。这个范例主要用来说明一个概念:若数据设为Page范围时,数据只能在同一个 JSP网页上取得,其他 JSP网页却无法取得该数据。

 

     2JSP Scope—Request
      Request 的范围是指在JSP网页发出请求到另一个JSP网页之间,随后这个属性就失效。设定 Request 的范围时可利用 request 对象中的setAttribute()getAttribute()。我们再来看下列这个范例:
RequestScope1.jsp
<%@ page contentType="text/html;charset=GB2312" %>
<html>
<head>
 <title>CH5 - RequestScope1.jsp</title>
</head>
<body>
<h2>Request 范围 - request</h2>
<%   
     request.setAttribute("Name","mike");     
     request.setAttribute("Password","browser");
%>
<jsp:forward page="RequestScope2.jsp"/>
</body>
</html>
RequestScope2.jsp
<%@ page contentType="text/html;charset=GB2312" %>
<html>
<head>
 <title>RequestScope2.jsp</title>
</head>
<body>
<h2>Request 范围 - request</h2>
<%   
     String Name = (String) request.getAttribute("Name"); 
     String Password = (String) request.getAttribute("Password");    
     out.println("Name = "+Name);    
     out.println("Password = "+ Password);    
%>
</body>
</html>
      执行结果为:
      Name=mike Password=browser
      RequestScope1.jsp转向到RequestScope2.jsp时, RequestScope2.jsp也能取得RequestScope1.jsp设定的NamePassword值。不过其他的JSP网页无法得到NamePassword值,除非它们也和RequestScope1.jsp有请求的关系。
      除了利用转向(forward)的方法可以存取 request 对象的数据之外,还能使用包含(include)的方法。
      假若我将RequestScope1.jsp
      <jsp:forward page="RequestScope2.jsp"/>
      改为
      <jsp:include page="RequestScope2.jsp" flush="true"/>
      执行结果还是一样的。表示使用<jsp:include>标签所包含进来的网页,同样也可以取得Request范围的数据。
      3JSP ScopeSessionApplication
      下表介绍了最后两种范围:SessionApplication

 

●●●属性(Attribute)
      下表列出了一般储存和取得属性的方法,以下 pageContextrequestsession application皆可使用(注意:pageContext并无getAttributeNames( )方法)。

 

      使 Object getAttribute(String name)取得 name ,它 java.lang.Object,因此,我们还必须根据name属性值的类型做转换类型(Casting)的工作。
      例如,若要取得String类型的Name属性时:
      String Name = (String)Sessio.getAttribute("Name");
      若要取得Integer类型的Year属性时:

 

      Integer Year = (Integer)session.getAttribute("Year");
      假若我们的数据要设为Page范围时,则只需要:
      pageContext.setAttribute("Year", new Integer(2001));
      若要为 RequestSession Application 时,就分别存入 requestsession application对象之中,如下:
      request.setAttribute("Month", new Integer(12) );
      session.setAttribute("Day", new Integer(27) );
      application.setAttribute("Times", new Integer(10));
原创粉丝点击