Struts2學習筆記
第十一記:struts2輸入校驗
注:action內針對所有方法或指定方法名的校驗。如果有驗證方法必須在struts.xml中設置input視圖,當未通過驗證返回名稱爲input的視圖
1、struts2的輸入校驗方式
方式一:採用手工編碼實現
方式二:基於XML配置實現
2、採用手工編碼實現
2-1、編寫JSP表單輸入:change.jsp
<from action="${pageContext.request.contextPath}/person/person_save.action"method="post">
用戶名:<input name="username" type="text"/>
手機號:<input name="mobile"type="text"/>
<input type="submit"value="提交"/>
</from>
2-2、編寫Action的方法
該action繼承自ActionSupport類,並且需要重寫validate方法。
public class PersonAction extends ActionSupport{
private String username;
private String mobile;
public String getUsername(){
return this.message;
}
public void setUsername(String username){
this.username=username;
}
public String getMobile(){
return this.mobile;
}
public void setMobile(String mobile){
this.mobile=mobile;
}
publicString save( ){
ActionContext.getContext.put("message","保存成功!");
return "message";
}
public String update( ){
ActionContext.getContext.put("message","更新成功!");
return "message";
}
@override//此方法會對action中的所有方法進行校驗
public void validate(){
if(this.username==null||"".equals(this.username.trim())){
this.addFieldError("username","用戶名不能爲空");
}
if(this.mobile==null||"".equals(this.username.trim())){
this.addFieldError("mobile","手機號不能爲空");
}else{
if(!Pattern.compile("^1[358]\\d${9}")).matcher(this.mobile).method()){
this.addFieldError("mobile","手機號格式不正確");
}
}
}
}
2-3、導入struts標籤庫並設置錯誤結果顯示標籤
<%@ taglib uri="struts-tags" prefix="s" %>
在表單外部或者內部添加錯誤顯示標籤:<s:fielderror />
2-4、修改struts.xml文件
<package name="person" namespace="/person" extends="struts default">
<action name="person_*" class="com.struts.action.PersonAction">
<result name="input">/WEB-INF/page/change.jsp</result>
<result name="message">/WEB-INF/page/message.jsp</result>
</action>
</package>
2-5、控制指定方法的校驗
規則:名稱如validateXxx的方法表示對xxx方法的校驗。
如果將validate方法改爲validateSave則只能對save方法進行校驗。
2-6、校驗過程梳理
2-6-1、類型轉換:對action對象的屬性賦值
2-6-2、檢測類型轉換異常,如果發現則通過ActionContext和ConversionError對象添加異常信息到fieldErrors對象
2-6-3、執行validateXxx()方法。
2-6-4、執行validate()方法。
2-6-5、讀取fieldErrors對象,如果不爲空則轉到Input視圖,否則執行action操作。
注:這裏發生的錯誤多半是類型轉換。
3、XML配置校驗
3-1、驗證文件的命名和驗證規則
實現action類同樣需要繼承自ActionSupport,需要驗證的action的配置文件於struts.xml都在src目錄下,並且該xml驗證文件的名稱是ActionName-validation.xml
"*-validation.xml"是固定寫法;*是action的名稱,如PersonAction的驗證文件是PersonAction-validation.xml.
xwork目錄下路徑;com.opensymphony.xwork2.validator.validators有個default.xml文件提供了基本數據驗證的默認驗證。
default.xml的配置如下所示:
<?xml version="1.0" encoding="UTF-8"?>
< !DOCTYPE validators PUBLIC
"-//OpenSymphony Group//XWork Validator Config 1.0//EN"
"http://www.opensymphony.com/xwork/xwork-validator-config-1.0.dtd">
< !-- START SNIPPET: validators-default -->
< validators>
<validator name="required" class="com.opensymphony.xwork2.validator.validators.RequiredFieldValidator"/>
<validator name="requiredstring" class="com.opensymphony.xwork2.validator.validators.RequiredStringValidator"/>
<validator name="int" class="com.opensymphony.xwork2.validator.validators.IntRangeFieldValidator"/>
<validator name="long" class="com.opensymphony.xwork2.validator.validators.LongRangeFieldValidator"/>
<validator name="short" class="com.opensymphony.xwork2.validator.validators.ShortRangeFieldValidator"/>
<validator name="double" class="com.opensymphony.xwork2.validator.validators.DoubleRangeFieldValidator"/>
<validator name="date" class="com.opensymphony.xwork2.validator.validators.DateRangeFieldValidator"/>
<validator name="expression" class="com.opensymphony.xwork2.validator.validators.ExpressionValidator"/>
<validator name="fieldexpression" class="com.opensymphony.xwork2.validator.validators.FieldExpressionValidator"/>
<validator name="email" class="com.opensymphony.xwork2.validator.validators.EmailValidator"/>
<validator name="url" class="com.opensymphony.xwork2.validator.validators.URLValidator"/>
<validator name="visitor" class="com.opensymphony.xwork2.validator.validators.VisitorFieldValidator"/>
<validator name="conversion" class="com.opensymphony.xwork2.validator.validators.ConversionErrorFieldValidator"/>
<validator name="stringlength" class="com.opensymphony.xwork2.validator.validators.StringLengthFieldValidator"/>
<validator name="regex" class="com.opensymphony.xwork2.validator.validators.RegexFieldValidator"/>
<validator name="conditionalvisitor" class="com.opensymphony.xwork2.validator.validators.ConditionalVisitorFieldValidator"/>
< /validators>
< !-- END SNIPPET: validators-default -->
-校驗規則:
required:必填校驗器
requiredstring:必填字符串校驗器
int:整數校驗器
double:雙精度浮點數校驗器
date:日期校驗器
expression:表達式校驗器
fieldexpression:字段表達式校驗器
email:電子郵件校驗器
url:網址校驗器
visitor:Visitor校驗器
conversion:轉換校驗器
stringlength:字符串長度校驗器
regex:正則表達式校驗器
3-2、struts2例子提供的配置校驗的編寫示例
路徑:/struts_2.2.1.1/apps/blank/src/main/resources/example/login-validation.xml
< !DOCTYPE validators PUBLIC
"-//OpenSymphony Group//XWork Validator 1.0.2//EN"
"http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">
< validators>
<field name="username">
<field-validator type="requiredstring">
<message key="requiredstring"/>
</field-validator>
</field>
<field name="password">
<field-validator type="requiredstring">
<message key="requiredstring"/>
</field-validator>
</field>
< /validators>
<?xml version="1.0" encoding="UTF-8"?>
< !DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0.2//EN"
"http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">
<validators>
<!-- 驗證用戶名是否合法 -->
<field name="username">
<field-validator type="requiredstring">
<param name="trim">true</param>
<message>請填寫用戶名</message>
</field-validator>
<field-validator type="stringlength">
<param name="minLength">4</param>
<param name="maxLength">32</param>
<message>用戶名長度應在4到32個字符間</message>
</field-validator>
< /field>
<!-- 驗證密碼是否合法 -->
<field name="password">
<field-validator type="requiredstring">
<message>請填寫密碼</message>
</field-validator>
<field-validator type="stringlength">
<param name="minLength">6</param>
<param name="maxLength">32</param>
<message>爲了您賬號的安全,請設置6個字母以上的密碼(最長可設置32個字母)</message>
</field-validator>
< /field>
<!-- 驗證手機號是否合法 -->
< validators>
<field name="user">
<field-validator type="regex">
<param name="expression_r"><![CDATA[^1[358]\d{9}$]]></param>
<message>不是合法的手機號</message>
</field-validator>
</field>
< /validators>
</validators>
3-4、常用的驗證配置
3-4-1、必填檢驗
<validators>
<field name="username">
<field-validator type="required">
<message>指定檢驗失敗的提示信息</message>
</field-validator>
</field>
< /validators>
3-4-2、必填字符串檢驗
<validators>
<field name="username">
<field-validator type="requiredstring">
<param name="trim">true</param>
<message>指定檢驗失敗的提示信息</message>
</field-validator>
</field>
< /validators>
3-4-3、整數檢驗器/浮點檢驗
<validators>
<field name="age">
<field-validator type="int">
<param name="min">1</param>
<param name="max">150</param>
<message>年紀必須在1到150之間</message>
</field-validator>
</field>
< /validators>
3-4-4、日期檢驗
<validators>
<field name="birth">
<field-validator type="date">
<param name="min">1900-01-01</param>
<param name="max">2050-02-21</param>
<message key="birth.range"/>
</field-validator>
</field>
< /validators>
3-4-5、字段表達式檢驗器(要求指定字段滿足一個邏輯表達式
<validators>
<field name="re_pass">
<field-validator type="fieldexpression">
<!--指定邏輯表達式 -->
<param name="expression"> (pass eq re_pass)</param>
<message>密碼必須和確認密碼相等</message>
</field-validator>
</field>
< /validators>
3-4-6、郵件地址校驗
<validators>
<field name="email">
<field-validator type="email">
<message>你的電子郵件地址必須是一個有效的電郵地址</message>
</field-validator>
</field>
< /validators>
3-4-7、網址檢驗
<validators>
<field name="url">
<field-validator type="url">
<message>你的主頁地址必須是一個有效的網址</message>
</field-validator>
</field>
< /validators>
3-4-8、字符串長度檢驗
<validators>
<field name="user">
<param name="minlength">4</param>
<param name="maxlength">20</param>
<message>你的用戶名長度必須在4到20之間</message>
</field-validator>
</field>
< /validators>
3-4-9、正則表達式檢驗
<validators>
<field name="user">
<field-validator type="regex">
<param name="expression_r"><![CDATA[(\w{4,25})]]></param>
<message>您輸入的用戶名只能是字母和數組,且長度必須在4到25之間</message>
</field-validator>
</field>
< /validators>
文件命名規則:ActionClassName-ActonName-validation.xml
如在PersionAction中訪問update的方法驗證,則可以寫成:
PersonAction-person_update-validation.xml
struts.xml的配置如下:
<action name="person_*" class="com.struts.action.PersonAction">
< result name="input">/WEB-INF/page/change.jsp</result><!-- 驗證失敗返回該頁面 -->
< result name="message">/WEB-INF/page/message.jsp</result><!-- 成功轉到頁面 -->
...</action>
注意:所有方法的校驗和指定方法的校驗同時存在的時候,方法驗證會合並然後執行,對於同樣的方法
執行後面那個,前面的被覆蓋。