Struts1使用技巧

1.Struts1是Apache推出的java web開發領域一個比較早,同時也是使用最廣泛的MVC開源框架,對於Struts1的基礎不再做說明,本文只總結Struts1開發中的一些小技巧。

2.Struts配置文件中支持通配符:

如:

[xhtml] view plaincopy
 
  1. <action path=”Edit*” type=”org.apache.struts.Edit{1}Action” name=”{1}Form”/>  
 

type和name中的{1}對應path中的”*”通配符。

3.Struts配置文件中的actionFormBean和action分別對應Struts中的FormBeanConfig和ActionConfig類,在運行時,Struts將配置轉換爲javaBean。

4.頁面中添加超鏈接的方法:

(1).方法1:

直接將項目路徑硬編碼,如:<a href=”/strutsDemo/……”/>。不靈活,不推薦使用。

(2).方法2:

使用EL表達式,具體用法如下:

a.       使用jsp指令<%@ page isELIgnored=”false” %>,不讓頁面忽略EL表達式。

b.       <a href=”${pageContext.request.contextPath}/……”/>。比較靈活,使用也比較多。

(3).方法3:

使用struts標籤,具體用法如下:

a.       使用jsp指令<%@ taglib prefix=”html” uri=”http://struts.apache.org/tag-html”%>,導入struts標籤。

b.       <html:link action=”struts action的path”/>。非常靈活,struts中推薦使用方法。

注意:使用struts的<html:link>標籤的好處:

a.       不必關心web應用程序的路徑和struts中央控制器actionServlet的請求映射路徑。

b.       可以自動附加jsessionid參數進行url重寫。

c.       可以對參數信息進行url編碼。

5.Struts1 action的使用注意事項:

(1).Struts1 action是單例和線程不安全的,因此在action中最好不要有可讀寫的成員變量。

(2).Struts1配置文件中,action的path總以”/”開頭。

(3).Struts的action在頁面表單中動態配置的方法:

<form action=”<html:rewrite action=’action的path’/>” method=”post”>

(4).struts的action中,可以直接使用response對象向瀏覽器輸出內容,具體做法:

在struts action的execute方法中不要返回actionForward對象,而直接返回null即可。

不建議這樣使用,因爲沒有使用到struts的便利。

注意:struts中<html:link>和<html:rewrite>標籤的區別:

<html:link>標籤:會生成完整的超鏈接地址,所以經常用於取代超鏈接。

<html:rewrite>標籤:只會生成url地址,所以常用在form表單的action屬性中。

6.Struts ActionFormBean的初始化過程:

Struts中ActionFormBean用於收集請求參數,並將請求參數傳遞給action進行處理。ActionFormBean的初始化由Struts框架根據需要進行,具體過程如下:

如果某個struts action關聯了一個ActionFormBean,當瀏覽器請求這個action時,struts框架將會創建這個ActionFormBean,把該ActionFormBean存儲在相應的web域中,並用請求參數來填充這個ActionFormBean,該ActionFormBean保存的名字就是Action中attribute所配置的值,若attribute沒有配置,則默認爲name的值。

7.Session的序列化問題:

Struts調用關聯ActionFormBean的action時,在服務重啓時,需要將session中的ActionFormBean對象序列化到硬盤中,ActionFormBean屬性的複雜對象必須實現序列化接口(ActionFormBean的父類ActionForm已經實現序列化),否則會報session序列化錯誤。

8.Struts的輸入校驗方法:

使用程序方式對輸入參數進行校驗的過程如下:

(1).在ActionFormBean中重寫validate方法,主要代碼如下:

[java] view plaincopy
 
  1. ActionErrors errors = new ActionErrors();  
  2. ……  
  3. errors.add(“FormBean的屬性名”,new ActionMessage(“錯誤信息”,false));  
  4. ……  
  5. return errors;  
 

(2).在action中配置校驗錯誤頁面input屬性。一般input的錯誤頁面爲輸入頁面。

(3).在校驗錯誤頁面使用struts標籤<html:errors/>顯示校驗錯誤信息。

注意:若使用國際化資源文件來顯示錯誤信息的話要做如下改動:

(1).errors.add(“FormBean的屬性名”,new ActionMessage(“國際化資源文件中的key”));

(2).在校驗錯誤頁面使用struts標籤<html:errors proprety=”FormBean屬性名”/>顯示錯誤信息。

9.Struts中使用國際化:

使用Struts的<bean:message key=”國際化資源文件中的key”/>標籤。

若有多個資源文件時,在struts資源文件配置時,需指定其key屬性,在使用資源文件的地方使用bundle屬性指定資源文件中配置的key。

10.Struts中Action的校驗方法:

在Struts中除了對輸入參數進行校驗外,也需要對action的業務邏輯進行校驗,具體如下:

(1).在Action中重寫validate方法:

[java] view plaincopy
 
  1. ActionErrors errors = new ActionErrors();  
  2. ……  
  3. errors.add(“FormBean屬性”,new ActionMessage(錯誤信息));  
  4. ……  
 

