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屬性值.