3.Struts2的输入验证
l????????? 當類型轉換成功以后,struts2將進行輸入驗證
若要進行輸入驗證則你的action必須繼承ActionSupport類,實現其validate方法
在方法中調用addFiledError方法為驗證失敗的字段加上錯誤信息
注意若是一旦有驗證失敗的信息,struts會自動轉入配置文件input中,若沒有則出錯!
若類型轉換時就出錯,也會轉回input指定的頁面并產生一條信息也加入到FiledError中,
在input指定頁面中可以用struts標簽<s:fielderror></s:fielderror>讀出所有轉換失敗的信息與驗證失敗的信息
<s:fielderror> ??????? <s:param>field1</s:param>指定顯示field1字段的信息 ?? </s:fielderror>?
l????????? 類型轉換失敗后struts2會自動產生轉換失敗的信息,一般這種信息并不是想看到得,可以通過配置及及資源文件來替換掉其內置信息
方法:在struts.xml中加入以下語句:
<constant value="message"></constant>
其中name不能變(可以在struts的jar包里面的default.properties找到),表示國際化資源文件的前綴名如中文資源文件為:message_zh.properties
英文為:message_en.properties 若為默認的則為:message.properties 其中資源文件要放在classes文件下面,如在message.properties下面加上一句:xwork.default.invalid.fieldvalue={0} error
若中{0}為占位符,在發生轉換錯誤時struts2會自動將此占位符替換成發生錯誤的字段名,這句話的key不能變(可以從xwork-message.properties中找到,注意每個單詞都是小寫),value可以自定義,這樣的配置為全局配置,即所有的發生轉換錯誤都會調用此默認的格式,一般很少這么使用,因為控制并不精確
局部轉換錯誤替換信息的配置:在要轉換的action的同一包下:名字為:actionName.properties 即名稱與action名稱相同。里面的內容為
invalid.fieldvalue.attributeName=xxxxx message
其中invalild.fieldvalue不能變,struts2會以此來判斷是不是用來類型轉換時的替換信息
attributeName為action中的屬性名稱
?
基中int類型轉換時會有些問題,若abc轉換為int 轉換會失敗,即產生轉換失敗信息,但是struts2會自動將此字段賦值為0,這些要注意
l????????? 一個action里封裝多個業務處理方法,即相當于struts1.x中的DispatcherAction 與MappingDispatcherAction一樣,不過這個action 依然只繼承ActionSupport.
? 在自定義且繼承ActionSupport的Action中加入業務處理方法,在struts.xml中的相應配置中加入
<!--
使用struts2的action很簡單,也只繼承一個ActionSupport就可以了,完全可以實現struts1.x中的
Action ,MappingDispatcherAction,DispatcherAction要實現的功能。
添加一個method屬性則請求此action時會調用對應名稱的業務處理方法。
若不加,則有兩種情況
1.執行默認的execute方法。(此時請求的的path為register.action)
2.執行指定的方法,這個指定要在請求時指定.(此時請求的path為register!callMethodName.action)
比較奇怪,不過好用。
?-->
<action name="register" class="edu.yzu.action.UserAction" method="register">
<!-- result 的name屬性可以不寫,不寫的話表示為success -->
<result>/result.jsp</result>
<result name="input">/index.jsp</result>
<result name="login">/login.jsp</result>
<!--
為這個action指定攔截器,若不指定則會使用此包的默認攔截器
若指定一個攔截器,則此包的默認攔截器則不會被用于攔截此action
所以若還要使用默認攔截器時必須顯示指出,如下:
?-->
?
<interceptor-ref name="thirdinterceptor"></interceptor-ref>
<interceptor-ref name="mystack"></interceptor-ref>
<interceptor-ref name="thirdinterceptor"></interceptor-ref>
<interceptor-ref name="thirdinterceptor"></interceptor-ref>
</action>
這里要注意對于同一個自定義的action 中所有的業務處理方法在執行前一定會執行 validate方法,這顯然有時并不合理。Struts2對于不同的業務處理方法的驗證采用默認規則,即validate+業務處理方法名.如register()的驗證方法為validateRegister().但是依然會執行validate()方法。解決方法有兩個。1.不重寫validate方法 2.將validate方法名改為validateExecute().因為execute()方法為action的默認方法,即struts.xml文件中沒有配置method屬性時會自動調用此方法。將validate改為validateExecute()后則此驗證方法只驗證execute()
Struts2的校驗框架
l????????? Struts2的校驗框架是針對一個action進行的(即一個action類一個校驗文件,文件名也有一點的規則:actionName-validation.xml),用xml文件進行配置,這點有些類似于struts1.x
Xml文件的結構為
它的服務器端校驗分為兩種方式,一種是基于字段的,一種是基于驗證器的,事實上兩種方法是一回事,只是看問題的方面不同而已
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators SYSTEM "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd" >
<validators>
?
<!-- 基于字段的方式
filed 的name屬性為要驗證action的屬性
field-validator 的type屬性為用哪種校驗器來校驗,這個值可以從
com.opensymphony.xwork2.validator.validators包下面的default.xml 中找到
short-circuit是指定當本驗證器驗證失敗后后面的驗證器是否還繼續驗證。蠻有用
其中param 的name屬性為對應校驗器的java類的屬性
message為校驗失敗后添加到fielderror中的信息。
?-->
<field name="userName" >
<field-validator type="requiredstring" short-circuit="true">
<param name="trim">true</param>
<message>userName shoud not blank!</message>
</field-validator>
<field-validator type="stringlength">
<param name="minLength">6</param>
<param name="maxLength">10</param>
<message>userName shoud be between ${minLength} and ${maxLength}!</message>
</field-validator>
</field>
?
<!--
基于校驗器的方式
其中每個校驗器的最一個param 的name的值都為fieldName固定不變,
表示校驗action中的哪個屬性
以后的param 的name與基于字段的校驗的含義一樣
可以看出基于校驗器的驗證并不如基于字段的驗證看來直接(兩者可以混合使用)
?-->
<validator type="requiredstring">
<param name="fieldName">userName</param>
<message>userName shoud not be blank!</message>
</validator>
<validator type="stringlength">
<param name="fieldName">userName</param>
<param name="minLength">6</param>
<param name="maxLength">10</param>
<message>userName shoud be between ${minLength} and ${maxLength}!</message>
</validator>
?
</validators>
?
?
?
要注意的是同樣一個自定義的action中有幾個業務處理方法時也可以對每個業務處理方法進行校驗。校驗文件與此action放在同一個包下,并且名字為:actionName-methodName-validation.xml
需要注意的是如果也為此action 也配置了actionName-validation.xml文件,則此文件也會被使用于校驗,應該盡量避免這種情況:方法與上面上同,將actionName-validation.xml改為actionName-execute-validation.xml 使此文件專用于默認的execute業務方法的校驗。(事實上這種情況似乎遇到的并不多)
?
Struts2提供的客戶端校驗最好不要使用,有很大缺陷!
轉載于:https://www.cnblogs.com/jinkun/archive/2010/05/03/1726459.html
總結
以上是生活随笔為你收集整理的3.Struts2的输入验证的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 错误602,未能在sysindexes中
- 下一篇: 注册MSComm方法