源碼下載地址:http://download.csdn.net/detail/zhoujing_0424/9239429
在struts2中,我們可以實現對action的所有方法進行校驗或對action的指定方法進行校驗。對於輸入校驗,struts2提供了兩種實現方法:
1.採用手工編寫代碼實現
2.基於XML配置方式實現
1.採用手工編寫代碼實現
(1)首先提供輸入界面inputValidate.jsp和結果顯示界面message.jsp。
inputValidate.jsp:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
</head>
<body>
<s:fielderror></s:fielderror><!-- 輸出錯誤信息內容 -->
<form action="${pageContext.request.contextPath}/control/person/manage_update.action" method="post">
用戶名:<input type="text" name="username" >不能爲空<br><br>
手機號:<input type="text" name="mobile" >不能爲空,並且要符合手機號格式<br><br>
<input type="submit" value="提交"><br><br>
</form>
</body>
</html>
message.jsp:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
</head>
<body>
<%String username1=new String(request.getParameter("username").getBytes("ISO-8859-1"),"UTF-8"); %>
${message}<br>
用戶名爲:<%=username1 %><br>
手機號爲:${mobile}<br>
</body>
</html>
(2)創建PersonAction繼承ActionSupport,通過重寫validate()方法實現輸入校驗,validate()方法會校驗action中所有與execute方法簽名相同的方法。當某個數據校驗失敗時,我們可以調用addFieldError()方法往系統的fieldErrors添加校驗失敗信息。如果系統的fieldErrors包含失敗信息,sturts2會將請求轉發到名爲input的result。在input視圖中,可以通過 <s:fielderror/>
標籤顯示失敗信息。
PersonAction.java:
package cn.zj.action;
import java.util.regex.Pattern;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class PersonAction extends ActionSupport{
private String username;
private String mobile;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getMobile() {
return mobile;
}
public void setMobile(String mobile) {
this.mobile = mobile;
}
public String update(){
ActionContext.getContext().put("message", "更新成功");
return "message";
}
public String save(){
ActionContext.getContext().put("message", "保存成功");
return "message";
}
@Override
public void validate() {//validate()會對action中的所有方法校驗
if(this.username==null || "".equals(this.username.trim())){
this.addFieldError("username", "用戶名不能爲空");
}
if(this.mobile==null || "".equals(this.mobile.trim()))
{
this.addFieldError("mobile", "手機號不能爲空");
}else{
//使用正則表達式判斷手機號,第一個數字爲1,第二個數字爲3或5或8,後面跟9位數字
if(!Pattern.compile("^1[358]\\d{8}$").matcher(mobile).matches()){
this.addFieldError("mobile", "手機號格式不正確");
}
}
}
}
(3)配置action。
struts_user.xml:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<package name="person" namespace="/control/person" extends="struts-default">
<action name="manage_*" class="cn.zj.action.PersonAction" method="{1}">
<result name="input">/inputValidate.jsp</result>
<result name="message">/WEB-INF/page/message.jsp</result>
</action>
</package>
</struts>
(4)測試。
a. 打開瀏覽器,輸入http://localhost:8080/Struts2/inputValidate.jsp,界面如下:
b. 輸入框中什麼都不輸入,點擊“提交”按鈕,顯示結果如下:
c. 輸入框中輸入錯誤的手機號,如下:
點擊“提交”按鈕,結果如下:
d. 輸入正確的用戶名和手機號,結果如下:
(5)對action中指定方法進行校驗。
上述方法會對action中的所有方法都進行輸入校驗,若只想對action中的指定方法進行校驗,只需將PersonAction中的validate()方法名稱改成validateXxx()即可,其中Xxx爲對應的方法名稱,Xxx的第一個字母要大寫。如本例中,若只想對PersonAction中的save()方法進行校驗,則可以將validate()方法名稱改爲validateSave()即可。
(6)總結:輸入校驗的流程。
a. 類型轉換器對請求參數執行類型轉換,並把轉換後的值賦給action中的屬性。
b. 如果在執行類型轉換的過程中出現異常,系統會將異常信息保存到ActionContext,conversionError攔截器將異常信息封裝到fieldErrors裏。不管類型轉換是否出現異常,都會進入第c步。
c. 系統通過反射技術先調用action中的validateXxx()方法,Xxx爲方法名。
d. 再調用action中的validate()方法。
e. 經過上面4步,如果系統中的fieldErrors存在錯誤信息(即存放錯誤信息的集合的size大於0),系統自動將請求轉發至名稱爲input的視圖。如果系統中的fieldErrors沒有任何信息,系統將執行action中的處理方法。
2.基於XML配置方式實現
(1)使用基於XML配置方式實現輸入校驗時,Action也需要繼承ActionSupport,並提供校驗文件,校驗文件和action類放在同一個包下。校驗文件的名稱格式爲:ActionClassName-validate.xml,其中ActionClassName位action的簡單類名,-validate.xml爲固定寫法。和上面方式1(即手工編寫代碼實現輸入校驗,以下簡稱方式1)對應,我們在PersonAction類所在包下創建PersonAction-validate.xml文件,文件內容如下:
ActionClassName-validate.xml:
<?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"><!-- action中需要校驗的屬性 -->
<field-validator type="requiredstring"><!-- 指定校驗器 -->
<param name="trim">true</param> <!-- 爲校驗器中的屬性trim注值,trim默認值也爲true,可以省略不寫,作用爲去掉字符串前後的空格 -->
<message>XML用戶名不能爲空</message><!-- 校驗失敗後的提示信息 -->
</field-validator>
</field>
<field name="mobile"><!-- action中需要校驗的屬性 -->
<field-validator type="requiredstring"><!-- 指定校驗器 -->
<message>XML手機號不能爲空</message><!-- 校驗失敗後的提示信息 -->
</field-validator>
<field-validator type="regex"><!-- 指定校驗器 -->
<param name="expression"><![CDATA[^1[358]\d{9}$]]></param><!-- 爲expression屬性注入值 -->
<message>XML手機號格式不正確</message><!-- 校驗失敗後的提示信息 -->
</field-validator>
</field>
</validators>
其中,<field>
指定action中要校驗的屬性;<field-validator>
指定校驗器,上面指定的校驗器requiredstring和regex都由strut2系統提供,系統提供了能滿足大部分驗證需求的校驗器;<message>
爲校驗失敗後的提示信息。
(2)PersonAction與方式1的相同,只需將validate()方法刪除即可。
代碼省略。
(3)測試。
測試方法與方式1相同,省略。
(4)對action中指定方法進行校驗。
當校驗文件取名爲ActionClassName-validate.xml時,會對action中的所有處理方法進行輸入驗證。如果只需要對action中的某個方法實施校驗時,只需將文件名取爲:ActionClassName-ActionName-validate.xml,其中ActionName爲struts.xml中的action名稱。例如方式1中對action中的save方法進行校驗時,則文件名爲:PersonAction-manage_save-validation.xml。
(5)附:struts2提供的校驗器列表。
- required:必填校驗器,要求field的值不能爲null)
- requiredstring:必填字符串校驗器,要求field的值不能爲null,並且長度大於0,默認情況下會對字符串去前後空格
- stringlength:字符串長度校驗器,要求field的值必須在指定的範圍內,否則校驗失敗,minLength參數指定最小長度,maxLength參數指定最大長度,trim參數指定校驗field之前是否去除字符串前後的空格
- regex:正則表達式校驗器,檢查被校驗的field是否匹配一個正則表達式,expression參數指定正則表達式,caseSensitive參數指定進行正則表達式匹配時,是否區分大小寫,默認值爲true
- int:整數校驗器,要求field的整數值必須在指定範圍內,min指定最小值,max指定最大值
- double:雙精度浮點數校驗器,要求field的雙精度浮點數必須在指定範圍內,min指定最小值,max指定最大值
- fieldexpression:字段OGNL表達式校驗器,要求field滿足一個ognl表達式,expression參數指定ognl表達式,該邏輯表達式基於ValueStack進行求值,返回true時校驗通過,否則不通過
- email:郵件地址校驗器,要求如果field的值非空,則必須是合法的郵件地址
- url:網址校驗器,要求如果field的值非空,則必須是合法的url地址
- date:日期校驗器,要求field的日期值必須在指定範圍內,min指定最小值,max指定最大值
- conversion:轉換校驗器,指定在類型轉換失敗時,提示的錯誤信息
- visitor:用於校驗action中的複合屬性,它指定一個校驗文件用於校驗複合屬性中的屬性
- expression:OGNL表達式校驗器,expression參數指定ognl表達式,該邏輯表達式基於ValueStack進行求值,返回true時校驗通過,否則不通過,該校驗器不可用在字段校驗器風格的配置中