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>

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

發佈了40 篇原創文章 · 獲贊 7 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章