<jsp:useBean>
標籤是用來搭配 JavaBean 元件的標準標籤,這邊所指的 JavaBean 並非桌面系統或 EJB(Enterprise JavaBeans)中的 JavaBean 元件,而是只要滿足以下條件的純綷 Java 物件:
- 必須實作
java.io.Serializable
介面 - 沒有公開(
public
)的類別變數 - 具有無參數的建構式
- 具有公開的設值方法(Setter)與取值方法(Getter)
舉個實際的範例來說,以下的類別就是一個 JavaBean 元件:
package cc.openhome;
import java.io.Serializable;
public class User implements Serializable {
private String name;
private String password;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public boolean isValid() {
return "caterpillar".equals(name) && "123456".equals(password);
}
}
雖然你可以直接在 JSP 頁面上撰寫 Scriptlet 來直接使用這個 JavaBean,像是以下的程式片段:
<%@page import="cc.openhome.*"
contentType="text/html" pageEncoding="UTF-8"%>
<%
User user = (User) request.getAttribute("user");
if(user == null) {
user = new User();
request.setAttribute("user", user);
}
user.setName(request.getParameter("name"));
user.setPassword(request.getParameter("password"));
%>
// 略...
<body>
<%
if(user.isValid()) {
%>
<h1><%= user.getName() %> 登入成功</h1>
<%
}
else {
%>
<h1>登入失敗</h1>
<%
}
%>
</body>
</html>
但使用 JavaBean 的目的,基本上是在於減少 JSP 頁面上 Scriptlet 的使用。你應該搭配 <jsp:useBean>
來使用這個 JavaBean,並使用 <jsp:setProperty>
與 <jsp:getProperty>
來對 JavaBean 進行設值與取值的動作。例如:
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<jsp:useBean id="user" class="cc.openhome.User" scope="request"/>
<jsp:setProperty name="user" property="*"/>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>登入頁面</title>
</head>
<body>
<%
if(user.isValid()) {
%>
<h1><jsp:getProperty name="user" property="name"/> 登入成功</h1>
<%
}
else {
%>
<h1>登入失敗</h1>
<%
}
%>
</body>
</html>
<jsp:useBean>
標籤是用來取得或建立 JavaBean。id
屬性用於指定 JavaBean 實例的參考名稱,之後在使用 <jsp:setProperty>
或 <jsp:getProperty>
標籤時,就可以根據這個名稱來取得所建立的 JavaBean 名稱。class
屬性用以指定實例化哪一個類別。scope
指定可先找看看哪個屬性範圍是否有 JavaBean 的屬性存在。
<jsp:setProperty>
標籤用於設定 JavaBean 的屬性值。name
屬性用於指定你要使用哪個名稱取得 JavaBean 實例。在 property
屬性設定 "*"
,表示將自動尋找符合 JavaBean 中設值方法名稱的請求參數值。如果請求參數名稱為 xxx
,就將請求參數值使用 setXxx()
方法設定給 JavaBean 實例。
<jsp:getProperty>
用來取得 JavaBean 的屬性值。name
屬性用於指定你要使用哪個名稱取得 JavaBean 實例。在 property
屬性則指定要取得哪一個屬性值。如果指定為 xxx
,則使用 getXxx()
方法取得 JavaBean 屬性值並顯示在網頁上。
在上面這個 JSP 中,首先使用 <jsp:useBean>
建立 User
類別的實例,而後使用 <jsp:setProperty>
來設定 JavaBean 的值,由於在 property
屬性設定 "*"
,所以會自動找尋請求參數中是否有 name
與 password
參數,如果有的話,將請求參數值透過 setName()
及 setPassword()
方法設定給 JavaBean 實例。
由於使用 <jsp:useBean>
時,指定了 id
屬性為 user
名稱,因此在接下來的頁面中若有 Scriptlet,也可以使用 user
名稱來操作 JavaBean 實例。程式中呼叫了 isValid()
方法,看看使用者的名稱及密碼是否正確。如果正確,<jsp:getProperty>
指定 property
屬性為 name
以取得 JavaBean 中儲存的使用者名稱,以及顯示登入成功字樣。