国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

Struts 用戶指南(三)

2019-11-18 15:09:57
字體:
供稿:網(wǎng)友

3. 創(chuàng)建View組件

3.1 概述
這一章集中于創(chuàng)建應(yīng)用程序中的 View 組件的任務(wù),主要使用jsp技術(shù)建立。非凡的,Struts除了提供了與輸入表單的交互外還提供了建立國際化應(yīng)用程序的支持。幾個其它的與View相關(guān)的主題也被簡單地討論。

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

Struts建立于java平臺之上為建立國際化和本地化的應(yīng)用程序提供幫助。需要熟悉的要害概念是:

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

ResourceBundle - java.util.ResourceBundle 類提供支持多種語言消息的基本工具。查看文檔中關(guān)于ResourceBundle 類以及你的JDK版本的文檔包中關(guān)于國際化的更多內(nèi)容。
PRopertyResourceBundle - 一個 ResourceBundle 類的標(biāo)準(zhǔn)實現(xiàn)答應(yīng)你使用與初始化properties文件同樣的“name=value”語法來定義資源。這對于使用為用于一個web應(yīng)用程序的消息預(yù)備資源包是非常方便的,因為這些消息通常都是面向文本的。

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

MessageResources - Struts的類 org.apache.struts.util.MessageResources 使你能夠?qū)⒁惶踪Y源包視做一個數(shù)據(jù)庫,并且答應(yīng)你為一個特定的Locale(通常是與當(dāng)前用戶相對應(yīng))請求一個特定的消息,而不是為服務(wù)器運行在其中的缺省的Locale請求消息。

對于一個國際化的應(yīng)用程序,遵照J(rèn)DK文檔包中國際化文檔所描述的步驟來創(chuàng)建一個包含每種語言的消息的屬性文件。下面舉一個例子說明。

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

MyResources.properties - 包含你的服務(wù)器的缺省語言的消息。假如你的缺省語言是英語,你可能有一個這樣的條目:
prompt.hello=Hello

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

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

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

3.3 表單和FormBean的交互
大部分web開發(fā)者曾經(jīng)使用Html的標(biāo)準(zhǔn)性能來建立表單,例如使用 <input> 標(biāo)記。用戶希望交互程序具有一定的行為,這些期待中的一個與錯誤處理有關(guān) -- 假如用戶出現(xiàn)一個錯誤,應(yīng)用程序應(yīng)該答應(yīng)他們僅僅修改需要修改的部分 -- 而不需要重新敲入當(dāng)前頁面或表單中的任何其它信息。

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

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

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

<struts:text name="username"/>

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

3.3.1 使用Struts建立表單
一個完整的注冊表單將演示Struts相對于直接使用HTML和標(biāo)準(zhǔn)的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標(biāo)記庫的標(biāo)記庫描述符。在這種情況下,我們使用struts作為前綴來標(biāo)識來自這個庫中的標(biāo)記,但是可以使用任何你想用的前綴。

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

logon.title - 注冊頁面的標(biāo)題

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

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

button.submit - “Submit”按鈕的標(biāo)簽

button.reset - “Reset”按鈕的標(biāo)簽

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

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

form 標(biāo)記基于指定的屬性對一個HTML <form> 元素進(jìn)行處理。它也將所有在這個表單中的字段與一個保存在要害字 logonForm 下的session范圍的FormBean相關(guān)聯(lián)。這個bean用來為所有的具有與bean中的屬性名匹配的名字的輸入字段提供初始值。假如適當(dāng)?shù)腷ean沒有找到,一個新的bean將會被自動建立,使用指定的Java類名。

text 標(biāo)記對一個類型為“text”的HTML <input> 元素進(jìn)行處理。在這種情況下,占據(jù)瀏覽器屏幕的字符位置的數(shù)字也被指定。當(dāng)頁面被執(zhí)行時,是相對應(yīng)的bean的 username 屬性的當(dāng)前值(也就是getUsername() 的返回值)。

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

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

3.3.2 輸入字段類型支持
Struts為所有以下類型的輸入字段定義了標(biāo)記,帶有與其相應(yīng)的參考信息的超聯(lián)接。

checkboxes
hidden 字段
password 輸入字段
radio 按鈕
reset 按鈕
select 列表和嵌入的
options
submit 按鈕
text 輸入字段
textareas

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

3.3.3 其它有用的表示標(biāo)記
在Struts的標(biāo)記庫中有幾個其它的標(biāo)記對于建立用戶界面是有幫助的:

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

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

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

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

ifParameterEquals 只有在一個指定的請求參數(shù)具有一個指定的值時才對標(biāo)記體求值。

ifParameterNotEquals 只有在一個指定的請求參數(shù)不具有一個指定的值或者不存在時才對標(biāo)記體求值。

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

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

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

link 生成一個超聯(lián)接,當(dāng)沒有cookie支持時自動應(yīng)用URL編程來維護(hù)session狀態(tài)。

