aijava

          welcome to my online log ! open java new world! Taste java charm........
          posts - 1, comments - 4, trackbacks - 0, articles - 42
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

          Struts 用戶指南(2)

          Posted on 2006-11-05 21:46 閱讀(160) 評論(0)  編輯  收藏 所屬分類: Struts框架學習
          這一章集中于創建應用程序中的 View 組件的任務,主要使用JSP技術建立。特別的,Struts除了提供了與輸入表單的交互外還提供了建立國際化應用程序的支持。幾個其它的與View相關的主題也被簡單地討論。

          3.2 國際化消息

          幾年之前,應用程序開發者能夠考慮到僅僅支持他們本國的只使用一種語言(或者有時候是兩種)和通常只有一種數量表現方式(例如日期、數字、貨幣值)的居民。然而,基于web技術的應用程序的爆炸性增長,以及將這些應用程序展開在Internet或其它被廣泛訪問的網絡之上,已經在很多情況下使得國家的邊界淡化到不可見。這種情況轉變成為一種對于應用程序支持國際化(經常被稱做“i18n”,因為18是字母“i”和字母“n”之間的字母個數)和本地化的需求。

          Struts建立于Java平臺之上為建立國際化和本地化的應用程序提供幫助。需要熟悉的關鍵概念是:

          Locale - 基礎的支持國際化的Java類是 java.util.Locale 。每個 Locale 代表一個特別的國家和語言選擇(加上一個可選的語言變量),以及一套格式假定,例如數字和日期等等。

          ResourceBundle - java.util.ResourceBundle 類提供支持多種語言消息的基本工具。查看文檔中關于ResourceBundle 類以及你的JDK版本的文檔包中關于國際化的更多內容。

          PropertyResourceBundle - 一個 ResourceBundle 類的標準實現允許你使用與初始化properties文件同樣的“name=value”語法來定義資源。這對于使用為用于一個web應用程序的消息準備資源包是非常方便的,因為這些消息通常都是面向文本的。

          MessageFormat - java.text.MessageFormat 類允許你使用運行時指定的參數替換一個消息字符串中的一部分(在這種情況下,是一個從一個資源包得到的消息)。這在你創建一個句子的場合中是有用的,但是詞會以不同的語言按照不同的順序出現。消息中的占位符字符串{0}用第一個運行時參數替換,{1}用第二個運行時參數替換,以此類推。

          MessageResources - Struts的類 org.apache.struts.util.MessageResources 使你能夠將一套資源包視做一個數據庫,并且允許你為一個特定的Locale(通常是與當前用戶相對應)請求一個特定的消息,而不是為服務器運行在其中的缺省的Locale請求消息。

          對于一個國際化的應用程序,遵照JDK文檔包中國際化文檔所描述的步驟來創建一個包含每種語言的消息的屬性文件。下面舉一個例子說明。

          假設你的源代碼建立在包 com.mycompany.mypackage 中,因此它保存于一個叫做(相對于你的源目錄)com/mycompany/mypackage 的目錄中。為創建一個叫做 com.mycompany.mypackage.MyResources 的資源包,你應該在目錄 com/mycompany/mypackage 中創建下列文件:

          MyResources.properties - 包含你的服務器的缺省語言的消息。如果你的缺省語言是英語,你可能有一個這樣的條目:

          prompt.hello=Hello

          MyResources_xx.properties - 包含ISO語言編程為“xx”(查看ResourceBundle的Java文檔頁面得到一個當前列表的聯接)的同樣的消息。對于上面的消息的法語版,你可以有這個條目:

          prompt.hello=Bonjour

          你可以有你需要的任意多的語言的資源包文件。

          當你在web應用程序展開描述符中配置controller servlet時,你需要在一個初始化參數中定義的一件事是應用程序的資源包的基礎名。在上述的情況中,這應該是 com.mycompany.mypackage.MyResources 。

          3.3 表單和FormBean的交互

          大部分web開發者曾經使用HTML的標準性能來建立表單,例如使用 標記。用戶希望交互程序具有一定的行為,這些期待中的一個與錯誤處理有關 -- 如果用戶出現一個錯誤,應用程序應該允許他們僅僅修改需要修改的部分 -- 而不需要重新敲入當前頁面或表單中的任何其它信息。

          使用標準的HTML和JSP編程來完全實現這個期望是單調而繁重的。舉例來說,一個用戶名字段的輸入元素看起來可以象是這樣(在JSP中)

          <input type="text" name="username"
          value="<%= loginBean.getUsername() %>">


          這很難敲對,會把沒有編程概念的HTML開發者搞糊涂,并且會在HTML編輯器中造成問題。取而代之的是,Struts提供了一種全面的基于JSP 1.1的定制標記庫功能的機制來建立表單。上面的情況使用Struts處理后將象是這樣:

          <struts:text name="username"/>


          沒有必要再顯式地涉及到從中獲得初始值的JavaBean。這將由框架自動處理。

          3.3.1 使用Struts建立表單

          一個完整的注冊表單將演示Struts相對于直接使用HTML和標準的JSP功能怎樣極大地減輕了處理表單的痛苦??紤]以下稱為logon.jsp的頁面(來自Struts的例子程序):

          <%@ page language="java" %>
          <%@ taglib uri="/WEB-INF/struts.tld" prefix="struts" %>
          <html>
          <head>
          <title><struts:message key="logon.title"/></title>
          <body bgcolor="white">
          <struts:errors/>
          <struts:form action="logon.do" name="logonForm"
          type="org.apache.struts.example.LogonForm"/>
          <table border="0" width="100%">
          <tr>
          <th align="right">
          <struts:message key="prompt.username"/>
          </th>
          <td align="left">
          <struts:text name="username" size="16"/>
          </td>
          </tr>
          <tr>
          <th align="right">
          <struts:message key="prompt.password"/>
          </th>
          <td align="left">
          <struts:password name="password" size="16"/>
          </td>
          </tr>
          <tr>
          <td align="right">
          <struts:submit>
          <struts:message key="button.submit"/>
          </struts:submit>
          </td>
          <td align="right">
          <struts:reset>
          <struts:message key="button.reset"/>
          </struts:reset>
          </td>
          </tr>
          </table>
          </struts:form>
          </body>
          </html>


          下面的條目基于這個例子演示在Struts中處理表單的關鍵的特性:

          taglib指令告訴JSP頁面編譯器從哪里找到Struts標記庫的 標記庫描述符 。在這種情況下,我們使用struts作為前綴來標識來自這個庫中的標記,但是可以使用任何你想用的前綴。

          這個頁面使用了幾個 message 標記來從一個包含有這個應用程序所有資源的 MessageResources 對象中查找國際化的消息字符串。為了讓這個頁面能夠工作,以下的消息關鍵字必須在這些資源中被定義:

          logon.title - 注冊頁面的標題

          prompt.username - 一個 “Username:” 提示字符串

          prompt.password - 一個 “Password:” 提示字符串

          button.submit - “Submit”按鈕的標簽

          button.reset - “Reset”按鈕的標簽

          當用戶注冊時,應用程序可以在用戶的session中保存一個 Locale 對象。這個 Locale 將用來選擇適當語言的消息。這使得給用戶一個切換語言的可選項實現起來變的容易了 -- 僅僅改變保存的 Locale 對象,所有的消息就會自動切換。

          errors 標記顯示由一個商業邏輯組件保存的任何出錯消息,或者如果沒有出錯消息保存就什么都沒有。這個標記將在下面做深入的描述。

          form 標記基于指定的屬性對一個HTML 元素進行處理。它也將所有在這個表單中的字段與一個保存在關鍵字 logonForm 下的session范圍的FormBean相關聯。這個bean用來為所有的具有與bean中的屬性名匹配的名字的輸入字段提供初始值。如果適當的bean沒有找到,一個新的bean將會被自動建立,使用指定的Java類名。

          text 標記對一個類型為“text”的HTML 元素進行處理。在這種情況下,占據瀏覽器屏幕的字符位置的數字也被指定。當頁面被執行時,是相對應的bean的 username 屬性的當前值(也就是 getUsername() 的返回值)。

          password 標記使用方法類似。不同之處是當用戶敲入他們的口令時瀏覽器將回應星號字符,而不是輸入值。

          submit 和 reset 標記在表單低部生成相應的按鈕。每個按鈕的文本標簽使用 message 標記建立,同時帶有提示,這樣這些值就是國際化的。

          3.3.2 輸入字段類型支持

          Struts為所有以下類型的輸入字段定義了標記,帶有與其相應的參考信息的超聯接。

          checkboxes

          hidden 字段

          password 輸入字段

          radio 按鈕

          reset 按鈕

          select 列表和嵌入的

          options

          submit 按鈕

          text 輸入字段

          textareas

          在所有情況下,一個字段標記都必須嵌套在一個 form 標記中,這樣字段才知道使用哪個bean來初始化顯示的值。

          3.3.3 其它有用的表示標記

          在Struts的標記庫中有幾個其它的標記對于建立用戶界面是有幫助的:

          enumerate 為一個指定集合的每個元素重復一次標記體(可以是一個Enumeration,一個Hashtable,一個Vector或一個對象數組)。

          getProperty 從指定的bean中得到指定的屬性,并且在本頁面的其余部分作為一個page范圍的bean存在。這是訪問一個被 enumerate 使用的集合的方便的方法。

          ifAttributeExists 只有在一個指定的屬性存在于一個指定的范圍中時才對標記體求值。

          ifAttributeMissing 只有在一個指定的屬性不存在于一個指定的范圍中時才對標記體求值。

          ifParameterEquals 只有在一個指定的請求參數具有一個指定的值時才對標記體求值。

          ifParameterNotEquals 只有在一個指定的請求參數不具有一個指定的值或者不存在時才對標記體求值。

          ifParameterNotNull 只有在一個指定的請求參數包含在這個請求中并且長度大于0時才對標記體求值。

          ifParameterNull 只有在一個指定的請求參數不包含在這個請求中或者長度等于0時才對標記體求值。

          iterate 為一個指定集合中的每個元素重復一次標記體(可以是一個Collection,一個Iterator,一個Map,或者一個對象數組)。這個標記在Java2環境中代替了 enumerate 標記。

          link 生成一個超聯接,當沒有cookie支持時自動應用URL編程來維護session狀態。

          parameter 處理指定請求參數的值,適當地過濾HTML中有特殊含義的字符。

          property 顯示一個表單中命名的bean屬性 -- 在屬性應該是只讀時使用這個標記而不是 text 標記。

          3.3.4 自動表單驗證

          除了上面描述的表單和bean的交互外,如果你的bean知道怎樣驗證它接收的輸入字段,Struts還提供一種附加的機制。為了利用這個特性,使你的bean類實現 ValidatingActionForm 接口,而不是 ActionForm 接口。一個 ValidatingActionForm 增加了一個附加的方法簽名:

          public String[] validate()

          對于一個被controller servlet在bean屬性已經組裝但是在相應的行為類的 perform() 方法被調用之前調用的方法,validate() 方法有以下可選項:

          執行適當的驗證發現沒有錯誤 -- 返回 null 或者一個非0長度字符串數組,并且controller servlet將繼續調用適當的 Action 類的 perform() 方法。

          執行適當的驗證發現有錯誤 -- 返回一個內容為應該被顯示的出錯消息關鍵字(進入應用程序的MessageResources 包)的字符串數組。controller servlet將作為適合于 標記使用的請求屬性保存這個數組,并且將控制重定向回輸入表單(由這個 ActionMapping 的 inputForm 屬性標識)。

          正如以前提到的,這個特性完全是可選的。如果你的form bean 僅僅實現了 ActionForm 接口,controller servlet將假設任何請求的驗證由action類完成。

          3.4 其它的表示技術

          盡管你的應用程序的外表和感覺可以完全基于標準的JSP能力和Struts的定制標記庫構建,你也應該考慮展開其它改進組件重用、減少管理負擔或者減少出錯的技術。在下面的部分討論幾個可選的技術。

          3.4.1 特定于應用程序的定制標記

          在使用Struts庫提供的定制標記之外,很容易建立特定于你創建的應用程序的標記來幫助建立用戶界面。Struts包括的例子程序用建立以下僅用于實現這個應用程序的標記演示了這個原則:

          checkLogon - 檢查一個特殊的會話對象的存在,如果不存在將控制重定向到注冊頁面。這是用來捕捉這樣的情況,用戶在你的應用程序執行的中間把一個頁面做成書簽并且試圖跳過注冊,或者用戶的會話超時。

          linkSubscription - 為一個詳細的定單頁面生成一個超聯接,它將需要的主關鍵字值作為一個請求屬性傳遞。這在列出與一個用戶相關的定單并提供編輯或刪除定單的聯接時使用。

          linkUser - 為一個用戶的一個具體的頁面生成一個超聯接,它將它將需要的主關鍵字值作為一個請求屬性傳遞。

          這些標記的源代碼在 src/example 目錄中,在包 org.apache.struts.example 里,還帶有一些其它的用在這個應用程序中的Java類。

          3.4.2 有包含文件的頁面組件

          在一個JSP文件(包含定制標記和beans用來訪問請求的動態數據)中創建完整的表示是一種非常普通的設計方法,在Struts包括的例子程序中被采用。然而很多應用程序要求在單獨一個頁面中顯示你的應用程序的多個邏輯上獨立的部分。

          舉例來說,一個入口應用程序可以在入口的主頁面上有一些或者全部以下的功能:

          訪問這個入口的一個搜索引擎。

          一個或更多的“提供新聞”的顯示,含有按照用戶的注冊信息定制的感興趣的標題。

          訪問與這個入口相關的討論的主題。

          如果你的入口提供免費郵件帳號,還要有一個“郵件等待”的提示。

          如果你能夠將工作劃分開,分配不同的開發者去做不同的片段,那么這個站點不同片段的開發就會更加簡單。然后,你可以使用JSP技術的 include 能力來將這些片段組合進一個單獨的頁面。有兩種 include 可用,依賴于你希望輸出的組合發生在什么時間:

          include 指令 ( )在JSP頁面被編譯時處理。它用于包括不需要在請求時改變的HTML代碼。它把包括進來的文本當作靜態文本,很象C或C++中的 #include 指令。

          include 行為 ( )在請求時處理,并且是由服務器透明處理。這意味著你可以通過把它嵌套在一個類似ifParameterEquals的標記中有條件地執行include 。

          3.4.3 圖片處理組件

          一些應用程序要求動態生成圖片,就象一個股市報告站點的價格圖一樣。通常使用兩種不同的方法來實現這個需求:

          處理一個執行一個servlet請求的URL的超聯接。這個servlet將使用一個圖象庫來生成圖片,設置適當的content類型(例如 image/gif),并且將圖片的字節流發送回瀏覽器。瀏覽器就會象從一個靜態文件中接收到的一樣顯示圖片。

          處理HTML代碼需要下載一個創建請求的圖象的Java applet。你可以通過為在處理的代碼中的這個applet設置適當的初始化參數配置這個圖象,或者你可以讓這個applet與服務器建立自己聯接來接收這些參數。
          http://freehost13.websamba.com
          主站蜘蛛池模板: 利辛县| 永兴县| 华亭县| 德昌县| 都昌县| 阿勒泰市| 通河县| 祁连县| 乾安县| 綦江县| 凤庆县| 香港 | 曲阳县| 白河县| 财经| 鄂伦春自治旗| 彭州市| 中西区| 马公市| 岢岚县| 青浦区| 扎赉特旗| 和平区| 稻城县| 宁明县| 建昌县| 饶阳县| 开平市| 洮南市| 盐边县| 普兰店市| 眉山市| 涡阳县| 海口市| 格尔木市| 沭阳县| 遂溪县| 永寿县| 巴马| 赣榆县| 兴仁县|