Struts2第十篇【數據校驗、代碼方式、XML配置方式、錯誤信息返回樣式】

回顧之前的數據校驗

  • 使用一個FormBean對象來封裝着web端來過來的數據

這裏寫圖片描述

  • 維護一個Map集合保存着錯誤信息…對各個字段進行邏輯判斷
//表單提交過來的數據全都是String類型的,birthday也不例外!
    private String username;
    private String password;
    private String password2;
    private String email;
    private String birthday;

    //記錄錯誤的信息
    private HashMap<String, String> error = new HashMap<>();


    /*用於判斷表單提交過來的數據是否合法*/
    public boolean validate() {

        //用戶名不能爲空,而且要是3-8的字符 abcdABcd
        if (this.username == null || this.username.trim().equals("")) {

            error.put("username", "用戶名不能爲空,而且要是3-8的字符");
            return false;

        } else {
            if (!this.username.matches("[a-zA-Z]{3,8}")) {
                error.put("username", "用戶名不能爲空,而且要是3-8的字符");
                return false;
            }
        }

        //密碼不能爲空,而且要是3-8的數字
        if (this.password == null || this.password.trim().equals("")) {
            error.put("password", "密碼不能爲空,而且要是3-8的數字");
            return false;
        } else {
            if (!this.password.matches("\\d{3,8}")) {
                error.put("password", "密碼不能爲空,而且要是3-8的數字");
                return false;
            }
        }

        //兩次密碼要一致
        if (this.password2 != null && !this.password2.trim().equals("")) {
            if (!this.password2.equals(this.password)) {
                error.put("password2", "兩次密碼要一致");
                return false;
            }
        }

        //郵箱能夠爲空,若是爲空就必須合法
            if (this.email != null && !this.email.trim().equals("")) {
                if (!this.email.matches("\\w+@\\w+(\\.\\w+)+")) {

                    error.put("email", "郵箱不合法!");
                    return false;
                }
        }

        //日期能夠爲空,若是爲空就必須合法
        if (this.birthday != null && !this.birthday.trim().equals("")) {

            try {
                DateLocaleConverter dateLocaleConverter = new DateLocaleConverter();
                dateLocaleConverter.convert(this.birthday);
            } catch (Exception e) {

                error.put("birthday", "日期不合法!");
                return false;
            }
        }

        //若是上面都沒有執行,那麼就是合法的了,返回true
        return true;
    }

    //.....各類的setter和getter
  • 在Servlet上判斷數據是否合法
//驗證表單的數據是否合法,若是不合法就跳轉回去註冊的頁面
        if(formBean.validate()==false){

            //在跳轉以前,把formbean對象傳遞給註冊頁面
            request.setAttribute("formbean", formBean);
            request.getRequestDispatcher("/WEB-INF/register.jsp").forward(request, response);
            return;
        }
  • 最後在JSP頁面使用EL表達式進行回顯

這裏寫圖片描述


Struts2數據校驗

Struts2爲了簡化咱們的開發,也提供了數據校驗的功能…前面已經說過了,若是想要使用數據校驗的功能,在編寫Action的時候就必須繼承着ActionSupport類或者實現相對應的接口css

這裏寫圖片描述

Struts2數據校驗實現思路

如今,咱們的Action類已經繼承了ActionSupport類了,如今那怎麼使用數據校驗的功能呢??咱們想一下….java

若是咱們不寫FormBean對象,直接在Action進行校驗的話,咱們可能會這樣寫:web

private Map<String, String> map;

    public void validation() {


        //若是有錯誤了,那麼就將錯誤信息添加到map集合
        map.put();
    }

    public String login() {
        //判斷map是否有錯誤信息,若是有,就直接跳轉到相對應的頁面了,不執行login剩下的代碼了。
    }

上面的思路是可行的,可是不優雅…..在login()方法驗證map集合,就與數據校驗耦合了….因而乎,咱們想要的是在調用login()方法以前就驗證map集合是否存在…若是存在了錯誤的信息,就不調用login()方法了express


明顯地,咱們就須要使用攔截器…….Struts2內部的數據校驗也是使用攔截器來實現的apache

<interceptor name="validation" class="org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor"/>

Struts2爲咱們提供了4種方式來實現攔截markdown

  • 使用代碼攔截全部的方法
  • 使用代碼攔截部分的方法
  • 使用XML配置攔截全部的方法
  • 使用XML配置攔截部分的方法

使用代碼攔截全部的方法

Struts2提供了咱們作校驗的方法….實現validate()app

 @Override public void validate() { super.validate(); } 

validate()方法在內部已經維護了一個Map集合了jsp

