struts2 validation.xml 驗證
1.表單一般使用struts2標籤<s:form validate="false"/>關閉客戶端驗證,使用<s:textfield type="text" name="name"/>name對應action中的屬性
2.在Action配置中一定要設定input返回頁面<result name="input"/>
3.新增驗證只要建立驗證的xml檔案,在Action同包下,建立:Action類名-validation.xml
4.對於int型和Date型如果客戶端傳來的格式不對,後臺會提示警告報錯,需要用javascript正則表示式驗證。
- <!DOCTYPE validators PUBLIC
- "-//Apache Struts//XWork Validator 1.0.2//EN"
- "http://struts.apache.org/dtds/xwork-validator-1.0.2.dtd">
- <validators>
- <fieldname="name">
- <field-validatortype="requiredstring">
-
<paramname="trim">true
- <message>請填寫使用者名稱</message>
- </field-validator>
- <field-validatortype="stringlength">
- <paramname="minLength">4</param>
- <paramname="maxLength">32</param>
-
<message>使用者名稱長度應在4到32個字元間
- </field-validator>
- </field>
- <fieldname="pass">
- <field-validatortype="requiredstring">
- <message>請填寫密碼</message>
- </field-validator>
- <field-validatortype="stringlength">
- <paramname="minLength">6</param>
- <paramname="maxLength">32</param>
- <message>為了您賬號的安全,請設定6個字母以上的密碼(最長可設定32個字母)</message>
- </field-validator>
- </field>
- <fieldname="age">
- <field-validatortype="int">
- <paramname="min">1</param>
- <paramname="max">70</param>
- <message>請輸入1-70之間</message>
- </field-validator>
- </field>
- <fieldname="birth">
- <field-validatortype="date">
- <paramname="min">1900-01-01</param>
- <paramname="max">2050-02-21</param>
- <message>生日必須在{min}到{max}之間</message>
- </field-validator>
- </field>
- </validators>
1,輸入校驗介紹
Struts2提供了功能強大的輸入校驗機制,通過Struts2內建的輸入校驗器,應用無需書寫任何程式碼,即可完成大部分的校驗功能,並可以同時完成客戶端和伺服器端的校驗。如果應用的輸入校驗規則特別,Struts2也允許通過重寫validate方法來完成自定義校驗,另外Struts2的開放性還允許開發者提供自定義的校驗器。
表現層的資料處理包括兩個方面:一是資料型別的轉化,因為Web應用接收到的所有資料都是字串型別的;另一個就是輸入校驗,因為開發者必須全面考慮使用者輸入的各種情況,尤其需要注意那些非正常輸入。
客戶端的校驗最基礎的方法就是在頁面寫javascript程式碼手工校驗,伺服器端的校驗最基礎的方法就是在處理請求的Servlet的service()方法中新增校驗程式碼。
Struts2中可以通過重寫validate方法來完成輸入校驗。如果我們重寫了validate方法,則該方法會應用於此Action中的所有提供服務的業務方法。Struts2支援校驗特定方法的validateXxx()方法。例如某個Action中有一個regist()業務方法,我們可以寫一個validateRegist()方法來進行regist()的特殊校驗,客戶端請求呼叫的次序如下:validateRegist()--------------->validate()-------------->regist()
Struts2的輸入校驗流程如下:
1,型別轉換器負責對字串的請求引數執行型別轉換,並將這此值設定成Action的屬性值。
2,在執行型別轉換過程中可能出現異常,如果出現異常,將異常資訊儲存到ActionContext中,conversionError攔截器負責將其封裝到fieldError裡,然後執行第3步;如果轉換過程沒有異常資訊,則直接進入第3步。
3,通過反射呼叫validateXxx()方法,其中Xxx是即將處理使用者請求的處理邏輯所對應的方法名。
4,呼叫Action類裡的validate()方法。
5,如果經過上面4步都沒有出現fieldError,將呼叫Action裡處理使用者請求的處理方法;如果出現了fieldError,系統將轉入input邏輯檢視所指定的檢視資源。
2,Struts2的輸入校驗
1,最基礎的Struts2輸入校驗
Struts2中單獨對每一個Action指定一個校驗檔案,它的命名方式為<Action-name>-validation.xml。它存放在與Action相同的包中,校驗只需要配置一個校驗檔案即可實現。系統的其它地方不需要改動,系統會自動載入該檔案。校驗檔案RegistAction-validation.xml如下例:
<?xml version="1.0" encoding="GBK"?>
<!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0.2//EN"
"http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">
<!-- 校驗檔案的根元素 -->
<validators>
<!-- 校驗Action的name屬性 -->
<field name="name">
<!-- 指定name屬性必須滿足必填規則 -->
<field-validator type="requiredstring">
<!-- 校驗前去掉name屬性的前後空格 -->
<param name="trim">true</param>
<!-- 提示資訊 -->
<message>必須輸入名字</message>
</field-validator>
<!-- 指定name屬性必須滿足匹配指定的正則表示式 -->
<field-validator type="regex">
<param name="expression"><![CDATA[(/w{4,25})]]></param>
<message>您輸入的使用者名稱只能是字母和陣列,且長度必須在4到25之間</message>
</field-validator>
</field>
<field name="pass">
<field-validator type="requiredstring">
<param name="trim">true</param>
<message>必須輸入密碼</message>
</field-validator>
<field-validator type="regex">
<param name="expression"><![CDATA[(/w{4,25})]]></param>
<message>您輸入的密碼只能是字母和陣列,且長度必須在4到25之間</message>
</field-validator>
</field>
<field name="age">
<!-- 指定age屬性必須在指定的範圍內 -->
<field-validator type="int">
<param name="min">1</param>
<param name="max">150</param>
<message>年紀必須在1到150之間</message>
</field-validator>
</field>
<field name="birth">
<!-- 指定age屬性必須在指定的範圍內 -->
<field-validator type="date">
<param name="min">1900-01-01</param>
<param name="max">2050-02-21</param>
<message>年紀必須在${min}到${max}之間</message>
</field-validator>
</field>
</validators>
2,Struts2中輸入校驗提示資訊的國際化
在Struts2的校驗中應用國際化也非常簡單,請看如下xml配置程式碼: <field name="name">
<field-validator type="requiredstring">
<param name="trim">true</param>
<message key="name.requried"/>
</field-validator>
<field-validator type="regex">
<param name="expression"><![CDATA[(/w{4,25})]]></param>
<message key="name.regex"/>
</field-validator>
</field>
message元素指定key屬性指定的是國際化資源中對應的key。還可以使用以下配置獲取國際化資源中的資訊:<message>${getText("name.requried")}</message> 這種方式是通過呼叫ActionSupport類的getText()方法來獲取國際化資源的。
3,Struts2中應用客戶端輸入校驗
使用客戶端輸入校驗可以減輕伺服器的負擔。Struts2對客戶端的輸入校驗進行了封裝,使得我們開發時特別容易。
1,JSP頁面程式碼如下:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>註冊頁面</title>
</head>
<body>
<s:form action="regist" validate="true">
<s:textfield label="使用者名稱" name="name"></s:textfield>
<s:password label="密碼" name="pass"></s:password>
<s:textfield label="年齡" name="age"></s:textfield>
<s:textfield label="生日" name="birth"></s:textfield>
<s:submit></s:submit>
</s:form>
</body>
</html>
注意這裡要用Struts2的標籤,form的validate屬性要設定為true,並且不要將theme屬性指定為simple.(simple表示struts2將把這個解析成普通的HTML標籤)
2,校驗配置檔案:這裡的校驗配置檔案同原先的配置檔案並沒有不同,但是這裡使用<message key="name.requried"/>無法從全域性國際化資源中獲取資訊,只能使用<message>${getText("name.requried")}</message>方式獲取國際化資源。
3,部署後的JSP頁面程式碼:
大家可以看到部署後的JSP頁面中自動生成了我們在校驗配置檔案中對應的javascript程式碼。
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>註冊頁面</title>
</head>
<body>
<script src="/lovely/struts/xhtml/validation.js"></script>
<form namespace="" id="regist" name="regist" onsubmit="return validateForm_regist();"action="/lovely/regist.action" method="POST">
<table class="wwFormTable">
<tr>
<td class="tdLabel"><label for="regist_name" class="label">使用者名稱:</label></td>
<td
><input type="text" name="name" value="" id="regist_name"/>
</td>
</tr>
<tr>
<td class="tdLabel"><label for="regist_pass" class="label">密碼:</label></td>
<td
><input type="password" name="pass" id="regist_pass"/>
</td>
</tr>
<tr>
<td class="tdLabel"><label for="regist_age" class="label">年齡:</label></td>
<td
><input type="text" name="age" value="" id="regist_age"/>
</td>
</tr>
<tr>
<td class="tdLabel"><label for="regist_birth" class="label">生日:</label></td>
<td
><input type="text" name="birth" value="" id="regist_birth"/>
</td>
</tr>
<tr>
<td colspan="2"><div align="right"><input type="submit" id="regist_0" value="Submit"/>
</div></td>
</tr>
</table></form>
<script type="text/javascript">
function validateForm_regist() {
form = document.getElementById("regist");
clearErrorMessages(form);
clearErrorLabels(form);
var errors = false;
// field name: name
// validator name: requiredstring
if (form.elements['name']) {
field = form.elements['name'];
var error = "必須輸入使用者名稱!";
if (field.value != null && (field.value == "" || field.value.replace(/^/s+|/s+$/g,"").length == 0)) {
addError(field, error);
errors = true;
}
}
// field name: name
// validator name: regex
if (form.elements['name']) {
field = form.elements['name'];
var error = "您輸入的使用者名稱只能是字母和陣列,且長度必須在4到25之間";
if (field.value != null && !field.value.match("(//w{4,25})"))
{
addError(field, error);
errors = true;
}
}
// field name: pass
// validator name: requiredstring
if (form.elements['pass']) {
field = form.elements['pass'];
var error = "必須輸入密碼";
if (field.value != null && (field.value == "" || field.value.replace(/^/s+|/s+$/g,"").length == 0)) {
addError(field, error);
errors = true;
}
}
// field name: pass
// validator name: regex
if (form.elements['pass']) {
field = form.elements['pass'];
var error = "您輸入的密碼只能是字母和陣列,且長度必須在4到25之間";
if (field.value != null && !field.value.match("(//w{4,25})"))
{
addError(field, error);
errors = true;
}
}
// field name: age
// validator name: int
if (form.elements['age']) {
field = form.elements['age'];
var error = "年紀必須在1到150之間";
if (field.value != null) {
if (parseInt(field.value) <
1 ||
parseInt(field.value) >
150) {
addError(field, error);
errors = true;
}
}
}
// field name: birth
// validator name: date
if (form.elements['birth']) {
field = form.elements['birth'];
var error = "年紀必須在00-1-1到50-2-21之間";
}
return !errors;
}
</script>
</body>
</html>
從上面Struts2自動