(2).將校驗錯誤對象保存在請求對象中,有以下兩種方法:

方法1:request.setAttribute(Globals.ERROR_KEY, errors);

方法2:this.saveErrors(request, errors);

注意:當校驗錯誤信息使用國際化資源文件時,需做如下改動:

[java] view plaincopy
 
  1. errors.add(“FormBean屬性名”,new ActionMessage(“國際化資源文件的key”, getResources(request).getMessage(getLocale(request), 國際化資源文件的key)));  
 

11.Struts的validator校驗框架:

(1).在工程WEB-INF目錄下加入struts validator校驗框架的校驗規則文件validator-rules.xml和註冊校驗器文件validation.xml。

這兩個文件可以從struts官方例子中進行拷貝,在其基礎上進行改動。

(2).在struts配置文件struts-config.xml中配置validator校驗框架插件:

[xhtml] view plaincopy
 
  1. <plug-in className=”org.apache.struts.validator.ValidatorPlugIn”>  
  2.        <set-property property=”pathnames”  
  3. Value=”/WEB-INF/validator-rules.xml,/WEB-INF/validation.xml”/>  
  4.        <set-property property=”stopOnFirstError” value=”false”/>  
  5. </plug-in>  
 

(3).ActionFormBean不需要在繼承ActionForm類,而是需要繼承ValidatorForm類,不再需要重新validate方法,struts框架會自動調用validator校驗框架進行校驗。

12.Struts校驗框架注意事項:

(1).如對密碼和確認密碼這種複雜的校驗,可以使用validatewhen校驗。

(2).如果需要覆蓋某個校驗器的提示信息時,可以直接加入如下代碼:<msg key=”錯誤提示信息國際化資源文件” name=”校驗器名”/>

(3).如果對一個form的提交、修改等多種操作進行不同的校驗時,可以使用如下方法:

a. <form name=”action的path” ……>。

b. Form繼承ValidatorActionForm。

(4).對應動態Form校驗時,可以使用DynaValidatorForm和DynaValidatorActionForm。

(5).Struts校驗框架自動生成javascript校驗代碼:

<html:javascript formname=”校驗框架文件中配的form名字(actionpath也支持)”/>

自動生成的javascript默認的校驗方法名是:validate+form名字。

在form表單中通過οnsubmit=”return 校驗方法名(this)”調用。

13.Struts validator校驗框架中校驗文件標籤:

(1).<field>標籤中:<arg>、<msg>等若配resource=”false”,則表明不從國際化資源文件中讀取配置,而是直接讀取所寫內容。

(2).<arg>標籤中可以通過position指定參數的位置順序。

(3).<arg>、<msg>等name屬性是指定對於哪一個變量或者校驗器的參數或信息,即指定校驗主體。

14.Struts validator校驗框架dtd文件:

(1).<validator>元素的msg屬性相當於該validator附帶的一個信息,該msg屬性對validator本身不產生任何影響,一般使用msg的key去國際化資源文件中查找對應的信息。

(2).validation.xml文件中的<form>代表一組校驗規則,我們可以使用它的name屬性值來選擇這組規則去對某個javaBean進行校驗。

15.Struts中防止表單重複提交:

(1).使用<html:form>標籤,會自動生成一個Token字段。

(2).在Action中通過isTokenValid()方法驗證Token是否有效。若有效,則使用resetToken(request)方法將Token清除掉。若無效,則直接返回。

16.Struts數據類型轉換:

(1).編寫一個自定義的轉換器類,繼承Converter類。

(2).將編寫的自定義轉換器註冊到ConvertUtils類中,如下:

ConvertUtils.register(自定義轉換器,目標類型.TYPE/目標數據類型.class);

注意:註冊自定義轉換器的地方:可以寫一個servlet在init中註冊轉換器,或者繼承ActionServlet編寫自定義中央控制器,在自定義的控制器的init方法中註冊。

17.Struts1自定義轉換器的注意事項:

在Struts1中,數據類型轉換器是單向的。

在Struts2中,數據類型轉換器設雙向的。

因此在Struts1中,可以將頁面上String類型轉換爲Date類型,但是在頁面回顯時卻不能將Date類型反向轉換爲String類型,解決的辦法是使用jstl的<fmt>標籤庫。

如:<fmt value=”${Form名.日期屬性名}” pattern=”yyyy-MM-dd” var=”變量名”/>

日期類型就被<fmt>標籤轉換成了String類型了,然後該變量名就可以通過EL表達式進行引用了。

18.Struts的實用小技巧:

(1).頁面上的int類型數據若沒有輸入值,頁面返回時顯示值爲0,解決方法:給ActionServlet配如下初始化參數:

[xhtml] view plaincopy
 
  1. <init-param>  
  2.        <param-name>ConvertNULL</param-name>  
  3.        <param-value>true</param-value>  
  4. </init-param>  
 

(2).Struts中的動態FormBean:

動態FormBean不需要手動寫ActionForm的javaBean,因此沒有屬性的get/set方法。

