structs2總結

一.Structs2的helloworld

1.加入Struts2所依賴jar包到tomcat容器webapps 下面項目目錄下面的 \WEB-INF\lib\

2.web.xml配置我們的核心控制器StrutsPrepareAndExecuteFilter

3.新建一個Action類,處理業務邏輯

4.在classpath下新建struts.xml文件,註冊Action類

5.訪問action:http://localhost/appName/<PackageNamespace>/<ActionName>.<Extension>

<PackageNamespace> 代表你在struts.xml中配置package的namespace,action配置中name! <Extension>默認可不寫或者是.action

二、Structs2配置文件

分爲內部配置文件和開發人員使用的配置文件。其中,內部配置文件由Structs2框架自動加載,對其自身進行配置,如structs-default.xml和structs-plugin.xml;外部配置文件由開發人員使用,如web.xml,structs.xml等。

1.在根元素<struts>下可以使用include子元素引入其他的配置文件,這樣可以將各個模塊分散在不同的配置文件中進行配置。

2.package元素下可以定義全局視圖,如果兩個package要共享相同的全局視圖,那麼爲它們定義一個相同的父包。

3.<action>元素的method屬性可以不設置,默認爲executeclass屬性可以不設置,默認爲ActionSupport

4.<result>元素的type屬性和name屬性都可以不設置,默認值分別爲dispatcher和success。當<result>元素中只有默認的<param>子元素要設置時,可以將該<param>子元素中的內容直接寫在<result>標籤中。

5.在<package>元素下配置<default-action-ref>子元素,用於說明在該包下不存在的action路徑映射,都可以統交給一個默認的<action>元素去處理。

6.在<package>元素下配置<default-class-ref>子元素,用於說明默認的Action類是可以進行配置修改的。

7.在根元素<struts>下可以使用constant子元素配置常量。

8.從strut2的核心jar包內的org.apache.struts2包下的default.properties文件中可以看到 各個常量的註釋說明,典型幾個常量:

<constant name="struts.action.extension" value="do,go"/>配置訪問Action的後綴,可以配置多個後綴名。 提示:default.properties文件中爲該常量配置了一個空字符串。

<constant name="struts.devMode" value="true"/>可以讓struts在控制檯中打印出更多的信息和重新加載配置文件。

<constant name="struts.enable.DynamicMethodInvocation" value="false"/>可以配置不支持動態方法調用。

<constant name="struts.configuration.xml.reload" value="true"/>可以讓struts重新加載配置文件,但不會導致web應用重新啓動。

9.常量可以在下面多個文件中進行定義,struts2加載常量的搜索順序如下,後面的設置 可以覆蓋前面的設置:

default.properties文件

struts-default.xml

struts-plugin.xml

Struts.xml(建議放到該文件中)

struts.properties(爲了與webwork向後兼容而提供)

web.xml

三、Structs2處理流程

當用戶發出請求後,web.xml中的StrutsPrepareAndExecuteFilter核心控制器進行攔截過濾。一般情況下,它負責攔截所有的用戶請求。默認情況下,如果用戶的請求路徑不帶後綴或者以".action"結尾,這是請求將被轉入structs2框架處理,否則structs2忽略請求。當請求轉入structs2框架時會先經過一系列的攔截器,然後再到action。與structs1不同,structs2對用戶的每一次請求都會創建一個action,所有structs2中的action是線程安全的。

四、包與Action的定位

