1. 程式人生 > >回看JSP——jsp:useBean的用法

回看JSP——jsp:useBean的用法

一、jsp:useBean的基本用法

jsp:useBean是一個JSP動作指令,表示裝載一個將在JSP頁面中使用的JavaBean。jsp:useBean的最基本語法如下:

<jsp:useBean id="name" class="package.class" />

其中id表示定義的JavaBean的唯一標識,class表示定義的JavaBean的類。定義了一個JavaBean就可以為其屬性賦值了,可以使用jsp:setProperty動作為JavaBean的屬性賦值,也可以使用jsp:getProperty動作來獲取屬性的值。

二、jsp:getProperty

可以使用jsp:getProperty來獲取指定的JavaBean的值,基本語法如下:
<jsp:getProperty name=”JavaBean例項名” property=”屬性名” />
其中name就是在定義JavaBean例項時使用的id,property就是需要獲取值的屬性名。

三、jsp:setProperty

可以使用jsp:setProperty為已經例項化的JavaBean的屬性賦值,而jsp:setProperty共有四種使用方式。

1、<jsp:setProperty name="JavaBean例項名" property="*" />

這種方法與表單元素相關聯,就是將表單中所有元素與JavaBean屬性進行對應,如果元素名與屬性名相同,則將表單元素的值賦給對應的屬性。可以通過一個例項來解釋一下這個用法,現有一個登入的介面如下,表單中有兩個元素使用者名稱userName和密碼password,表單提交後將由dologin.jsp進行處理。
<%@ 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 action="dologin.jsp" method="post">
		<label for="userName">使用者名稱:</label>
		<input type="text" name="userName" id="userName" value="" />
		<br/>
		
		<label for="password">密碼:</label>
		<input type="password" name="password" id="password" value="" />
		<br/>
		
		<input type="submit" value="登入" />
	</form>
</body>
</html>
接著現有一個JavaBean,名為User,也有兩個屬性userName和password。
public class User {

	private String userName;
	
	private String password;
	
	public User() {
		
	}

	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;
	}
}
現在在dologin.jsp中將表單提交的使用者名稱與密碼全部獲取到,這時就可以使用<jsp:setProperty name="JavaBean例項名" property="*">了。dologin.jsp片段如下:
<jsp:useBean id="user" class="com.imooc.vo.User" scope="page"></jsp:useBean>
	
<h2>跟表單關聯,設定所有的屬性值</h2>
<hr/>
<jsp:setProperty property="*" name="user"/>
使用者名稱:<jsp:getProperty property="userName" name="user"/><br/>
密碼:<jsp:getProperty property="password" name="user"/>
執行專案,先進入login.jsp頁面,輸入使用者名稱zhangsan,密碼123456,點選登入。

登入後可以看到使用者名稱為zhangsan密碼為123456。

2、<jsp:setProperty name="JavaBean例項名" property="JavaBean屬性名" />

這個方法也與表單相關聯,不同的是這裡的屬性不再是全部的屬性都與表單關聯,而是指定相應的屬性與表單關聯,未指定的屬性將不被賦值。修改dologin.jsp程式碼如下:
<h2>跟表單關聯,設定對應元素的屬性值</h2>
<hr/>
<jsp:setProperty property="userName" name="user"/>
使用者名稱:<jsp:getProperty property="userName" name="user"/><br/>
密碼:<jsp:getProperty property="password" name="user"/> 
只指定userName與表單元素關聯,執行程式,仍輸入使用者名稱zhangsan密碼123456,點選登入後,執行結果如下:

可以看到因為指定了userName與表單元素關聯,所以獲取到了userName的值,password沒有關聯,所以獲取到的password元素為空。

3、<jsp:setProperty name="JavaBean例項名" property="JavaBean屬性名" value="BeanValue" />

使用這個方法可以直接為JavaBean的相應屬性賦value裡的值,再次修改dologin.jsp的程式碼。
<h2>直接給指定的屬性賦值</h2>
<hr/>
<jsp:setProperty property="userName" name="user" value="lisi"/>
使用者名稱:<jsp:getProperty property="userName" name="user"/><br/>
密碼:<jsp:getProperty property="password" name="user"/>
在這裡直接給userName賦值lisi,執行程式,儘管在登入頁面輸入了使用者名稱zhangsan,但是點選登陸後給userName賦的值為lisi。

4、<jsp:setProperty name="JavaBean例項名" property="JavaBean屬性名" param="request物件中的引數名" />

使用這個方法通過獲取request的引數來為相應的屬性賦值,其中param為引數名。修改login.jsp的程式碼,在form裡的action中新增一個引數myUserName,值為wangwu。
<%@ 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 action="dologin.jsp?myUserName=wangwu" method="post">
		<label for="userName">使用者名稱:</label>
		<input type="text" name="userName" id="userName" value="" />
		<br/>
		
		<label for="password">密碼:</label>
		<input type="password" name="password" id="password" value="" />
		<br/>
		
		<input type="submit" value="登入" />
	</form>
</body>
</html>
然後在dologin.jsp中獲取這個myUserName的值併為userName賦值,執行程式。
<h2>與request的引數關聯,為指定的屬性賦值</h2>
<hr/>
<jsp:setProperty property="userName" name="user" param="myUserName"/>
<jsp:setProperty property="password" name="user"/>
使用者名稱:<jsp:getProperty property="userName" name="user"/><br/>
密碼:<jsp:getProperty property="password" name="user"/><br/>
執行程式,在登入頁面輸入使用者名稱zhangsan密碼123456,點選提交後獲取到的使用者名稱為wangwu。

