Struts2:對Action中方法進行輸入校驗
原始碼下載地址: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>
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時校驗通過,否則不通過,該校驗器不可用在欄位校驗器風格的配置中