1. 程式人生 > >Java Web學習(18):JavaBean四大作用域

Java Web學習(18):JavaBean四大作用域

一JavaBean作用域

       JavaBean就是把程式中的實體物件及業務邏輯單獨的封裝到Java類當中。然後再JSP頁面中呼叫這個封裝好的

類,這樣可以降低HTML與Java程式碼的耦合度,簡化介面。

       JavaBean有四個作用域範圍,我們使用<jsp:useBean>動作元素的scope屬性可以用來指定JavaBean的作用範

圍。實際上,JSP頁面的四大作用域是和JavaBean的四個作用域實質上是相同的,那麼我們就來看看JavaBean的四

大作用域。

       JavaBean四種作用域範圍說明:

       1)pagez作用域:僅在當前頁面有效。

       2)request作用域:可以通過HttpRequest.getAttribute()方法取得JavaBean物件。

       3)session作用域:可以通過HttpSession.getAttribute()方法取得JavaBean物件。

       4)application作用域:可以通過application.getAttribute()方法取得JavaBean物件。

       JSP九大內建物件的作用域:

       

二application作用域

       application可以作用於整個Web應用程式。接下來我們就測試一下:

       我們有一個JavaBean類為Users,Users.java原始碼:

package com.entity;

/**
 * 使用者實體類的訪問屬性是public
 * @author Administrator
 * @date 2016年7月11日
 */
public class Users {
	//私有屬性
	private String username;
	private String password;
	
	//無參構造器
	public Users(){
		
	}

	//通過重構得到setter和getter方法
	public String getUsername() {
		return username;
	}

	public void setUsername(String username) {
		this.username = username;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}

}

       我們做的登入頁面login.jsp原始碼:

<span class="tag" style="border: 0px; margin: 0px; padding: 0px; color: rgb(0, 0, 136);"></span><%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>登入頁面</title>
</head>
<body>
     <h1>登入表單</h1>
     <hr>
     <form name="loginForm" action="dologin.jsp" method="post">
         <table>
              <tr>
                  <td>使用者名稱:</td>
                  <td><input type="text" name="username" value="" /></td>
              </tr>
              <tr>
                  <td>密碼:</td>
                  <td><input type="password" name="password" value="" /></td>
              </tr>
              <tr>
                  <td colspan="2" align="center"><input type="submit" value="登入" /></td>
              </tr>
         </table>
     </form>
</body>
</html><span class="tag" style="border: 0px; margin: 0px; padding: 0px; color: rgb(0, 0, 136);"></span>

       在先前的dologin.jsp頁面稍加改動:

<span class="tag" style="border: 0px; margin: 0px; padding: 0px; color: rgb(0, 0, 136);"></span><%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>登入頁面</title>
</head>
<body>
      <%
            //防止中文亂碼
            request.setCharacterEncoding("utf-8"); 
       %>
      <h1>setProperty動作元素的使用</h1>
      <hr>
      <jsp:useBean id="myUsers" class="com.entity.Users" scope="application"></jsp:useBean>
      
      <!-- 通過request物件得到屬性值 -->
      使用者名稱:<%=request.getParameter("username") %><br>
      密碼:<%=request.getParameter("password") %><br>


      <hr>
      <!-- 根據表單自動匹配所有屬性 -->
      <jsp:setProperty property="*" name="myUsers"/>
      使用者名稱:<%=myUsers.getUsername() %><br>
      密碼:<%=myUsers.getPassword() %><br>
      
      <hr>
      <!-- 根據表單匹配部分的屬性 -->
      <jsp:setProperty property="username" name="myUsers"/>
      <jsp:setProperty property="password" name="myUsers"/>
      使用者名稱:<%=myUsers.getUsername() %><br>
      密碼:<%=myUsers.getPassword() %><br>
      
      <hr>
      <!-- 跟表單無關,通過手動賦值給屬性 -->
      <jsp:setProperty property="username" name="myUsers" value="Rose" />
      <jsp:setProperty property="password" name="myUsers" value="888888" />
      使用者名稱:<%=myUsers.getUsername() %><br>
      密碼:<%=myUsers.getPassword() %><br>
       
      <hr>
      <!-- 通過URL傳引數給屬性賦值 -->
      <jsp:setProperty property="username" name="myUsers" param="user" />
      <jsp:setProperty property="password" name="myUsers" param="pass" />
      使用者名稱:<%=myUsers.getUsername() %><br>
      密碼:<%=myUsers.getPassword() %><br>


      <hr>
      <h1>測試JavaBean的四個作用域範圍</h1>
      <a href="scope.jsp">測試JavaBean的四個作用域範圍</a>
      
</body>
</html><span class="tag" style="border: 0px; margin: 0px; padding: 0px; color: rgb(0, 0, 136);"></span>

       我們新建的scope.jsp頁面原始碼:

<span class="tag" style="border: 0px; margin: 0px; padding: 0px; color: rgb(0, 0, 136);"></span><%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!-- 引入包 -->
<%@ page import="com.entity.Users" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>JavaBean作用域範圍</title>
</head>
<body>
      <h1>JavaBeab的四個作用域範圍</h1>
      <hr>
      <jsp:useBean id="myUsers" class="com.entity.Users" scope="application"></jsp:useBean>
      
      使用者名稱:<jsp:getProperty property="username" name="myUsers"/><br>
      密碼:<jsp:getProperty property="password" name="myUsers"/><br>
      
      <!-- 使用內建物件application獲取使用者名稱和密碼 -->
      <hr>
      使用者名稱:<%=((Users)application.getAttribute("myUsers")).getUsername() %><br>
      密碼:<%=((Users)application.getAttribute("myUsers")).getPassword() %><br>