如果不存在相應的包,則查找上一層的包名,注意,只要一旦追溯到了一個最匹配的上層包名,不管這個包中是否存在要訪問的Action,都不會再追溯更上層的包名了。如果struts2定位到的包名中不存在當前要訪問的Action struts2接着還會在默認名稱空間尋找該Action,只有在默認名稱空間的包名中還沒找到該action時,才報錯action找不到的錯誤。注意("/"也算是一個包,只是這個包比較特殊!

五、攔截器(interceptor)

1.自定義攔截器

<1>定義一個類實現interceptor接口

<2>在structs.xml中註冊攔截器

<3>爲action應用攔截器

2.其他

<1>一旦爲某個action顯式指定了某個攔截器,則所屬包中定義的默認攔截器將不起作用。

<2>如果想保留structs2的攔截器,又想使用我們自定義的攔截器,可以定義一個攔截器棧。

<3><default-interceptor-ref name="defaultStack"/>把攔截器定義爲默認的攔截器。每個包只能定義一個默認的攔截器。

六.輸入校驗

可以對action中的指定方法和所有方法進行校驗。

1.提供了兩種實現方式

採用手工編寫代碼實現

基於xml配置方式實現

2.手工編寫代碼對action中所有方法進行校驗

通過重新validate()方法實現,當某個數據校驗失敗時,應該調用addFieldError()方法往系統的fieldErrors添加校驗失敗信息。爲了使用addFieldError()方法,action可以繼承ActionSupport,如果系統的fieldErrors包含失敗信息,structs2會將請求轉發到名爲input的result,在input視圖中可以通過<s:fielderror/>顯示失敗信息。

<1>提供validate方法

<2>提供input視圖,一般該視圖爲提交信息的頁面。

<3>在編輯頁面導入s標籤,使用<s:fielderror/>顯示失敗信息。

3.手工編寫代碼對action中指定方法進行校驗

通過validateXxx()方法實現,它之後校驗action中方法名爲xxx的方法。

4.輸入校驗流程

<1>類型轉換器對請求參數執行類型轉換,並把轉換後的值賦給action中的屬性。

<2>如果在執行類型轉換的過程中出現異常,系統會將異常信息保存到ActionContext,conversionError攔截器將異常信息封裝到fieldError裏。不管類型轉換是否出現異常,都會進入第3步。

<3>系統通過反射技術先調用action中的validateXxx()方法,Xxx爲方法名。

<4>再調用action中的validate()方法。

<5>經過上面四個步驟,如果系統中的fieldErrors存在錯誤信息(即存放錯誤信息的集合的size大於0),系統自動將請求轉發至名稱爲input的視圖。如果系統中的fieldErrors沒有任何錯誤信息,系統將執行action中的處理方法。

注意:如果確認validate方法中沒有問題,但還是跳到input視圖時,需要判斷類 型是否轉換失敗。

5.基於xml方式對action中所有方法進行校驗

使用xml配置方式實現輸入校驗,action也需要繼承ActionSupport,並且提供校驗文件,校驗文件和action類紡織同一個包下。文件的取名格式爲:ActionClassName-validation.xml。

採用配置文件校驗方式校驗後,Action中的validatable有關的校驗方法也會執行,且配置文件校驗方式在validate校驗方法之前執行。

系統定義的校驗器在xwork-2.x.jar中...validators包下的default.xml中找到。

6.基於xml方式對action中指定方法進行校驗

xml文件的取名格式爲:ActionClassName-actionName-validation.xml 。如:

UserAction-user_add-validation.xml(action的名稱是由url路徑決定的)。

在處理請求方法上使用@SkipValiation註解,配置文件校驗方式也將無效。

7.基於xml校驗的一些特點

當爲某個action提供了所有方法和指定方法校驗兩種規則時,系統會先尋找所有方法的校驗文件,然後繼續尋找指定方法的校驗,當尋找完所有的相關校驗文件後,會將所有的校驗規則進行彙總,然後全部應用於action的校驗。如果兩個校驗文件中指定的校驗規則發生衝突,則只使用後面文件中的校驗規則。

當action繼承了另一個action,父類的action校驗文件會先被搜索到。

七、接收請求參數

1.採用基本類型接受請求參數(get/post)

在action類中定義與請求參數同名的屬性,structs2便能自動接受請求參數並賦予給同名屬性。如:

請求路徑:http://localhost/test/view.action?id=78

public class ProductAction{

public Integer id;

setter和getter.......

}

structs2通過反射技術調用與請求參數同名的屬性的setter方法來獲取請求參數值。

2.採用複合類型接收請求參數

請求路徑:http://localhost/test/view.action?product.id=78

public class ProductAction{

private Product product;

setter和getter.....

}

Structs2首先通過反射技術調用Product的默認構造器創建product對象,然後通過反射技術調用product中的請求參數同名的屬性的setter方法來獲取請求參數值。

3.其他

<1>Struts框架在把請求交給action的業務方法去處理之前,可以將請求參數來填充到Action的相應屬性中,所以,對於請求消息中的每個參數(包括網頁表單中的每個字段),Action中 通常都有一個對應的屬性來接受相應的參數值。

<2>在action的業務方法中也可以訪問Servlet API,通過request.getParameter獲得參數,框架使用中不建議這種方法。

<3>在structs2.1.6的版本中,會出現中文亂碼問題,可以自己寫一個filter,在structs2之前進行過濾。

八、文件上傳

1.要想讓瀏覽器把文件內容也傳給服務器,必須將form表單的enctype屬性設置爲"multipart/form-data",提交方式必須是post。

2.文件過大,請求將會被拒絕。在structs.xml中可以更改它的最大文件上傳限制。

<constant name="struts.multipart.maxSize" value="60000"></constant>

3.文件上傳action類中的命名一定要符合structs2的規範。

上傳文件的名稱必須是:上傳文件+FileName;

上傳文件的類型必須是:上傳文件+ContentType。

如:上傳文件名稱爲:uploadFiles,則上傳文件的名稱命名是uploadFilesFileName上傳文件的類型命名爲uploadFilesContentType,切勿寫成uploadFileFileNames。

九、通配符

1.在action元素的name屬性中可以使用*通配符,它可以匹配除了"/"以外的多個連續字符,在action元素的class和method屬性以及result元素中可以引用*通配符在訪問期間實際匹配的內容。

2.如果*匹配的內容爲空,則調用execute方法;對於採用下劃線連接*的方式,如果訪問路徑中沒有爲*部分指定內容,那麼在訪問路徑中還可以省略下劃線。

3.使用*通配符可能導致有多個action元素與一個訪問路徑匹配,這時候以排在配置文件中最後的配置項爲準,所以更具體的模式應在更不具體的模式之後進行配置。




發佈了32 篇原創文章 · 獲贊 0 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章