轉自:https://blog.csdn.net/chjttony/article/details/6099101
1.Struts1是Apache推出的java web開發領域一個比較早,同時也是使用最廣泛的MVC開源框架,對於Struts1的基礎不再做說明,本文只總結Struts1開發中的一些小技巧。
2.Struts配置文件中支持通配符:
如:
- <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方法,主要代碼如下:
- ActionErrors errors = new ActionErrors();
- ……
- errors.add(“FormBean的屬性名”,new ActionMessage(“錯誤信息”,false));
- ……
- 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方法:
- ActionErrors errors = new ActionErrors();
- ……
- errors.add(“FormBean屬性”,new ActionMessage(錯誤信息));
- ……
(2).將校驗錯誤對象保存在請求對象中,有以下兩種方法:
方法1:request.setAttribute(Globals.ERROR_KEY, errors);
方法2:this.saveErrors(request, errors);
注意:當校驗錯誤信息使用國際化資源文件時,需做如下改動:
- 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校驗框架插件:
- <plug-in className=”org.apache.struts.validator.ValidatorPlugIn”>
- <set-property property=”pathnames”
- Value=”/WEB-INF/validator-rules.xml,/WEB-INF/validation.xml”/>
- <set-property property=”stopOnFirstError” value=”false”/>
- </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表單中通過onsubmit=”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配如下初始化參數:
- <init-param>
- <param-name>ConvertNULL</param-name>
- <param-value>true</param-value>
- </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的類和其相關的屬性。