public synchronized void addFieldError(String fieldName, String errorMessage) {
        Map errors = this.internalGetFieldErrors();
        Object thisFieldErrors = (List)errors.get(fieldName);
        if(thisFieldErrors == null) {
            thisFieldErrors = new ArrayList();
            errors.put(fieldName, thisFieldErrors);
        }

        ((List)thisFieldErrors).add(errorMessage);
    }

咱們若是捕獲到了錯誤信息,那麼直接使用底層爲咱們寫好的Map集合就行了!ide

@Override
    public void validate() {

        //判斷用戶名是否爲空
        if (user.getUsername() == null || "".equals(user.getUsername())) {
            super.addFieldError("username","用戶名是空的");
        }
        //判斷密碼是否爲空
        if (user.getPassword() == null || "".equals(user.getPassword())) {
            super.addFieldError("username","密碼是空的");
        }
    }

配置struts.xml文件post

<package name="xxx" extends="struts-default">

        <action name="user_*" class="zhongfucheng.action.UserAction" method="{1}">

            <!--若是校驗成功,那麼回到首頁-->
            <result name="success">/index.jsp</result>

            <!--若是失敗,從新回到login頁面,並顯示錯誤信息-->
            <result name="input">/login.jsp</result>

        </action>
    </package>

在JSP頁面中,能夠使用Struts自帶的標籤來顯示錯誤信息

<s:fielderror></s:fielderror>
  • 測試:

這裏寫圖片描述


使用代碼攔截部分方法

上面已經實現了數據校驗的功能了,可是呢。如今我有一個list()方法。使用list()方法講道理是不用進行數據校驗的…

//查看user信息
    public String list() {


        return SUCCESS;
    }

可是呢,當我執行list()方法的時候,仍是通過了數據校驗….

這裏寫圖片描述

所以,咱們要作的是:攔截特定的方法..很是簡單,只要重命名validate()方法就好了

  • 格式:validate + 要驗證的方法名

將validate()方法名改爲是validateLogin(),那麼Struts2就僅僅過濾指定的方法了。

效果

這裏寫圖片描述


使用XML配置攔截全部方法

前面咱們已經使用過了代碼驗證的方法,,,,感受仍是要寫不少代碼….不少代碼也是囉嗦的,要判斷非空啊,數值的驗證啊..等等的處理…這樣判斷、驗證每每都是通用的…因而Struts又幫咱們封裝了不少的校驗器

  • 路徑: xwork-core-2.3.4.1.jar/com.opensymphony.xwork2.validator.validators/default.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC "-//Apache Struts//XWork Validator Definition 1.0//EN" "http://struts.apache.org/dtds/xwork-validator-definition-1.0.dtd">

<!-- START SNIPPET: validators-default -->
<validators>
    <validator name="required" class="com.opensymphony.xwork2.validator.validators.RequiredFieldValidator"/>
    <validator name="requiredstring" class="com.opensymphony.xwork2.validator.validators.RequiredStringValidator"/>
    <validator name="int" class="com.opensymphony.xwork2.validator.validators.IntRangeFieldValidator"/>
    <validator name="long" class="com.opensymphony.xwork2.validator.validators.LongRangeFieldValidator"/>
    <validator name="short" class="com.opensymphony.xwork2.validator.validators.ShortRangeFieldValidator"/>
    <validator name="double" class="com.opensymphony.xwork2.validator.validators.DoubleRangeFieldValidator"/>
    <validator name="date" class="com.opensymphony.xwork2.validator.validators.DateRangeFieldValidator"/>
    <validator name="expression" class="com.opensymphony.xwork2.validator.validators.ExpressionValidator"/>
    <validator name="fieldexpression" class="com.opensymphony.xwork2.validator.validators.FieldExpressionValidator"/>
    <validator name="email" class="com.opensymphony.xwork2.validator.validators.EmailValidator"/>
    <validator name="url" class="com.opensymphony.xwork2.validator.validators.URLValidator"/>
    <validator name="visitor" class="com.opensymphony.xwork2.validator.validators.VisitorFieldValidator"/>
    <validator name="conversion" class="com.opensymphony.xwork2.validator.validators.ConversionErrorFieldValidator"/>
    <validator name="stringlength" class="com.opensymphony.xwork2.validator.validators.StringLengthFieldValidator"/>
    <validator name="regex" class="com.opensymphony.xwork2.validator.validators.RegexFieldValidator"/>
    <validator name="conditionalvisitor" class="com.opensymphony.xwork2.validator.validators.ConditionalVisitorFieldValidator"/>
</validators>
<!-- END SNIPPET: validators-default -->

以上的校驗器咱們能夠經過XML文件來配置,編寫XML文件的語法:

  • 名稱語法: ActionClassName-validation.xml
  • xml須要與當期要驗證的action在同一個目錄
  • 例子:UserAction-validation.xml

那麼XML該怎麼寫呢????Struts2也爲咱們提供了DTD文件

