[翻譯]JavaBean組件與JSP技術結合

來源:互聯網
上載者:User
Web架構師Brett McLaughlin向我們展示了怎樣利用JavaBean和JSP技術在Web頁面中儲存和傳遞資料,以及如何設計可以得到更大的靈活性。

到目前為止,在JSP最佳實務系列裡,我們已經討論了相當一部分基礎知識。在前面的兩個章節裡,你應該學會了如何使用JSP的include機制將網站以外的內容包含在頁面或應用程式裡。共有兩種不同類型的include:靜態include命令和動態jsp:include標記。

同時,我們還沒有涉及到在父頁面(在我們的例子中是網站的首頁)和被包含內容之間的通訊問題。而實際上這種情況是非常普遍的。當你開始建立一個真正的網站或者web應用程式時,通常你會需要這樣的通訊機制,舉個例子,你的網站可能會在首頁產生一些標題一類的小段文字,這些文字要出現在頁首或頁尾頁面中。在這一部分裡,你將學到如何在頁面間傳遞資料,以及如何在被包含的頁面中使用這些資料。

註:這部分的全部例子都基於JavaServer Pages技術,為了能運行它們,你需要建立一個JSP相容的web容器,在你本機電腦或某個用於測試的伺服器上都可以。同時,你還要有一個文字編輯器或者Integration Environment來編寫你的JSP頁面。

用於儲存資料的JavaBean

讓我們假想這樣的一個網站,在這個網站裡每個頁面有一小句“口號”(例如“書:裝滿知識的容器”或者“唱片:值得一聽”)和一個標題。父頁面(有時也被稱作首頁面)決定了每一頁的口號,但真正產生html輸出這個口號的是頁首頁面,它是被包含的。要實現這個目的,父頁面必須能夠把口號傳遞給頁首頁面,頁首頁面得到這個口號,將它以頁面標題的形式輸出。

首先我們需要某種對象來儲存被傳遞的資料,恰好(這並非偶然)JavaBean組件就是這樣一個合適的選擇,它與JSP技術配合得天衣無縫,簡單的使用取值方法和賦值方法就可以控制你要的資料。稍有java編程經驗的讀者可能已經想到,get()就是一個取值方法,因為它讀取資料;而set()是一個賦值方法,因為它改變資料。
列表1展示了我們所需要的一個JavaBean的代碼,PageHeaderinfo包含了網站頁首資訊。<![CDATA[
package com.newInstance.site.beans;
import java.io.Serializable;
public class PageHeaderInfo implements Serializable {
     /** The title of the page */
     private String pageTitle;
     /** The slogan of the page */
     private String pageSlogan;
     public String getPageTitle() {
       return pageTitle;
     }
     public void setPageTitle(String pageTitle) {
       this.pageTitle = pageTitle;
     }
     public String getPageSlogan() {
       return pageSlogan;
     }
     public void setPageSlogan(String pageSlogan) {
       this.pageSlogan = pageSlogan;
     }
}
]]>

作為第一個練習,將這個檔案儲存為PageHeaderInfo.java並編譯它。接下來,把得到的class檔案PageHeaderInfo.class放在你的web應用程式的WEB-INF/classes目錄下。請確保目錄包含了包的結構,例如:
$<TOMCAT-ROOT>/webapps/$<WEB-APP-NAME>/WEB-INF/classes/com/newInstance/  site/beans/PageHeaderInfo.class

你可以使用類似這樣的路徑安排web應用程式中用到的類。按以上步驟做到這裡,下面就可以向PageHeaderInfo裡存入資料然後在不同的JSP頁面中擷取了。

傳遞已儲存的資料

在我們的網站裡,頁首頁麵包含向不同頁面傳遞不同口號的代碼。查看前面的章節就會發現,頁首頁面(header.jsp)是通過jsp:include標記被包含的檔案。列表2展示了網站首頁如何通過標記把資料傳遞給header.jsp檔案。<![CDATA[
<%@ page language="java" contentType="text/html" %>
<html>
<head>
     <title>newInstance.com</title>
     <meta http-equiv="Content-Type" 
       content="text/html; charset=iso-8859-1" />
     <link href="/styles/default.css" rel="stylesheet" type="text/css" />
</head>

<body>
<jsp:include page="header.jsp" flush="true">
     <jsp:param name="pageTitle" value="newInstance.com"/>
     <jsp:param name="pageSlogan" 
       value="Java and XML :: Turning theory into practice" />
</jsp:include>
<%@ include file="/navigation.jsp" %>
<jsp:include page="bookshelf.jsp" flush="true" />

<jsp:include page="/mt-blogs/index.jsp" flush="true" />

<%@ include file="/footer.jsp" %>
</body>
</html>
]]>

可以看出,標題是被傳遞過去作為口號的。

你可能已經注意到了,在你建立頁面的時候,不一定需要JavaBean組件實際存在。我總是先寫好JavaBean,有一個很好的理由:JSP參數名必須與JavaBean屬性名稱匹配,先完成JavaBean可以保證你在編寫JSP頁面時使用合適的參數名稱。

獲得資料