parameter 處理指定請求參數(shù)的值,適當(dāng)?shù)剡^濾HTML中有非凡含義的字符。

property 顯示一個表單中命名的bean屬性 -- 在屬性應(yīng)該是只讀時使用這個標(biāo)記而不是 text 標(biāo)記。

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

public String[] validate()

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

執(zhí)行適當(dāng)?shù)尿炞C發(fā)現(xiàn)沒有錯誤 -- 返回 null 或者一個非0長度字符串?dāng)?shù)組,并且controller servlet將繼續(xù)調(diào)用適當(dāng)?shù)?Action 類的 perform() 方法。

執(zhí)行適當(dāng)?shù)尿炞C發(fā)現(xiàn)有錯誤 -- 返回一個內(nèi)容為應(yīng)該被顯示的出錯消息要害字(進(jìn)入應(yīng)用程序的MessageResources 包)的字符串?dāng)?shù)組。controller servlet將作為適合于 <struts:errors> 標(biāo)記使用的請求屬性保存這個數(shù)組,并且將控制重定向回輸入表單(由這個 ActionMapping 的 inputForm 屬性標(biāo)識)。

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

3.4 其它的表示技術(shù)
盡管你的應(yīng)用程序的外表和感覺可以完全基于標(biāo)準(zhǔn)的JSP能力和Struts的定制標(biāo)記庫構(gòu)建,你也應(yīng)該考慮展開其它改進(jìn)組件重用、減少治理負(fù)擔(dān)或者減少出錯的技術(shù)。在下面的部分討論幾個可選的技術(shù)。

3.4.1 特定于應(yīng)用程序的定制標(biāo)記
在使用Struts庫提供的定制標(biāo)記之外,很輕易建立特定于你創(chuàng)建的應(yīng)用程序的標(biāo)記來幫助建立用戶界面。Struts包括的例子程序用建立以下僅用于實現(xiàn)這個應(yīng)用程序的標(biāo)記演示了這個原則:

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

linkSubscription - 為一個具體的定單頁面生成一個超聯(lián)接,它將需要的主要害字值作為一個請求屬性傳遞。這在列出與一個用戶相關(guān)的定單并提供編輯或刪除定單的聯(lián)接時使用。
linkUser - 為一個用戶的一個具體的頁面生成一個超聯(lián)接,它將它將需要的主要害字值作為一個請求屬性傳遞。

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

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

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

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

一個或更多的“提供新聞”的顯示,含有按照用戶的注冊信息定制的感愛好的標(biāo)題。

訪問與這個入口相關(guān)的討論的主題。

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

假如你能夠?qū)⒐ぷ鲃澐珠_,分配不同的開發(fā)者去做不同的片段,那么這個站點不同片段的開發(fā)就會更加簡單。然后,你可以使用JSP技術(shù)的 include 能力來將這些片段組合進(jìn)一個單獨的頁面。有兩種 include 可用,依靠于你希望輸出的組合發(fā)生在什么時間:

include 指令(<%@ include file="xxxxx" %>)在JSP頁面被編譯時處理。它用于包括不需要在請求時改變的HTML代碼。它把包括進(jìn)來的文本當(dāng)作靜態(tài)文本,很象C或C++中的 #include 指令。
include 行為(<jsp:include page="xxxxx" flush="true" />)在請求時處理,并且是由服務(wù)器透明處理。這意味著你可以通過把它嵌套在一個類似ifParameterEquals的標(biāo)記中有條件地執(zhí)行include 。

3.4.3 圖片處理組件
一些應(yīng)用程序要求動態(tài)生成圖片,就象一個股市報告站點的價格圖一樣。通常使用兩種不同的方法來實現(xiàn)這個需求:

處理一個執(zhí)行一個servlet請求的URL的超聯(lián)接。這個servlet將使用一個圖象庫來生成圖片,設(shè)置適當(dāng)?shù)腸ontent類型(例如image/gif),并且將圖片的字節(jié)流發(fā)送回瀏覽器。瀏覽器就會象從一個靜態(tài)文件中接收到的一樣顯示圖片。

處理HTML代碼需要下載一個創(chuàng)建請求的圖象的Java applet。你可以通過為在處理的代碼中的這個applet設(shè)置適當(dāng)?shù)某跏蓟瘏?shù)配置這個圖象,或者你可以讓這個applet與服務(wù)器建立自己聯(lián)接來接收這些參數(shù)。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 金门县| 大连市| 宝坻区| 灵丘县| 广汉市| 铜鼓县| 凯里市| 抚顺县| 六盘水市| 如东县| 乐安县| 微山县| 西乡县| 启东市| 海安县| 平南县| 宝鸡市| 奈曼旗| 军事| 丹凤县| 平阴县| 神农架林区| 湖口县| 密云县| 西吉县| 板桥市| 南靖县| 七台河市| 嵊州市| 手机| 泗阳县| 英吉沙县| 安陆市| 贵港市| 日土县| 河曲县| 黑龙江省| 盘山县| 明溪县| 乌审旗| 乐都县|