這裏寫圖片描述

<?xml version="1.0" encoding="UTF-8"?>

<!-- XWork Validators DTD. Used the following DOCTYPE. <!DOCTYPE validators PUBLIC "-//Apache Struts//XWork Validator 1.0.3//EN" "http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd"> -->


<!ELEMENT validators (field|validator)+>

<!ELEMENT field (field-validator+)>
<!ATTLIST field name CDATA #REQUIRED >

<!ELEMENT field-validator (param*, message)>
<!ATTLIST field-validator type CDATA #REQUIRED short-circuit (true|false) "false" >

<!ELEMENT validator (param*, message)>
<!ATTLIST validator type CDATA #REQUIRED short-circuit (true|false) "false" >

<!ELEMENT param (#PCDATA)>
<!ATTLIST param name CDATA #REQUIRED >

<!ELEMENT message (#PCDATA|param)*>
<!ATTLIST message key CDATA #IMPLIED >
  • XML文件代碼:
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE validators PUBLIC "-//Apache Struts//XWork Validator 1.0.3//EN" "http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd">

<validators>

    <!--指定Bean對象的username屬性-->
    <field name="user.username">
        <!--指定類型不能是空的-->
        <field-validator type="requiredstring">
            <message>用戶名不能是空的</message>
        </field-validator>
    </field>
    <!--指定Bean對象的屬性-->
    <field name="user.password">
        <!--指定類型不能是空的-->
        <field-validator type="requiredstring">
            <message>密碼不能是空的</message>
        </field-validator>

        <!--設置密碼的長度6到8位-->
        <field-validator type="stringlength">
            <param name="minLength">6</param>
            <param name="maxLength">8</param>
            <message>密碼只能是6-8位</message>
        </field-validator>
    </field>
</validators>

測試

用戶名和密碼都不能爲空

密碼只能是6-8位

這裏寫圖片描述


使用XML配置攔截特定的方法

和代碼的方式同樣,咱們寫上了XML文件,它也是默認攔截全部的方法。那麼咱們想要它只攔截特定的方法,怎麼辦呢???

修改XML文件的名稱:

  • 語法:ActionClassName-ActionName-validation.xml
  • 例子:UserAction-user_login-validation.xml

返回錯誤信息的樣式

css修改Struts標籤樣式

咱們發現,返回錯誤信息的樣式是這樣的:

這裏寫圖片描述

這明顯不符合咱們的審美的……因而乎咱們是能夠修改它的樣式的…咱們查看源文件的時候,能夠發現Struts爲它自動加了ul li

這裏寫圖片描述

咱們能夠在css文件中把它們去除就好了

<style type="text/css"> ul{ display: inline; } ul li { display: inline; color: red;; } </style>

這裏寫圖片描述


修改標籤訂義的模板

Struts2標籤的樣式是由文件來指定的…具體路徑以下:

這裏寫圖片描述

咱們發現ul li是它指定加上去的,咱們把它修改,而後覆蓋掉它,那麼Struts2在讀取的時候就使用咱們的文件

這裏寫圖片描述


在src下建立template.simple包..文件是fielderror.ftl…項目在執行的時候就會把Struts2自帶的給覆蓋了!

指定返回錯誤

使用<s:fielderror></s:fielderror>是默認返回所有錯誤的,咱們一般來講,都是把錯誤放在輸入框的後面的…Struts提供了指定返回錯誤..只要指定fileName就好了

<form action="${pageContext.request.contextPath}/user_login" method="post">

    用戶名:<input type="text" name="user.username"><s:fielderror fieldName="user.username"/><br>
    密碼:<input type="password" name="user.password"><s:fielderror fieldName="user.password"/><br>
    <input type="submit" value="登錄"><br>
</form>

這裏寫圖片描述


配置客戶端校驗

Struts2也支持客戶端的校驗,在使用Struts2的form標籤的使用,在validate屬性上設置爲true,那麼Struts2會自動加載JavaScript的類庫來實現客戶端的數據校驗了!


總結

Struts2也提供了客戶端的數據校驗功能….

咱們如今已經學會了使用手寫代碼的方式和XML配置的方式去校驗數據了。。

那麼哪一種方式更好呢???咱們來總結一下

手寫代碼方式:

  • 更加靈活,要校驗的邏輯全都是本身把握
  • 可是比較繁瑣,有不少的重複邏輯代碼

XML配置方式

  • 不用本身手寫邏輯代碼,調用Struts提供給咱們的攔截器便可
  • 可是若是攔截的方法比較多的話,會出現多個XML配置文件

最後補充:Struts2也支持經過註解的方式實現數據校驗,可是這會形成Action類看起來十分冗餘,通常不多使用

相關文章
相關標籤/搜索