1. 程式人生 > >Struts2:對Action中方法進行輸入校驗

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時校驗通過,否則不通過,該校驗器不可用在欄位校驗器風格的配置中