動態Form其實就相當於一個HashMap,通過set(屬性名)/get(屬性名)來設置和獲取屬性值。

(3).Struts配置文件中<action>的parameter屬性可以向action傳遞參數。

(4).Struts的action配置中,path屬性是必須的,type屬性是可選的。

type、forwar、include是三者之間必選一個。

其中type和forward不能同時出現,forward中隱含了type。

19.Struts的plug-in:

(1).作用:將自己的一些程序代碼插入進Struts中央控制器ActionServlet的生命週期中,即在ActionServlet啓動和停止的過程中加入自己的代碼,但不需要編寫ActionServlet的子類,相比ContextListener的好處在於可以獲得Struts內部的一些特定信息。

(2).編寫plug-in的步驟:

a.編寫實現PlugIn接口的類。

b.在struts配置文件中配置<plug-in>和<set-property>元素。

20.編寫自定義的RequestProcessor:

RequestProcessor用於對請求做一些處理,編寫自定義請求處理器的方法如下:

(1).編寫繼承RequestProcessor的類,覆蓋其process方法。

(2).在struts的配置文件中通過<controller>元素標籤來配置自定義的RequestProcessor類和其相關屬性。

21.Struts中的DispatchAction:

(1).使用DispatchAction時,不能覆蓋其execute()方法。

(2).在struts配置文件中,action中應配置parameter屬性,以區分DispatchAction中不同的方法。

(3).DispatchAction中,有些請求需要ActionForm,而有些請求則不需要,若ActionForm使用了表單校驗的話,struts啓動時,不需要表單的action就會報空指針異常,解決方法如下:

通常寫兩個action,需要表單校驗的請求放在一個DispatchAction中,不需要表單校驗的請求放在另一個DispatchAction中。

22.MappingDispatchAction:

MappingDispatchAction可以讓每個請求對應一個獨立的配置。其在struts中的配置方法:

Action的parameter屬性的值直接爲MappingDispatchAction中具體的方法名,即每個請求對應一個獨立的配置,而type卻對應同一個類。

23.Struts中常用的Action:

(1).ForwardAction與forward屬性:

必須配parameter屬性,用於跳轉到parameter指定的路徑。

注意:ForwardAction還可以簡化配置,不用配type,直接配forward屬性。

(2).IncludeActionn與include屬性:

和ForwardAction與forward屬性類似。

(3).DownloadAction:

動態生成文件,供瀏覽器下載,返回StreamInfo類型。

注意:爲了順利下載文件,最好重寫DownloadAction的execute()方法,在執行父類的execute()方法之前設置HTTP頭信息處理附件,具體代碼如下:

response.setHeader(“Content-Disposition”,”attachment;filename=文件名”);

若自定義寫servlet處理的話,還需加入response.setContentType(“application/x-MSdownload”);

(4).LocaleAction:

用於改變客戶端的語言信息,讀取客戶端指定的國際化資源文件。

注意:LocaleAction的語言,國家,跳轉頁面等參數需要從Form表單中獲得。

(5).LookupDispatchAction:

覆蓋getKeyMethodMap()方法,作用是多個國際化資源文件按鈕對應同一個Action中的同一個方法問題。

注意:按鈕國際化資源文件只能放在默認文件中。

24.Struts將xml文件中各個元素映射成相應的java對象原理:

Struts使用Apache的digester框架將xml文件中的各個元素映射成爲相應的java對象。

(1).Apache的Commons Digester框架是一套xml to Object API,專門用於將XML文檔轉換成爲相關的javaBean對象,它讓開發人員不用編寫解析XML和組裝JavaBean對象的具體代碼和細節。

(2).Digester框架內容應用SAX方式去解析XML文檔,在解析XML文檔過程中,Digester框架按照預先註冊好的規則去處理所遇到的XML數據。

(3).爲Digester框架註冊規則需提供兩個要素:模式(描述xml某個元素的方式)和規則(模式匹配時操作)。

Digester內部維護者一個堆棧。

25.Struts中央控制器ActionServlet init()方法的工作原理:

(1).調用initInternal()方法,初始化struts內部使用的國際化資源包。

(2).調用方法讀取ActionServlet的初始化配置參數,對於ConvertNULL參數爲ConvertUtils註冊相應的轉換器。

(3).使用Digester框架從web.xml文件中獲取ActionServlet的url請求映射路徑。

(4).使用Digester從struts配置文件中生成ModuleConfig對象。

(5).根據ModuleConfig對象生成MessageResource對象,DataSource對象,以及PlugIn對象,並凍結ModuleConfig的設置。

26. Struts中央控制器ActionServlet doGet()和doPost(()方法的工作原理:

(1).doGet()和doPost()方法調用process()方法。

(2).process()方法中先得到與struts配置文件相對應的ModuleConfig對象。

(3).從ModuleConfig對象中獲取RequestProcessor對象。

Struts配置文件中可以通過<controller>元素來配置RequestProcessor的類和其相關的屬性。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章