數據校驗指對數據合法性進行檢查,根據驗證數據的位置可以分為客戶端驗證和伺服器端驗證,今天隨筆主要寫的是實現伺服器端的數據驗證,伺服器端數據驗證主要特點: ·數據提交後在伺服器端驗證 ·防止繞過客戶端驗證提交的非法數據 ·可以在伺服器端處理數據前保證數據的合法性 Struts2中有兩種實現伺服器端驗證 ...
2016-09-02
數據校驗指對數據合法性進行檢查,根據驗證數據的位置可以分為客戶端驗證和伺服器端驗證,今天隨筆主要寫的是實現伺服器端的數據驗證,伺服器端數據驗證主要特點:
·數據提交後在伺服器端驗證
·防止繞過客戶端驗證提交的非法數據
·可以在伺服器端處理數據前保證數據的合法性
Struts2中有兩種實現伺服器端驗證的方式。
一、 使用ActionSupport編碼實現驗證
- 在Action類的方法中直接驗證
在Action 類中直接進行校驗是一種最為原始的方法,這裡作為瞭解,首先是action 類中的驗證代碼:
private User user;
@Override
public String execute() throws Exception {
//驗證用戶名
if(user.getName()==null || "".equals(user.getName())){
this.addFieldError("user.name", "用戶名不能為空");
return INPUT;
}
addActionError("用戶名或密碼錯誤!");//添加action錯誤提示
if(this.hasErrors()){
return INPUT;
}
return SUCCESS;
}
然後在JSP頁面中使用標簽輸出錯誤信息。
<s:fielderror fieldName="user.name"></s:fielderror> //根據欄位輸出錯誤信息
<s:actionerror/> //輸出action錯誤信息
- 重寫validate()方法驗證
Validate()是實現驗證的方法,他會在業務方法之前調用,驗證不通過則業務處理不執行.
private User user;
@Override
public String execute() throws Exception {
System.out.println("完成註冊業務");
addActionError("用戶名或密碼錯誤!");
if(this.hasErrors()) return INPUT;
return SUCCESS;
}
@Override
public void validate() {
if(null==user.getName() || "".equals(user.getName())){
this.addFieldError("user.name", "用戶名不能為空!");
}
}
- 使用validateXxx()方法實現驗證
前面的validate()方法會對所有業務方法進行驗證,而我們只需對單個業務類進行驗證時就要用到validateXxx()方法,Xxx指被驗證的方法名,代碼如下.
public String register() throws Exception {
System.out.println("完成註冊業務");
addActionError("用戶名或密碼錯誤!");
if(this.hasErrors()) returnINPUT;
returnSUCCESS;
}
publicvoid validateRegister() {
if(null==user.getName() || "".equals(user.getName())){
this.addFieldError("user.name", "用戶名不能為空!");
}
}
在register()被調用之前會先調用validateRegister()進行數據校驗。
二、 使用驗證框架實現驗證
在實際開發中,很多驗證是相同的,對於這些許重覆實現的驗證,完全可以統一實現,struts2的驗證框架就實現了這一功能。使用驗證框架時,所有的驗證規則是寫在配置文件中,便於開發與維護,所以這裡詳細介紹一下驗證框架。
- 編寫JSP數據輸入頁面
表單部分代碼:
<form id="register" action="register.action" method="post">
<table >
<caption>註冊</s:text></caption>
<tbody>
<tr>
<td>登錄名:</s:text></td>
<td><input type="text" name="user.name" value="${user.name }" /></td>
<td><s:fielderror fieldName="user.name"></s:fielderror></td>
</tr>
<tr>
<td>密碼:</s:text></td>
<td><input type="password" name="user.pass" /></td>
<td><s:fielderror fieldName="user.pass"></s:fielderror></td>
</tr>
<tr>
<td>重覆密碼:</s:text></td>
<td><input type="password" name="pass" /></td>
<td><s:fielderror fieldName="pass"></s:fielderror></td>
</tr>
<tr>
<td>年齡:</td>
<td><input type="text" name="user.age" /></td>
<td><s:fielderror fieldName="user.age"></s:fielderror></td>
</tr>
<tr>
<td>收入:</td>
<td><input type="text" name="user.income" /></td>
<td><s:fielderror fieldName="user.income"></s:fielderror></td>
</tr>
<tr>
<td>生日:</td>
<td><input type="text" name="user.birthday" /></td>
<td><s:fielderror fieldName="user.birthday"></s:fielderror></td>
</tr>
<tr>
<td>Email</td>
<td><input type="text" name="user.email" /></td>
<td><s:fielderror fieldName="user.email"></s:fielderror></td>
</tr>
<tr>
<td>個人主頁 URL</td>
<td><input type="text" name="user.url" /></td>
<td><s:fielderror fieldName="user.url"></s:fielderror></td>
</tr>
<tr>
<td colspan="3" align="center"><input class="submit" type="submit" value="提交" /></td>
</tr>
</tbody>
</table></form>
- 編寫action類和配置文件
首先是配置文件,配置文件的命名必須為Xxx-yyy-validation.xml,Xxx為對應的action類名,這個文件只要與對應action 類放在同一目錄下就會被自動識別,這裡命名為UserAction-register-validation.xml。
Action 中代碼:
配置文件中的代碼:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC
"-//Apache Struts//XWork Validator 1.0.2//EN"
"http://struts.apache.org/dtds/xwork-validator-1.0.2.dtd">
<validators>
<field name="user.name" >
<field-validator type="requiredstring">
<param name="trim">true</param>
<message>用戶名不能為空</message>
</field-validator>
<field-validator type="regex">
<param name="expression"><![CDATA[\w{4,16}]]></param>
<message>用戶名長度必須在 4-16 位之間</message>
</field-validator>
</field>
<field name="user.pass">
<field-validator type="requiredstring">
<message >密碼不能為空</message>
</field-validator>
<field-validator type="stringlength">
<param name="maxLength">16</param>
<param name="minLength">6</param>
<message>密碼長度必須在 ${minLength} - ${maxLength} 之間</message>
</field-validator>
</field>
<field name="pass">
<field-validator type="fieldexpression">
<param name="expression"><![CDATA[pass==user.pass]]></param>
<message>密碼和確認密碼必須一致</message>
</field-validator>
</field>
<field name="user.age">
<field-validator type="conversion" short-circuit="true">
<message>年齡必須是整數</message>
</field-validator>
<field-validator type="required">
<message>年齡不能為空</message>
</field-validator>
<field-validator type="int">
<param name="max">150</param>
<param name="min">0</param>
<message>年齡必須在 ${min}-${max} 之間</message>
</field-validator>
</field>
<field name="user.income">
<field-validator type="conversion" short-circuit="true">
<message>收入必須是數字</message>
</field-validator>
<field-validator type="required">
<message>收入不能為空</message>
</field-validator>
<field-validator type="double">
<param name="maxInclusive">1000000</param>
<param name="minInclusive">2999.95</param>
<message>收入必須在 ${minInclusive}-${maxInclusive} 之間</message>
</field-validator>
</field>
<field name="user.birthday">
<field-validator type="conversion" short-circuit="true">
<message>生日必須寫作:2008-08-08</message>
</field-validator>
<field-validator type="required" >
<message>生日不能為空</message>
</field-validator>
<field-validator type="date">
<param name="min">2000-01-01</param>
<param name="max">2009-12-31</param>
<message>生日必須在 (2000-01-01, 2009-12-31) 之間</message>
</field-validator>
</field>
<field name="user.email">
<field-validator type="requiredstring">
<message>email 不能為空</message>
</field-validator>
<field-validator type="email">
<message>email 格式不合法</message>
</field-validator>
</field>
<field name="user.url">
<field-validator type="requiredstring">
<message>個人主頁必填</message>
</field-validator>
<field-validator type="url">
<message>url 地址錯誤</message>
</field-validator>
</field>
</validators>
至此驗證規則也寫完了,然後在我們提交表單的時候就可以看到錯誤提示了。
另外需要註意的是,struts2中內置了類型轉換錯誤提示,所以有可能出現雙重提示的狀況。
這時候可以通過在struts.xml中設置解決。
<constant name="struts.custom.i18n.resources" value="msg"/> //設置提示資源msg
然後在src目錄下簡歷msg.properties資源文件,添入xwork.default.invalid.fieldvalue=。就可以了。
到這裡表單數據的後臺驗證就結束了。
最後附上一張數據驗證流程圖。