當你完成了JSP參數和JavaBean屬性的編碼,一旦資料被傳遞給header.jsp,這個頁面就可以開始擷取資料了。列表3展示了header.jsp頁面。它的大部分內容是html,請注意裡面的JSP指令碼,在你研究過這些代碼後我會在後面向你解釋。<![CDATA[
<!-- Begin header section -->
<%@ page language="java" contentType="text/html" %>
<jsp:useBean id="pageHeaderInfo"
class="com.newInstance.site.beans.PageHeaderInfo">
     <jsp:setProperty name="pageHeaderInfo" property="*" />
</jsp:useBean>

<table width="100%" border="0" cellspacing="0" cellpadding="0">
     <tr>
       <td width="91" height="50" align="right" valign="top"
           bgcolor="#330066"><font color="#FFFFFF"><img
           src="http://images.cnblogs.com/header-lions.gif" 
           width="90" height="60"></font></td>
       <td colspan="3" align="left" valign="top"
           bgcolor="#000000"><table width="100%" height="60" border="0"
           cellpadding="0" cellspacing="0">
           <tr>
             <td width="261" rowspan="2"><img
               src="http://images.cnblogs.com/header-title.gif" width="261" height="60"></td>
             <td class="pagetitle" width="249" height="55" align="right"
               valign="bottom"><jsp:getProperty name="pageHeaderInfo"
               property="pageSlogan"/></td>
             <td width="10" height="55">&nbsp;</td>
           </tr>
           <tr>
             <td height="5"><img src="http://images.cnblogs.com/spacer.gif" width="1"
               height="5"></td>
             <td height="5"><img src="http://images.cnblogs.com/spacer.gif" width="1"
               height="5"></td>
           </tr>
         </table></td>
       <td width="141" bgcolor="#000000">
         <font color="#FFFFFF">&nbsp;</font>
       </td>
     </tr>
<!-- End header section -->
]]>

第一行代碼標識了該頁面為一個JSP頁面,然後通過jsp:useBean標記聲明需要訪問PageHeaderInfo這個JavaBean,id屬性為這個bean指定了一個名稱,通過該名稱可以在JSP頁面中使用bean;class屬性指定了JavaBean類的全名。相鄰的jsp:setProperty標記說明了JavaBean(通過id屬性標識)的所有屬性都以請求資料賦值,也就是說,為這個bean裡的每個屬性(例如pagetitle和pageslogan)尋找名稱對應的請求參數來賦值。這些請求參數可以來自用戶端的瀏覽器,也可以來自包含這一頁的其他JSP頁面。在這種情況下,唯一的請求資料是由父頁面建立的。對於我們的網站,首頁(index.jsp)發送pagetitle和pageslogan,其值分別為“newinstance.com”和“Java and XML: Turning theory into practice”。

一旦bean的屬性被賦值後,頁面就可以使用這些資料了。對於header.jsp,在後面的代碼裡可以看到,通過jsp:getProperty標記使用了這些資料。Jsp;getProperty標記通過name參數標識從哪個對象取資料,通過property參數標識取對象的哪一個屬性。取得的資料值自動插入到頁面的輸出,也就是輸出到父頁面裡,從而得到一個無縫的、動態頁面口號,在JSP頁面間傳遞資料就是這麼簡單!你可以為一個JSP頁面增加任意多的bean,每一個bean都可以有任意多的屬性,足以應付任何複雜的請求資料。

處理需求變化

改變是軟體開發人員最大的煩惱,你寫好了你的bean,在JSP頁面裡也寫好了使用它們的代碼,這時web應用程式的需求似乎不可避免的會發生變化。如果這個改變要求更多的屬性(大多數情況都是如此),你不得不改寫你的JavaBean原始碼,重新編譯它,還要確定JSP頁面能夠正確訪問新產生的bean類。有些情況下,你可以不必對bean進行處理,如果儲存或擷取屬性頁面不再使用了(也就是說,即使那個頁面還在網站的目錄裡,但你不再使用該頁面),這時你可以不用去管原來的代碼即可。實際上,我就遇到過這種情況!

我的個人網站的頁首頁面header.jsp用於產生html的頭部,以前有一段時間裡,這一頁向我的其他頁面頭部裡的title標記裡插入一個標題,後來我做了修改,在header.jsp裡不再使用頁面標題了。但我並沒有從PageHeaderInfo裡把pageTitle移除;實際上,我甚至在大部分JSP頁面裡連jsp:param標記都沒有移除,這個標記的作用本來是為版面設定標題的。我認為花這些工夫不值得,因為我確信保留這些資料不會帶來任何壞的影響(也許某一天我還會重新用到呢!)。因此,如果你遇到同樣的情況,不用浪費時間了--有處理這些瑣事的時間不如用來為你的web應用程式增加些新的、有趣的、實用的功能。

下一次

當你熟練掌握了在JSP頁面間傳遞資料的方法後,試著自己寫一些有用的JavaBean並且看看能不能把它們用在你的網站裡。通過和這些bean的接觸,還有jsp:useBean、jsp:param以及jsp:get/setProperty的使用,你應該能夠做出一些很酷的功能了!在下次的最佳實務裡,我將向你展示使用JSP向網站增加外部內容的方法,JSTL標記和我們熟悉的include標記差不多,它使得JSP更靈活和更高效。在這之前,請用功準備,到時再見!

(這篇文章是一年前翻譯的,當時想找翻譯的活做,也是未果。請參考英文原文。)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.