簡介 <jsp:useBean>、<jsp:setProperty> 與 <jsp:getProperty>


<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 屬性設定 "*",所以會自動找尋請求參數中是否有 namepassword 參數,如果有的話,將請求參數值透過 setName()setPassword() 方法設定給 JavaBean 實例。

由於使用 <jsp:useBean> 時,指定了 id 屬性為 user 名稱,因此在接下來的頁面中若有 Scriptlet,也可以使用 user 名稱來操作 JavaBean 實例。程式中呼叫了 isValid() 方法,看看使用者的名稱及密碼是否正確。如果正確,<jsp:getProperty> 指定 property 屬性為 name 以取得 JavaBean 中儲存的使用者名稱,以及顯示登入成功字樣。