wiki:waue/2010/0603

Version 4 (modified by waue, 14 years ago) (diff)

--

整合 jsp + servlet + javabean
eclipse

重點

JSP、Servlet 與 JavaBean? 的組合應用

Servlet 的 Java 類別是繼承自 javax.servlet.HttpServlet?,因此具有接收 HTTP request 和送出 HTTP response 等網站應用程式的基本功能, 而 JavaBeans? 則只是單純的類別,它可以繼承自任何類別,但無法處理 HTTP 訊息,它在網站應用程式中的角色通常是作為參數物件(在 JSP 和 servlet 之間傳遞, 以共享資訊)或工具類別,作為參數物件時,通常代表種資料,因此被稱為 value bean,作為工具類別時,則稱為 utility bean。

只要你遵守 JavaBeans? 規範中所建議的命名和設計慣例,而且你以 bean 的方式使用它,那麼它就可以稱為一個 bean。

要讓 JSP 能夠使用你的 bean,你的 bean 必須提供一組屬性,JSP 便可以透過特殊的標籤來存取這個 bean 的屬性。所謂的屬性,其實是一組 getter 和 setter methods

public class EmployeeBean {
    private int age;
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        self.age = age;
    }
}
<jsp:useBean id="emp" class="com.huanlin.EmployeeBean" scope="request"/>
<jsp:setProperty name="emp" property="age" value="25" />
員工的年齡是: <jsp:getProperty name="emp" property="age" />

其中

  • <jsp:useBean> 標籤就是指明要使用一個 bean 物件,id 代表該物件的名稱,class 指明了要使用什麼類別的 bean,scope 則代表物件的生命週期。
  • <jsp:setProperty> 標籤用來設定 bean 的屬性值,property 指明了要設定哪個屬性,value 就是數值,要別注意的是,HTML 表單傳入的資料一定是字串,但我們的 age 屬性卻是整數,這個部分的轉換會由 Web container 幫我們處理掉。
  • <jsp:getProperty> 標籤是用來取得 bean 的屬性值。

請特別注意兩點:

  1. 屬性的大小寫。在 JSP 裡面,屬性的名稱是完全小寫的 "age",但是 getter 和 setter methods 的名稱卻是 getAge() 和 setAge(),這種名稱的轉換對應規則是固定的,照這個規則來命名,Web container 就能夠找到正確的存取方法。
  2. 對於 OOP 觀念不熟的人來說,可能會誤以為在 JSP 裡面存取的 "age" 屬性,就是類別定義裡面的那個宣告為 private 成員(age),其實兩者只有字面上相同而已,實際運作是可以毫無關聯的,因為 JSP 完全是透過 getter 和 setter 方法來存取屬性,況且外界本來就無法存取類別的私有成員。
  • 作者給的原始碼,其中判斷質數的範例可以 work ,而其他跟 servlet 溝通的範例則永遠都顯示 "從 servlet 傳來的訊息: null " ,與作者要印出的hello world 有出入

參考