</body>
</html><span class="tag" style="border: 0px; margin: 0px; padding: 0px; color: rgb(0, 0, 136);"></span>

       還是從login.jsp頁面進行測試的結果:

       

 三session作用域

       在dologin.jsp頁面繼續修改:

       

       在scope.jsp頁面新增程式碼:

       

       最終結果:

       

 四request作用域

       繼續在dologin.jsp頁面修改:

       

       scope.jsp頁面新增程式碼:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!-- 引入包 -->
<%@ page import="com.entity.Users" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>JavaBean作用域範圍</title>
</head>
<body>
      <h1>JavaBeab的四個作用域範圍</h1>
      <hr>
      <jsp:useBean id="myUsers" class="com.entity.Users" scope="request"></jsp:useBean>
      
      使用者名稱:<jsp:getProperty property="username" name="myUsers"/><br>
      密碼:<jsp:getProperty property="password" name="myUsers"/><br>
      
      <!-- 使用內建物件application獲取使用者名稱和密碼 -->
      <hr>
      使用者名稱:<%=((Users)application.getAttribute("myUsers")).getUsername() %><br>
      密碼:<%=((Users)application.getAttribute("myUsers")).getPassword() %><br>
      
      <!-- 使用內建物件session獲取使用者名稱和密碼 -->
      <hr>
      使用者名稱:<%=((Users)session.getAttribute("myUsers")).getUsername() %><br>
      密碼:<%=((Users)session.getAttribute("myUsers")).getPassword() %><br>
      
      
      <!-- 使用內建物件request獲取使用者名稱和密碼 -->
      <hr>
      使用者名稱:<%=((Users)request.getAttribute("myUsers")).getUsername() %><br>
      密碼:<%=((Users)request.getAttribute("myUsers")).getPassword() %><br>
      
</body>
</html>

       測試結果:

       

       dologin.jsp頁面中的超連結輸入輸入重定向,相當於向伺服器傳送了一次新的請求,因此獲取的都是null。

       要想獲得使用者名稱和密碼。需要在dologin.jsp頁面中修改使用伺服器轉發:

       
       測試結果:

       

五page作用域

       繼續在dologin.jsp頁面中修改:

       

       scope.jsp頁面原始碼:

<span class="tag" style="border: 0px; margin: 0px; padding: 0px; color: rgb(0, 0, 136);"></span><%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!-- 引入包 -->
<%@ page import="com.entity.Users" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>JavaBean作用域範圍</title>
</head>
<body>
      <h1>JavaBeab的四個作用域範圍</h1>
      <hr>
      <jsp:useBean id="myUsers" class="com.entity.Users" scope="page"></jsp:useBean>
      
      使用者名稱:<jsp:getProperty property="username" name="myUsers"/><br>
      密碼:<jsp:getProperty property="password" name="myUsers"/><br>
      
      <%-- 
      <!-- 使用內建物件application獲取使用者名稱和密碼 -->
      <hr>
      使用者名稱:<%=((Users)application.getAttribute("myUsers")).getUsername() %><br>
      密碼:<%=((Users)application.getAttribute("myUsers")).getPassword() %><br>
      
      <!-- 使用內建物件session獲取使用者名稱和密碼 -->
      <hr>
      使用者名稱:<%=((Users)session.getAttribute("myUsers")).getUsername() %><br>
      密碼:<%=((Users)session.getAttribute("myUsers")).getPassword() %><br>
      
      
      <!-- 使用內建物件request獲取使用者名稱和密碼 -->
      <hr>
      使用者名稱:<%=((Users)request.getAttribute("myUsers")).getUsername() %><br>
      密碼:<%=((Users)request.getAttribute("myUsers")).getPassword() %><br>
      --%>
      
      <!-- 使用內建物件pageContext獲取使用者名稱和密碼 -->
      <hr>
      <%
            String username = "";
            String password = "";
            if(pageContext.getAttribute("myUsers")!=null){
            <span style="white-space:pre">	</span>username = ((Users)pageContext.getAttribute("myUsers")).getUsername();
            <span style="white-space:pre">	</span>password = ((Users)pageContext.getAttribute("myUsers")).getPassword();
            }
      %>
      使用者名稱:<%=username %><br>
      密碼:<%=password %><br>
</body>
</html><span class="tag" style="border: 0px; margin: 0px; padding: 0px; color: rgb(0, 0, 136);"></span>

       執行結果:

       

六總結

       scope取值page

       有效範圍為包含<jsp:useBean>元素的JSP檔案以及此檔案中的所有靜態包含檔案,直到頁面執行完畢向客戶端發

迴響應或轉到另一個頁面為止。JavaBean例項被儲存在當前頁面的pageContent物件內.使用者可以通過隱含物件

pageContext訪問JavaBean。

       程式碼如下: pageContext.getAttrib(beanIntanceName)

       其中beanInstanceName為useBean標籤中宣告JavaBean例項的id屬性值。

       scope取值request

       有效範圍為任何執行相同請求的JSP頁面中,直到頁面執行完畢向客戶端發回響應或轉到另一個頁面止。

JavaBean例項被儲存在ServletRequest物件內.使用者可以通過隱含物件request訪問JavaBean。

       程式碼如下:request.getAttribute(beanInstanceName) 

       其中beanInstanceName為useBean標籤中宣告JavaBean例項的id屬性值.