JSP視窗組件所使用的struts標(biāo)記庫(kù)由四類標(biāo)記組成: 2. Bean標(biāo)記:用來在JSP頁(yè)中管理bean 3. 邏輯標(biāo)記:用來在JSP頁(yè)中控制流程 4. HTML標(biāo)記:用來生成HTML標(biāo)記,,在表單中顯示數(shù)據(jù),,使用會(huì)話ID對(duì)URL進(jìn)行編程 5. 模板標(biāo)記:使用動(dòng)態(tài)模板構(gòu)造普通格式的頁(yè) 2.1 Bean標(biāo)記 這個(gè)標(biāo)記庫(kù)中包含用于定義新bean、訪問bean及其屬性的標(biāo)記,。Struts框架提供了多種自定義標(biāo)記用來在JSP頁(yè)中處理JavaBean,。這些標(biāo)記被封裝在一個(gè)普通的標(biāo)記庫(kù)中,在文件struts-bean.tld中定義了它的標(biāo)記庫(kù)描述器,。Bean標(biāo)記庫(kù)將標(biāo)記定義在四個(gè)子類別中: 創(chuàng)建和復(fù)制bean的標(biāo)記 腳本變量定義標(biāo)記 bean翻譯標(biāo)記 消息國(guó)際化標(biāo)記 2.1.1 Bean復(fù)制標(biāo)記 可定義新bean,,可復(fù)制現(xiàn)有bean,還可從現(xiàn)有bean復(fù)制屬性,。 <bean:define>標(biāo)記用來: 定義新字符串常數(shù) 將現(xiàn)有的bean復(fù)制到新定義的bean對(duì)象 復(fù)制現(xiàn)有bean的屬性來創(chuàng)建新的bean <bean:define>標(biāo)記屬性: 屬性描述Id 新定義的bean腳本變量名稱,,必須設(shè)置Type 定義引入腳本變量的類Value 為id屬性定義的腳本變量分配一個(gè)新的對(duì)象Name 目標(biāo)bean的名稱。若value屬性沒有設(shè)置,,這個(gè)屬性就必須設(shè)置property Name屬性定義的bean的屬性名稱,,用來定義新的bean 13 Scope 源bean的作用域。若沒有設(shè)置,,搜索范圍是從頁(yè)作用域到應(yīng)用程序作用域toScope 目標(biāo)bean的作用域,。若沒有設(shè)置,默認(rèn)值是頁(yè)作用域 例如:定義一個(gè)bean: <bean:define id=”test” value=”this is a test”/> 源bean在頁(yè)作用域中被拷貝大哦請(qǐng)求作用域中的另一個(gè)bean: <bean:define id=”targetBean” name=”sourceBean” scope=”page” toScope=”request”/> 2.1.2 定義腳本變量的標(biāo)記 從多種資源中定義和生成腳本變量,這些資源包括cookie,請(qǐng)求參數(shù),,HTTP標(biāo)頭等等,。屬性如下: 屬性描述Id 腳本變量和要定義的頁(yè)作用域?qū)傩缘拿QName cookie/標(biāo)頭/參數(shù)的名稱multiple 如果這個(gè)屬性設(shè)置了任意一個(gè)數(shù)值,所有匹配的cookie都會(huì)被積累并存儲(chǔ)到一個(gè)Cookie[](一個(gè)數(shù)組)類型的bean里,。若無設(shè)置,,指定cookie的第一個(gè)值將作為Cookie類型的值Value 如果沒有匹配的cookie或數(shù)值,就返回這個(gè)屬性指定的默認(rèn)值 例如: <bean:cookie id=”myCookie” name=”userName”/> 腳本變量名稱是myCookie,,用來創(chuàng)建這個(gè)屬性的cookie的名稱是userName,。 <bean:header id=”myHeader” name=”Accept-Language”/> 腳本變量名稱是myHeader,請(qǐng)求標(biāo)頭的名稱是Accept-Language. <bean:parameter id=”myParameter” name=”myParameter”> 腳本變量名稱是myPatameter,它保存的請(qǐng)求參數(shù)的名稱也是myParameter. <bean:include>標(biāo)記將對(duì)一個(gè)資源的響應(yīng)進(jìn)行檢索,并引入一個(gè)腳本變量和字符串類型的頁(yè)作用域?qū)傩?。這個(gè)資源可以是一個(gè)頁(yè),,一個(gè)ActionForward或一個(gè)外部URL。與<jsp:include>的不同是資源的響應(yīng)被存儲(chǔ)到一個(gè)頁(yè)作用域的bean中,,而不是寫入到輸出流,。屬性如下: 屬性描述Id 腳本變量和要定義的頁(yè)作用域?qū)傩缘拿QPage 一個(gè)內(nèi)部資源forward 一個(gè)ActionForward Href 要包含的資源的完整URL 例如: <bean:include id=”myInclude” page=”MyJsp?x=1”/> 腳本變量的名稱是myInclude,要檢索的響應(yīng)來自資源MyJsp?x=1,。 <bean:resource>標(biāo)記將檢索web應(yīng)用中的資源,,并引入一個(gè)腳本變量和InputStream或字符串類型的頁(yè)作用域?qū)傩浴H绻跈z索資源時(shí)發(fā)生問題,,就會(huì)產(chǎn)生一個(gè)請(qǐng)求時(shí)間異常,。屬性如下: 屬性描述 14 Id 腳本變量和要定義的頁(yè)作用域?qū)傩缘拿QName 資源的相對(duì)路徑Input 如果這個(gè)屬性不存在,資源的類型就是字符串 例如: <bean:resource id=”myResource” name=”/WEB-INF/images/myResource.xml”/> 腳本變量的名稱是myResource,,要檢索的資源的名稱是myResource.xml,。 2.1.3 顯示Bean屬性 標(biāo)記庫(kù)中定義了<bean:write>標(biāo)記,用來將bean的屬性輸送到封裝的JSP頁(yè)寫入器,。這個(gè)標(biāo)記與<jsp:getProperty>類似,,屬性如下: 屬性描述Name 要進(jìn)行屬性顯示的bean的名稱property 要顯示的屬性的名稱。如果這個(gè)屬性類有java.beans.PropertyEditor,getAsText()或toString 方法會(huì)被調(diào)用Scope Bean的作用域,,若沒有設(shè)置,,搜索范圍是從頁(yè)到應(yīng)用程序作用域Filter 如果設(shè)置true,屬性中的所有特殊HTML字符都將被轉(zhuǎn)化為相應(yīng)的實(shí)體引用Ignore 如果設(shè)置false,當(dāng)發(fā)現(xiàn)屬性時(shí)會(huì)產(chǎn)生一個(gè)請(qǐng)求時(shí)間異常,,否則返回null 例如: <bean:write name=”myBean” property=”myProperty” scope=”request” filter=”true”/> myBean的屬性myProperty將會(huì)被顯示,,作用域?yàn)檎?qǐng)求,如果發(fā)現(xiàn)任何HTML特殊字符都將被轉(zhuǎn)化為相應(yīng)的實(shí)體引用,。 2.1.4 消息標(biāo)記和國(guó)際化 strtus框架支持國(guó)際化和本地化,。用戶在他們的計(jì)算機(jī)中定義自己所在的區(qū)域,當(dāng)web應(yīng)用程序需要輸出一條消息時(shí),,它將引用一個(gè)資源文件,,在這個(gè)文件中所有的消息都使用了適當(dāng)?shù)恼Z言,。一個(gè)應(yīng)用程序可能提供了很多資源文件,每個(gè)文件提供了用不同語言編寫的消息,。如果沒有找到所選語言的資源文件,,就將使用默認(rèn)的資源文件。 struts框架對(duì)國(guó)際化的支持是使用<bean:message>標(biāo)記,,以及使用java.util數(shù)據(jù)包中定義的Locale和ResourceBundle類來實(shí)現(xiàn)Java2平臺(tái)對(duì)這些任務(wù)的支持,。Java.text.MessageFormat類定義的技術(shù)可以支持消息的格式。利用此功能,,開發(fā)人員不需了解這些類的細(xì)節(jié)就可進(jìn)行國(guó)際化和設(shè)置消息的格式。 用strtus實(shí)現(xiàn)國(guó)際化和本地化: 第一步要定義資源文件的名稱,,這個(gè)文件會(huì)包含用默認(rèn)語言編寫的在程序中會(huì)出現(xiàn)的所有消息,。這些消息以“關(guān)鍵字-值”的形式存儲(chǔ),如下: error.validation.location = The entered location is invalid 這個(gè)文件需要存儲(chǔ)在類的路徑下,,而且它的路徑要作為初始化參數(shù)傳送給ActionServlet作為參數(shù)進(jìn)行傳遞時(shí),,路徑的格式要符合完整Java類的標(biāo)準(zhǔn)命名規(guī)范。比如,,如果資源文件存儲(chǔ)在WEB-INFclasses目錄中,,文件名是 15 ApplicationResources.properties,那么需要傳遞的參數(shù)值是ApplicationResources,。如果文件在WEB-INFclassescom est中,,那么參數(shù)值就應(yīng)該是com.test. ApplicationResources. 為了實(shí)現(xiàn)國(guó)際化,所有的資源文件必須都存儲(chǔ)在基本資源文件所在的目錄中,?;举Y源文件包含的是用默認(rèn)地區(qū)語言-本地語言編寫的消息。如果基本資源文件的名稱是ApplicationResources.properties,,那么用其他特定語言編寫的資源文件的名稱就應(yīng)該是ApplicationResources_xx.properties(xx為ISO編碼,,如英語是en)。因此這些文件應(yīng)包含相同的關(guān)鍵字,,但關(guān)鍵字的值是用特定語言編寫的,。 ActionServlet的區(qū)域初始化參數(shù)必須與一個(gè)true值一起傳送,這樣ActionServlet就會(huì)在用戶會(huì)話中的Action.LOCALE_KEY關(guān)鍵字下存儲(chǔ)一個(gè)特定用戶計(jì)算機(jī)的區(qū)域?qū)ο蟆,,F(xiàn)在可以運(yùn)行一個(gè)國(guó)際化的web站點(diǎn),,它可以根據(jù)用戶計(jì)算機(jī)上的設(shè)置的區(qū)域自動(dòng)以相應(yīng)的語言顯示。 我們還可以使用特定的字符串來替換部分消息,,就象用java.text.MessageFormat的方法一樣: error.invalid.number = The number {0} is valid 我們可以把字符串{0}替換成任何我們需要的數(shù)字,。<bean:message>標(biāo)簽屬性如下: 屬性描述Key 資源文件中定義消息關(guān)鍵字Locale 用戶會(huì)話中存儲(chǔ)的區(qū)域?qū)ο蟮膶傩悦Q。若沒有設(shè)置,,默認(rèn)值是Action.LOCALE_KEY Bundle 在應(yīng)用程序上下文中,,存儲(chǔ)資源對(duì)象的屬性的名稱,。如果沒有設(shè)置這個(gè)屬性,默認(rèn)值是Action.MESSAGE_KEY arg0 第一個(gè)替換參數(shù)值arg1 第二個(gè)替換參數(shù)值arg2 第三個(gè)替換參數(shù)值arg3 第四個(gè)替換參數(shù)值 例如:資源文件中定義了一個(gè)消息: info.myKey = The numbers entered are {0},{1},{2},{3} 我們可使用下面的消息標(biāo)記: <bean:message key=”info.myKey” arg0=”5” arg1=”6” arg2=”7” arg3=”8”/> 這個(gè)信息標(biāo)記輸出到JSP頁(yè)會(huì)顯示為:The numbers entered are 5,6,7,8 2.2 邏輯標(biāo)記 邏輯庫(kù)的標(biāo)記能夠用來處理外觀邏輯而不需要使用scriptlet,。Struts邏輯標(biāo)簽庫(kù)包含的標(biāo)記能夠有條件地產(chǎn)生輸出文本,,在對(duì)象集合中循環(huán)從而重復(fù)地產(chǎn)生輸出文本,以及應(yīng)用程序流程控制,。它也提供了一組在JSP頁(yè)中處理流程控制的標(biāo)記,。這些標(biāo)記封裝在文件名為struts-logic.tld的標(biāo)記包中。邏輯標(biāo)記庫(kù)定義的標(biāo)記能夠執(zhí)行下列三個(gè)功能: 條件邏輯 重復(fù) 轉(zhuǎn)發(fā)/重定向響應(yīng) 16 2.2.1 條件邏輯 struts有三類條件邏輯,。第一類可以比較下列實(shí)體與一個(gè)常數(shù)的大?。?BR>cookie 請(qǐng)求參數(shù) bean或bean的參數(shù) 請(qǐng)求標(biāo)頭 以下列出了這一類標(biāo)記: 標(biāo)記功能<equal> 如果常數(shù)與被定義的實(shí)體相等,返回true <notEqual> 如果常數(shù)與被定義的實(shí)體不相等,,返回true <greaterEqual> 如果常數(shù)大于等于被定義的實(shí)體,,返回true <lessEqual> 如果常數(shù)小于等于被定義的實(shí)體,返回true <lessThan> 如果常數(shù)小于被定義的實(shí)體,,返回true <greaterThan> 如果常數(shù)大于被定義的實(shí)體,,返回true 這一類的所有標(biāo)記有相同的屬性 屬性描述Value 要進(jìn)行比較的常數(shù)值Cookie 要進(jìn)行比較的HTTP cookie的名稱Header 要進(jìn)行比較的HTTP請(qǐng)求標(biāo)頭的名稱parameter 要進(jìn)行比較的HTTP請(qǐng)求參數(shù)的名稱Name 如果要進(jìn)行比較的是bean或bean的屬性,則這個(gè)屬性代表bean的名稱property 要進(jìn)行比較的bean屬性的名稱Scope Bean的作用域,,如果沒有指定作用域,,則它的搜索范圍是從頁(yè)到應(yīng)用程序 例如: <logic:equal parameter=”name” value=”SomeName”> The entered name is SomeName </logic:equal> 判斷名為”name”的請(qǐng)求參數(shù)的值是否是”SomeName”。 <logic:greaterThan name=”bean” property=”prop” scope=”page” value=”7”> The value of bean.Prop is greater than 7 </logic:greaterThan> 判斷在頁(yè)的作用域中是否有一個(gè)名為”bean”的bean,,它有一個(gè)prop屬性,,這個(gè)屬性的值是否大于7。如果這個(gè)屬性能夠轉(zhuǎn)化為數(shù)值,,就進(jìn)行數(shù)值比較,,否則就進(jìn)行字符串比較。 第二類條件標(biāo)記定義了兩個(gè)標(biāo)記: <logic:present> <logic:notPresent> 它們的功能是在計(jì)算標(biāo)記體之前判斷特定的項(xiàng)目是否存在,。標(biāo)記的屬性和屬性值決定了要進(jìn)行檢查的項(xiàng)目,。 屬性描述 17 Cookie 由這個(gè)屬性指定的cookie將被檢查是否存在Header 由這個(gè)屬性指定的請(qǐng)求標(biāo)頭將被檢查是否存在parameter 由這個(gè)屬性指定的請(qǐng)求參數(shù)將被檢查是否存在Name 如果沒有設(shè)置property屬性,那么有這個(gè)屬性指定的bean將被檢查是否存在,。如果設(shè)置了,,那么bean和bean屬性都將被檢查是否存在。property 檢查有name屬性指定的bean中是否存在指定的屬性Scope 如果指定了bean的名稱,,這就是bean的作用域,。如果沒有指定作用域,搜索的范圍從頁(yè)到應(yīng)用程序作用域,。Role 檢查當(dāng)前已經(jīng)確認(rèn)的用戶是否屬于特殊的角色User 檢查當(dāng)前已經(jīng)確認(rèn)的用戶是否有特定的名稱 例如: <logic:notPresent name=”bean” property=”prop” scope=”page”> The bean property bean.prop is present </logic:notPresent> 標(biāo)記判斷在頁(yè)作用域中是否存在一個(gè)名為”bean”的bean,,這個(gè)bean有一個(gè)prop屬性。 第三類條件標(biāo)記比較復(fù)雜,,這些標(biāo)記根據(jù)模板匹配的結(jié)果檢查標(biāo)記體的內(nèi)容,。換句話說,,這些標(biāo)記判斷一個(gè)指定項(xiàng)目的值是否是一個(gè)特定常數(shù)的子字符串: <logic:match> <logic:notMatch> 這些標(biāo)記允許JSP引擎在發(fā)現(xiàn)了匹配或是沒有發(fā)現(xiàn)時(shí)計(jì)算標(biāo)記主體。屬性如下: 屬性描述Cookie 要進(jìn)行比較的HTTP cookie的名稱Header 要進(jìn)行比較的的HTTP標(biāo)頭的名稱parameter 要進(jìn)行比較的的HTTP請(qǐng)求參數(shù)的名稱Name 若要對(duì)bean或bean的屬性進(jìn)行比較,,這個(gè)屬性是用戶指定bean的名稱location 如果設(shè)置了這個(gè)屬性的值,,將會(huì)在這個(gè)指定的位置(索引值)進(jìn)行匹配scope 如果對(duì)bean進(jìn)行比較,這個(gè)屬性指定了bean的作用域,。如果沒有設(shè)置這個(gè)參數(shù),,搜索范圍是從頁(yè)到應(yīng)用程序作用域property 要進(jìn)行比較的bean的屬性名稱value 要進(jìn)行比較的常數(shù)值 例如: <logic:match parameter=”name” value=”xyz” location=”1”> The parameter name is a sub-string of the string xyz from index 1 </logic:match> 標(biāo)記檢查名為”name”的請(qǐng)求參數(shù)是否是”xyz”的子字符串,但是子字符串必須從”xyz”的索引位置1開始(也就是說子字符串必須是”y”或”yz”),。 2.2.2 重復(fù)標(biāo)記 在邏輯標(biāo)記庫(kù)中定義了<logic:iterate>標(biāo)記,,它能夠根據(jù)特定集合中元素的數(shù)目對(duì)標(biāo)記體的內(nèi)容進(jìn)行重復(fù)的檢查。集合的類型可以是java.util.Iterator,java.util.Collection 18 ,java.util.Map或是一個(gè)數(shù)組,。有三種方法可以定義這個(gè)集合: 使用運(yùn)行時(shí)間表達(dá)式來返回一個(gè)屬性集合的集合 將集合定義為bean,,并且使用name屬性指定存儲(chǔ)屬性的名稱。 使用name屬性定義一個(gè)bean,,并且使用property屬性定義一個(gè)返回集合的bean屬性。 當(dāng)前元素的集合會(huì)被定義為一個(gè)頁(yè)作用域的bean,。屬性如下,,所有這些屬性都能使用運(yùn)行時(shí)表達(dá)式。 屬性描述collection 如果沒有設(shè)置name屬性,,它就指定了要進(jìn)行重復(fù)的集合Id 頁(yè)作用域bean和腳本變量的名稱,,它保存著集合中當(dāng)前元素的句柄indexed 頁(yè)作用域JSP bean的名稱,它包含著每次重復(fù)完成后集合的當(dāng)前索引Length 重復(fù)的最大次數(shù)Name 作為集合的bean的名稱,,或是一個(gè)bean名稱,,它由property屬性定義的屬性,是個(gè)集合Offset 重復(fù)開始位置的索引property 作為集合的Bean屬性的名稱Scope 如果指定了bean名稱,,這個(gè)屬性設(shè)置bean的作用域,。若沒有設(shè)置,搜索范圍從頁(yè)到應(yīng)用程序作用域Type 為當(dāng)前定義的頁(yè)作用域bean的類型 例如: <logic:iterate id=”currentInt” collection=”<% =myList %>” type=”java.lang.Integer” offset=”1” length=”2”> <% =currentint %> </logic:iterate> 代碼將從列表中的第一個(gè)元素開始重復(fù)兩個(gè)元素并且能夠讓當(dāng)前元素作為頁(yè)作用域和java.lang.Integer類型的腳本變量來使用,。也就是說,,如果myList包含元素1,2,,3,,4等,代碼將會(huì)打印1和2,。 2.2.3 轉(zhuǎn)發(fā)和重定向標(biāo)記 轉(zhuǎn)發(fā)標(biāo)記 <logic:forward>標(biāo)記能夠?qū)㈨憫?yīng)轉(zhuǎn)發(fā)給重定向到特定的全局ActionForward上,。ActionForward的類型決定了是使用PageContext轉(zhuǎn)發(fā)響應(yīng),還是使用sendRedirect將響應(yīng)進(jìn)行重定向,。此標(biāo)記只有一個(gè)”name”屬性,,用來指定全局ActionForward的名稱,,例如: <logic:forward name=”myGlobalForward”/> 重定向標(biāo)記 <logic:redirect>標(biāo)記是一個(gè)能夠執(zhí)行HTTP重定向的強(qiáng)大工具。根據(jù)指定的不同屬性,,它能夠通過不同的方式實(shí)現(xiàn)重定向,。它還允許開發(fā)人員指定重定向URL的查詢參數(shù)。屬性如下: 19 屬性描述Forward 映射了資源相對(duì)路徑的ActionForward Href 資源的完整URL Page 資源的相對(duì)路徑Name Map類型的頁(yè)名稱,,請(qǐng)求,,會(huì)話或程序?qū)傩缘拿Q,其中包含要附加大哦重定向URL(如果沒有設(shè)置property屬性)上的“名稱-值”參數(shù),?;蚴蔷哂蠱ap類型屬性的bean名稱,其中包含相同的信息(沒有設(shè)置property屬性) Property Map類型的bean屬性的名稱,。Bean的名稱由name屬性指定,。Scope 如果指定了bean的名稱,這個(gè)屬性指定搜索bean的范圍,。如果沒有設(shè)置,,搜索范圍從頁(yè)到應(yīng)用程序作用域ParamID 定義特定查詢參數(shù)的名稱ParamName 字符串類型的bean的名稱,其中包含查詢參數(shù)的值(如果沒有設(shè)置paramProperty屬性),;或是一個(gè)bean的名稱,,它的屬性(在paramProperty屬性中指定)包含了查詢參數(shù)值paramProperty 字符串bean屬性的名稱,其中包含著查詢參數(shù)的值ParamScope ParamName定義的bean的搜索范圍 使用這個(gè)標(biāo)記時(shí)至少要指定forward,href或page中的一個(gè)屬性,,以便標(biāo)明將響應(yīng)重定向到哪個(gè)資源,。 2.3 HTML標(biāo)記 Struts HTML標(biāo)記可以大致地分為以下幾個(gè)功能: 顯示表單元素和輸入控件 顯示錯(cuò)誤信息 顯示其他HTML元素 2.3.1 顯示表單元素和輸入控件 struts將HTML表單與為表單操作而定義的ActionForm bean緊密聯(lián)系在一起。表單輸入字段的名稱與ActionForm bean里定義的屬性名稱是對(duì)應(yīng)的,。當(dāng)?shù)谝淮物@示表單時(shí),,表單的輸入字段是從ActionForm bean中移植過來的,當(dāng)表單被提交時(shí),,請(qǐng)求參數(shù)將移植到ActionForm bean實(shí)例,。 所有可以在<form>標(biāo)記中使用的用來顯示HTML輸入控件的內(nèi)嵌標(biāo)記都使用下列屬性來定義JavaScript事件處理器。 屬性描述Onblur 字段失去了焦點(diǎn)Onchange 字段失去了焦點(diǎn)并且數(shù)值被更改了Onclick 字段被鼠標(biāo)點(diǎn)擊Ondblclick 字段被鼠標(biāo)雙擊Onfocus 字段接收到輸入焦點(diǎn)Onkeydown 字段擁有焦點(diǎn)并且有鍵按下 20 onkeypress 字段擁有焦點(diǎn)并且有鍵按下并釋放Onkeyup 字段擁有焦點(diǎn)并且有鍵被釋放onmousedown 鼠標(biāo)指針指向字段并且點(diǎn)擊onmousemove 鼠標(biāo)指針指向字段并且在字段內(nèi)移動(dòng)onmouseout 鼠標(biāo)指針指向控件,,但是指針在元素外圍移動(dòng)onmouseover 鼠標(biāo)指針沒有指向字段,,但是指針在元素內(nèi)部移動(dòng)Onmouseup 鼠標(biāo)指針指向字段,并且釋放了鼠標(biāo)按鍵 <form>元素中能夠被定義的其他一般屬性有: 屬性描述Accesskey 定義訪問輸入字段的快捷鍵Style 定義輸入字段的樣式styleClass 定義輸入字段的樣式表類Tabindex 輸入字段的tab順序 a) 表單標(biāo)記 <html:form>標(biāo)記用來顯示HTML標(biāo)記,,可以指定AcitonForm bean的名稱和它的類名,。如果沒有設(shè)置這些屬性,就需要有配置文件來指定ActionMapping以表明當(dāng)前輸入的是哪個(gè)JSP頁(yè),,以及從映射中檢索的bean名和類,。如果在ActionMapping指定的作用域中沒有找到指定的名稱,就會(huì)創(chuàng)建并存儲(chǔ)一個(gè)新的bean,,否則將使用找到的bean,。 <form>標(biāo)記能夠包含與各種HTML輸入字段相對(duì)應(yīng)的子標(biāo)記,。 <html:form>標(biāo)記屬性如下: 屬性描述Action 與表單相關(guān)的操作。在配置中,,這個(gè)操作也用來標(biāo)識(shí)與表單相關(guān)的ActionForm bean Enctype 表單HTTP方法的編碼類型Focus 表單中需要初始化焦點(diǎn)的字段Method 表單使用的HTTP方法Name 與表單相關(guān)的ActionForm bean的名稱,。如果沒有設(shè)置這個(gè)屬性,bean的名稱將會(huì)從配置信息中獲得Onreset 表單復(fù)位時(shí)的JavaScript事件句柄Onsubmit 表單提交時(shí)的JavaScript事件句柄Scope 搜索ActionForm bean的范圍,。如果沒有設(shè)置,,將從配置文件中獲取Style 使用的格式styleClass 這個(gè)元素的格式表類Type ActionForm bean的完整名稱。如果沒有設(shè)置,,將從配置文件獲得 例如: <html:form action=”validateEmploee.do” method=”post”> </html:form> 與表單相關(guān)的操作路徑是validateEmployee,而表單數(shù)據(jù)是通過POST傳遞的,。對(duì)于這個(gè)表單來說,ActionForm bean的其他信息,,如bean名稱類型,,作用域,都是從表單指定操作的ActionMapping中檢索得到的: 21 <form-beans> <form-bean name=”empForm” type=”com.example.EmployeeForm”/> </form-beans> <action-mappings> <action path=”/validateEmployee” type=”com.example.ValidateExampleAction” name=”empForm” scope=”request” input=”/employeeInput.jsp”> <forward name=”success” path=”/employeeOutput.jsp”> </action> </action-mapping> 如果配置文件中包含上述信息,,并且請(qǐng)求URI的*.do被映射到ActionServlet,,與表單相關(guān)的ActionForm bean的名稱,類型和作用域分別是empForm,com.example.EmployeeForm和request.這些屬性也可以使用<html:form>標(biāo)記屬性進(jìn)行顯示的定義,。 以下標(biāo)記必須嵌套在<html:form>標(biāo)記里 b) 按鈕和取消標(biāo)記 <html:button>標(biāo)記顯示一個(gè)按鈕控件,;<html:cancel>標(biāo)記顯示一個(gè)取消按鈕。屬性如下: 屬性描述Property 定義在表單被提交時(shí)返回到服務(wù)器的請(qǐng)求參數(shù)的名稱Value 按鈕上的標(biāo)記 c) 復(fù)位和提交標(biāo)記 <html:reset>和<html:submit>標(biāo)記分別能夠顯示HTML復(fù)位按鈕和提交按鈕,。 d) 文本和文本區(qū)標(biāo)記 <html:text>和<html:textarea>標(biāo)記分別HTML文本框和文本區(qū),屬性如下: 屬性描述Property 定義當(dāng)表單被提交時(shí)送回到服務(wù)器的請(qǐng)求參數(shù)的名稱,,或用來確定文本元素當(dāng)前值的bean的屬性名稱Name 屬性被查詢的bean的名稱,,它決定了文本框和文本區(qū)的值。如果沒有設(shè)置,,將使用與這個(gè)內(nèi)嵌表單相關(guān)的ActionForm的名稱 <html:text>標(biāo)記還有以下屬性: 屬性描述Maxlength 能夠輸入的最大字符數(shù) 22 Size 文本框的大?。ㄗ址麛?shù)) <html:textarea>標(biāo)記特有的屬性如下: 屬性描述Rows 文本區(qū)的行數(shù)Cols 文本區(qū)的列數(shù) e) 檢查框和復(fù)選框標(biāo)記 <html:checkbox>標(biāo)記能夠顯示檢查框控件。<html:multibox>標(biāo)記能夠顯示HTML復(fù)選框控件,,請(qǐng)求對(duì)象在傳遞檢查框名稱時(shí)使用的getParameterValues()調(diào)用將返回一個(gè)字符串?dāng)?shù)組,。屬性如下: 屬性描述Name Bean的名稱,其屬性會(huì)被用來確定檢查是否以選中的狀態(tài)顯示,。如果沒有設(shè)置,,將使用與這個(gè)內(nèi)嵌表單相關(guān)的ActionFrom bean的名稱。Property 檢查框的名稱,,也是決定檢查框是否以選中的狀態(tài)顯示的bean屬性名稱,。在復(fù)選框的情況下,這個(gè)屬性必須是一個(gè)數(shù)組,。Value 當(dāng)檢查框被選中時(shí)返回到服務(wù)器的請(qǐng)求參數(shù)的值 例如: <html:checkbox property=”married” value=”Y”/> 一個(gè)名為married的檢查框,,在表單提交時(shí)會(huì)返回一個(gè)”Y”. f) 文件標(biāo)記 <html:file>標(biāo)記可以顯示HTML文件控件,。屬性如下: 屬性描述Name Bean的名稱,它的屬性將確定文件控件中顯示的內(nèi)容,。如果沒設(shè)置,,將使用與內(nèi)嵌表單相關(guān)的ActionForm bean的名稱property 這個(gè)屬性定義了當(dāng)表單被提交時(shí)送回到服務(wù)器的請(qǐng)求參數(shù)的名稱,以及用來確定文件控件中顯示內(nèi)容的bean屬性名稱Accept 服務(wù)器能夠處理的內(nèi)容類型集,。它也將對(duì)客戶瀏覽器對(duì)話框中的可選文件類型進(jìn)行過濾Value 按鈕上的標(biāo)記,,這個(gè)按鈕能夠在本地文件系統(tǒng)中瀏覽文件 g) 單選鈕標(biāo)記 <html:radio>標(biāo)記用來顯示HTML單選鈕控件,屬性如下: 屬性描述Name Bean的名稱,,其屬性會(huì)被用來確定單選鈕是否以選中的狀態(tài)顯示,。如果沒有設(shè)置,將使用與這個(gè)內(nèi)嵌表單相關(guān)的ActionFrom bean的名稱,。property 當(dāng)表單被提交時(shí)送回到服務(wù)器的請(qǐng)求參數(shù)的名稱,,以及用來確定單選鈕是否以被選中狀態(tài)進(jìn)行顯示的bean屬性的名稱 23 Value 當(dāng)單選鈕被選中時(shí)返回到服務(wù)器的值 h) 隱藏標(biāo)記 <html:hidden>標(biāo)記能夠顯示HTML隱藏輸入元素,屬性如下: 屬性描述Name Bean的名稱,,其屬性會(huì)被用來確定隱藏元素的當(dāng)前值,。如果沒有設(shè)置,將使用與這個(gè)內(nèi)嵌表單相關(guān)的ActionFrom bean的名稱,。property 定義了當(dāng)表單被提交時(shí)送回到服務(wù)器的請(qǐng)求參數(shù)的名稱,,以及用來確定隱藏元素當(dāng)前值的bean屬性的名稱Value 用來初始化隱藏輸入元素的值 i) 密碼標(biāo)記 <html:password>標(biāo)記能夠顯示HTML密碼控件,屬性如下: 屬性描述maxlength 能夠輸入的最大字符數(shù)Name Bean的名稱,,它的屬性將用來確定密碼元素的當(dāng)前值,。如果沒有設(shè)置,將使用與這個(gè)內(nèi)嵌表單相關(guān)的ActionFrom bean的名稱,。property 定義了當(dāng)表單被提交時(shí)送回到服務(wù)器的請(qǐng)求參數(shù)的名稱,,以及用來確定密碼元素當(dāng)前值的bean屬性的名稱redisplay 在顯示這個(gè)字段時(shí),如果相應(yīng)的bean屬性已經(jīng)被設(shè)置了數(shù)據(jù),,這個(gè)屬性決定了是否顯示密碼的內(nèi)容Size 字段的大小 j) 選擇標(biāo)記 <html:select>標(biāo)記能夠顯示HTML選擇控件,,屬性如下: 屬性描述multiple 表明這個(gè)選擇控件是否允許進(jìn)行多選Name Bean的名稱,它的屬性確定了哪個(gè),。如果沒有設(shè)置,,將使用與這個(gè)內(nèi)嵌表單相關(guān)的ActionFrom bean的名稱。property 定義了當(dāng)表單被提交時(shí)送回到服務(wù)器的請(qǐng)求參數(shù)的名稱,,以及用來確定哪個(gè)選項(xiàng)需要被選中的bean屬性的名稱Size 能夠同時(shí)顯示的選項(xiàng)數(shù)目Value 用來表明需要被選中的選項(xiàng) k) 選項(xiàng)標(biāo)記(這個(gè)元素需要嵌套在<html:select>標(biāo)記里) <html:option>標(biāo)記用來顯示HTML選項(xiàng)元素集合,,屬性如下: 24 屬性描述collection Bean集合的名稱,這個(gè)集合存儲(chǔ)在某個(gè)作用域的屬性中,。選項(xiàng)的數(shù)目與集合中元素的數(shù)目相同,。Property屬性能夠定義選項(xiàng)值所使用的bean屬性,而labelProperty屬性定義選項(xiàng)標(biāo)記所使用的bean的屬性labelName 用來指定存儲(chǔ)于某個(gè)作用域的bean,這個(gè)bean是一個(gè)字符串的集合,,能夠定義<html:option>元素的標(biāo)記(如果標(biāo)志與值不相同) labelProperty 與collection屬性共同使用時(shí),,用來定義了存儲(chǔ)于某個(gè)作用域的bean,這個(gè)bean將返回一個(gè)字符串集合,,能夠用來寫入<html:option>元素的value屬性Name 如果這是唯一被指定的屬性,,它就定義了存儲(chǔ)于某個(gè)作用域的bean,這個(gè)bean將返回一個(gè)字符串集合,,能夠用來寫入<html:option>元素的value屬性property 這個(gè)屬性在與collection屬性共同使用時(shí),,定義了每個(gè)要顯示選項(xiàng)值的獨(dú)立bean的name屬性。如果不是與collection屬性共同使用,,這個(gè)屬性定義了由name屬性指定的bean的屬性名稱(如果有name屬性),,或是定義了一個(gè)ActionForm bean,這個(gè)bean將返回一個(gè)集合來寫入選項(xiàng)的值 我們看一下這個(gè)標(biāo)記的一些例子: <html:option collection=”optionCollection” property=”optionValue” labelProperty=”optionLabel”/> 標(biāo)記假設(shè)在某個(gè)作用域中有一個(gè)名為optionCollection的集合,,它包含了一些具有optionValue屬性的獨(dú)立的bean,,每個(gè)屬性將作為一個(gè)選項(xiàng)的值。每個(gè)選項(xiàng)的標(biāo)志由bean的optionLabel屬性屬性進(jìn)行定義,。 <html:option name=”optionValues” labelName=”optionLabels”/> 標(biāo)記中optionValues代表一個(gè)存儲(chǔ)在某個(gè)作用域中的bean,,它是一個(gè)字符串集合,能夠用來寫入選項(xiàng)的值,,而optionLabels代表一個(gè)存儲(chǔ)在某個(gè)作用域中的bean,,它也是一個(gè)字符串集合,能夠用來寫入選項(xiàng)的標(biāo)志,。 2.3.2.顯示錯(cuò)誤信息的標(biāo)記 <html:errors>標(biāo)記能夠與ActionErrors結(jié)合在一起來顯示錯(cuò)誤信息,。這個(gè)標(biāo)記首先要從當(dāng)前區(qū)域的資源文件中讀取消息關(guān)鍵字errors.header,然后顯示消息的文本,。接下去它會(huì)在ActionErrors對(duì)象(通常作為請(qǐng)求參數(shù)而存儲(chǔ)在Action.ERROR_KEY關(guān)鍵字下)中循環(huán),,讀取單個(gè)ActionError對(duì)象的消息關(guān)鍵字,從當(dāng)前區(qū)域的資源文件中讀取并格式化相應(yīng)的消息,,并且顯示它們。然后它讀取與errors.footer關(guān)鍵字相對(duì)應(yīng)的消息并且顯示出來,。 通過定義property屬性能夠過濾要顯示的消息,,這個(gè)屬性的值應(yīng)該與ActionErrors對(duì)象中存儲(chǔ)ActionError對(duì)象的關(guān)鍵字對(duì)應(yīng)。屬性如下: 屬性描述Bundle 表示應(yīng)用程序作用域?qū)傩缘拿Q,,它包含著消息資源,,其默認(rèn)值A(chǔ)cion.MESSAGE_KEY Locale 表示會(huì)話作用域?qū)傩缘拿Q,它存儲(chǔ)著用戶當(dāng)前登錄的區(qū)域信息,。其默認(rèn)值是Action.ERROR_KEY 25 Name 表示請(qǐng)求屬性的名稱,,它存儲(chǔ)著ActionErrors對(duì)象。其默認(rèn)值是Action.ERROR_KEY property 這個(gè)屬性指定了ActionErrors對(duì)象中存儲(chǔ)每個(gè)獨(dú)立ActionError對(duì)象的關(guān)鍵字,它可以過濾消息 例子: <html:errors/> 顯示集合中所有的錯(cuò)誤,。 <html:errors property=”missing.name”/> 顯示存儲(chǔ)在missing.name關(guān)鍵字的錯(cuò)誤,。 2.3.3.其他HTML標(biāo)記 struts HTML標(biāo)記還定義了下列標(biāo)記來顯示其他HTML元素: <html:html> : 顯示HTML元素 <html:img> : 顯示圖象標(biāo)記 <html:link> : 顯示HTML鏈接或錨點(diǎn) <html:rewrite> : 創(chuàng)建沒有錨點(diǎn)標(biāo)記的URI 這些標(biāo)記的詳細(xì)內(nèi)容請(qǐng)參照struts文檔。 2.4. 模板標(biāo)記 動(dòng)態(tài)模板是模塊化WEB頁(yè)布局設(shè)計(jì)的強(qiáng)大手段,。Struts模板標(biāo)記庫(kù)定義了自定義標(biāo)記來實(shí)現(xiàn)動(dòng)態(tài)模板,。 2.4.1.插入標(biāo)記 <template:insert>標(biāo)記能夠在應(yīng)用程序的JSP頁(yè)中插入動(dòng)態(tài)模板。這個(gè)標(biāo)記只有一個(gè)template屬性,,用來定義模板JSP頁(yè),。要插入到模板的頁(yè)是有多個(gè)<template:put>標(biāo)記來指定的,而這些標(biāo)記被定義為<template:insert>標(biāo)記的主體內(nèi)容,。 2.4.2.放置標(biāo)記 <template:put>標(biāo)記是<template:insert>標(biāo)記內(nèi)部使用的,,用來指定插入到模板的資源。屬性如下: 屬性描述content 定義要插入的內(nèi)容,,比如一個(gè)JSP文件或一個(gè)HTML文件direct 如果這個(gè)設(shè)置為true,,由content屬性指定的內(nèi)容將直接顯示在JSP上而不是作為包含文件Name 要插入的內(nèi)容的名稱Role 如果設(shè)置了這個(gè)屬性,只有在當(dāng)前合法用戶具有特定角色時(shí)才能進(jìn)行內(nèi)容的插入,。 26 2.4.3.獲得標(biāo)記 在模板JSP頁(yè)中使用<template:get>標(biāo)記能夠檢索由<template:put>標(biāo)記插入到JSP頁(yè)的資源,。屬性如下: 屬性描述Name 由<template:put>標(biāo)記插入的內(nèi)容的名稱Role 如果設(shè)置了這個(gè)屬性,只有在當(dāng)前合法用戶具有特定角色時(shí)才能進(jìn)行內(nèi)容的檢索 2.4.4.使用模板標(biāo)記 首先編寫一個(gè)模板JSP頁(yè),,它將被所有的web頁(yè)使用: <html> <%@ taglib uri=”/template” prefix=”template” %> <head> <title></title> </head> <body> <table width=”100%” height=”100%” > <tr height=”10%”> <td> <template:get name=”header”/> </td> </tr> <tr height=”80%”> <td> <template:get name=”content”/> </td> </tr> <tr height=”10%”> <td> <template:get name=”footer”/> </td> </tr> </table> </body> </html> 我們將這個(gè)文件命名為template.jsp,。這個(gè)文件使用<template:get>標(biāo)記來獲得由JSP頁(yè)使用<template:put>標(biāo)記提供的內(nèi)容,并且將內(nèi)容在一個(gè)HTML表格中顯示出來,。這三個(gè)內(nèi)容是標(biāo)題,,內(nèi)容和頁(yè)腳。典型的內(nèi)容JSP會(huì)是這樣: <%@ taglib uri=”/template” prefix=”/template” %> <template:insert template=”template.jsp”> <template:put name=”header” content=”header.html”/> 27 <template:put name=”content” content=”employeeList.jsp”/> <template:put name=”footer” content=”footer.html”/> </template:insert> 這個(gè)應(yīng)用程序JSP頁(yè)使用<template:insert標(biāo)記來定義模板,,然后使用<template:put>標(biāo)記將特定內(nèi)容名稱指定的資源放到模板JSP頁(yè)中,。如果我們有上百個(gè)布局相同的頁(yè),但突然想改變這個(gè)模板,,我們只需要改變template.jsp文件,。 |
|