四、JavaBean的四個作用域

在使用jsp:useBean時可以使用scope屬性為JavaBean指定作用域,scope的值有四個:page(預設),request,session,application。下面來分別介紹這四個作用域。

1、application作用域

當指定JavaBean的作用域為application表示在整個專案的生命週期中都有效,伺服器重啟後失效。現仍復用上面的登入介面,點選登入後跳轉到dologin.jsp頁面中,為JavaBean設定scope為application,使用<jsp:setProperty name="JavaBean例項名" property="*" />關聯表單為屬性賦值,同時新增一個連結跳轉到testScope.jsp頁面來測試是否能獲取到JavaBean的屬性值。 dologin.jsp程式碼片段如下:
<jsp:useBean id="user" class="com.imooc.vo.User" scope="application"></jsp:useBean>
	
<h2>跟表單關聯,設定所有的屬性值</h2>
<hr/>
<jsp:setProperty property="*" name="user"/>
使用者名稱:<jsp:getProperty property="userName" name="user"/><br/>
密碼:<jsp:getProperty property="password" name="user"/><br/>
<a href="testScope.jsp">測試JavaBean的作用範圍</a> 
testScope.jsp程式碼如下,在這個頁面使用application範圍內的user:
<%@ 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>測試useBean的四種作用範圍</title>
</head>
<body>
	<h1>測試JavaBean的四種作用範圍</h1>
	<jsp:useBean id="user" class="com.imooc.vo.User" scope="application" />
	使用者名稱:<jsp:getProperty property="userName" name="user"/><br/>
	密碼:<jsp:getProperty property="password" name="user"/><br/>
	
</body>
</html>
執行程式,在登入介面輸入使用者名稱zhangsan密碼123456,點選提交,為JavaBean相應的屬性賦值,執行頁面如下:
點選超連結,進入testScope.jsp頁面,仍然可以看到JavaBean的相應屬性值,只要伺服器沒有停止,無論關閉多少次瀏覽器再重新開啟進入testScope.jsp頁面都可以得到如下結果:

2、session作用域

session作用域表示在當前會話週期內有效,只要仍在當前的會話生命週期內,就可以獲取到相應的屬性值。修改dologin.jsp和testScope.jsp裡JavaBean的生命週期為session,執行專案,登入頁面輸入使用者名稱zhangsan密碼123456,點選超連結,只要在當前會話的生命週期內,都可以看到使用者名稱和密碼資訊。
<jsp:useBean id="user" class="com.imooc.vo.User" scope="session" />

3、request作用域

request作用域表示在當前使用者的請求內有效,如果超過了當前請求,則獲取不到相應的JavaBean的值。如果將上述案例的dologin.jsp和testScope.jsp裡的JavaBean的生命週期改為request,再輸入使用者名稱和密碼:
<jsp:useBean id="user" class="com.imooc.vo.User" scope="request"/>
執行程式,可以在dologin.jsp頁面中看到使用者名稱和密碼,但是當跳轉到testScope.jsp後,會得到如下結果: 已經不能獲取使用者名稱和密碼的值了,這是因為一個超連結相當於一個請求重定向,這就意味著再請求testScope.jsp時已經不是之前的請求了,是一個新的請求,這時原有request中的JavaBean就失效了,因此獲取不到使用者名稱和密碼。如果想要獲取到使用者名稱和密碼,就需要使用伺服器內部轉發,這仍就相當於仍是一個請求。修改dologin.jsp片段:
<jsp:useBean id="user" class="com.imooc.vo.User" scope="request"/>
	
<h2>跟表單關聯,設定所有的屬性值</h2>
<hr/>
<jsp:setProperty property="*" name="user"/>
使用者名稱:<jsp:getProperty property="userName" name="user"/><br/>
密碼:<jsp:getProperty property="password" name="user"/><br/>
<!-- <a href="testScope.jsp">測試JavaBean的作用範圍</a>  -->
<% 
<span style="white-space:pre">	</span>request.getRequestDispatcher("testScope.jsp").forward(request, response);
%>
這時在執行程式,點選登入後會直接跳轉到testScope.jsp,可以獲取到相應的屬性值。

4、page作用域

page作用域表示只在當前的頁面有效,所以不管是請求重定向還是伺服器內部轉發,當發生頁面跳轉時都不能獲取到JavaBean的屬性值資訊。page作用域是jsp:useBean的預設作用域,案例這裡就不再贅述了。

五、請求重定向與請求轉發的區別

在講JavaBean的作用域時講到了請求重定向與請求轉發的概念,這個概念很重要,也接觸到不少次了,這裡簡單做一個總結:

1、請求重定向

使用responce.sendRedirect("xx.jsp")來進行重定向。是客戶端的行為:即客戶端會訪問兩次,第一次訪問後會立即跳轉到第二個重定向頁面上,從本質上講等於兩次請求,而前一次的請求封裝的request物件不會儲存,位址列的URL地址會改變。

2、請求轉發

使用request.getRequestDispatcher("xx.jsp").forward(request,response)請求轉發。forward(request,response)用於儲存內建物件request和response。是伺服器的行為:伺服器會代替客戶端去訪問轉發頁面,從本質是一次請求,轉發後請求物件會儲存,位址列的URL地址不會改變。