struts2.0(20-30)

 

invalid.fieldvalue.age=age conversion error

invalid.fieldvalue.birthday=/u751f/u65e5/u65e5/u671f/u8f93/u5165/u9519/u8bef

invalid.fieldvalue.graduation=/u6bd5/u4e1a/u65f6/u95f4/u65e5/u671f/u8f93/u5165/u9519/u8bef

 

填寫信息自動保存:第一

<td>

                     <input type="text" name="username"

                         value="${requestScope.username}">

                  </td>

第二使用from屬性標籤庫

 

       <s:form action="register" theme="simple">

 

           <table align="center" width="40%" border="1">

              <tr>

                  <td>

                     username

                  </td>

                  <td>

                     <s:textfield name="username" label="username" id="usernameId"></s:textfield>

                  </td>

              </tr>

       </s:form>

 

上面是增加Flelt級別的錯誤信息,下面是增加Action級別的錯誤信息

修改的如下:

 

 

校驗的實現:public class RegisterAction extends ActionSupport複寫驗證方法

 

 

 

@Override

    public void validate()

    {     

      

        //瀏覽器訪問的方式可以有null的出現,其他情況沒有Null出現

       if (null == username || username.length() < 6 || username.length() > 10)

       {

           this.addActionError("username invalid");

       }

       if (null == password || password.length() < 6 || password.length() > 10)

       {

           this.addActionError("password invalid");

       }

       else if (null == repassword || repassword.length() < 6

              || repassword.length() > 10)

       {

           this.addActionError("re-password invalid");

       }

       else if (!password.equals(repassword))

       {

           this.addActionError("two passwords not the same");

       }

//注意Age的改變用小於默認的小於0

       if (age <= 0 || age > 150)

       {

           this.addActionError("age should be between 1 and 150");

       }

//日期誰在前誰在後,可以通過DATEGETtIME方法的毫秒數,比較前後第二種方法如下

      

       if (null != birthday && null != graduation)

       {

           Calendar c1 = Calendar.getInstance();

           c1.setTime(birthday);

 

           Calendar c2 = Calendar.getInstance();

           c2.setTime(graduation);

 

           if (!c1.before(c2))

           {

              this.addActionError("birthday should be before graduation");

           }

       }

 

    }

 

頁面調用:addFieldError 是放在map裏邊的,而addActionError放在list裏邊

cssStyle:定義樣式,而cssClass引入CSS文件

 

<s:actionerror cssStyle="color:red" />

 

 解決兩種情況addFieldError addActionError都出現的方案:

 

增加Theme 選擇簡單方式:將不用XHTML格式顯示而用一般格式

 

<s:textfield name="age" label="age" theme = "simple"></s:textfield>

 

如果表單改爲simple,則表單裏邊的所有內容都變成一般格式出現

 

<s:form action="register" theme="simple">

 

一般採用以上兩種方式來處理頁面錯誤信息

 

1配置dispatchAction 配置method 指定實例執行方法

 

Struts.xml配置

 

 

<action name="register" class="com.test.action.RegisterAction" method="test">

           <result name="success">/success.jsp</result>

           <result name="input">/register2.jsp</result>

       </action>

<action name="abc" class="com.test.action.RegisterAction" method="abc">

           <result name="success">/success.jsp</result>

           <result name="input">/register2.jsp</result>

       </action>

 

 

Action

public class RegisterAction extends ActionSupport

 

public String test() throws Exception

    {

       return SUCCESS;

    }

 

指定驗證的做法在以上方法裏面:validate+Abc(執行方法名第一個字母大寫)

    public void validateAbc()

    {

       System.out.println("validateAbc() invoked");

    }

 

但還是在調用執行方法時先執行:validate方法,才執行test()方法。validate方法總是要執行的

 

解決辦法一,去掉validate方法

方法二、:增加一個validateExcute方法去執行execute方法(如果有Excute方法時使用)

 

校驗框架-字段校驗

 

用於校驗不復雜情況,如果校驗複雜就用velidate方法校驗

 

要驗證RegisterAction

 

要在其同一個目錄下:建立文件:Action+-validation.xml,實例在下載的war文件裏邊

 

RegisterAction-validation.xml

 

注意,dtd不是XML文檔,shame纔是xml文檔所以它不能被IE瀏覽器打開。用Firefox打開

<?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>

 

<!--

    <validator type="requiredstring">

       <param name="fieldName">username</param>

       <message>username should not be blank!</message>

    </validator>

   

    <validator type="stringlength">

       <param name="fieldName">username</param>

       <param name="minLength">6</param>

       <param name="maxLength">10</param>

       <message>username should be between ${minLength} and ${maxLength}</message>

    </validator>

 -->  

// short-circuit是短路,只要前面驗證不通過,後面就不進行驗證了

    <field name="username">

       <field-validator type="requiredstring"short-circuit ="true">          <param name="trim">true</param>

           <message>username should not be blank!</message>

       </field-validator>

      

       <field-validator type="stringlength">

           <param name="minLength">6</param>

           <param name="maxLength">10</param>

           <message>username should be between ${minLength} and ${maxLength}</message>

       </field-validator>

    </field>

 

    <field name="password">

       <field-validator type="requiredstring">

           <message>password should not be blank!</message>

       </field-validator>

      

       <field-validator type="stringlength">

           <param name="minLength">6</param>

           <param name="maxLength">10</param>

           <message>password should be between ${minLength} and ${maxLength}</message>

       </field-validator>

    </field>

   

    <field name="repassword">

       <field-validator type="requiredstring">

           <message>repassword should not be blank!</message>

       </field-validator>

      

       <field-validator type="stringlength">

           <param name="minLength">6</param>

           <param name="maxLength">10</param>

           <message>repassword should be between ${minLength} and ${maxLength}</message>

       </field-validator>

    </field>

   

    <field name="age">

       <field-validator type="required">

           <message>age should not be blank!</message>

       </field-validator>

   

       <field-validator type="int">

           <param name="min">1</param>

           <param name="max">150</param>

           <message>age should be between ${min} and ${max}</message>

       </field-validator>

    </field>

    //下面用requiredstring,表示字符串必須要出現,而required表示不是字符串出現

    <field name="birthday">

       <field-validator type="required">

           <message>birthday should not be blank!</message>

       </field-validator>

      

       <field-validator type="date">

           <param name="min">2001-01-01</param>

           <param name="max">2003-12-31</param>

           <message>birthday should be between ${min} and ${max}</message>

       </field-validator>

    </field>

   

    <field name="graduation">

       <field-validator type="required">

           <message>graduation should not be blank!</message>

       </field-validator>

      

       <field-validator type="date">

           <param name="min">2005-01-01</param>

           <param name="max">2007-12-31</param>

           <message>graduation should be between ${min} and ${max}</message>

       </field-validator>

    </field>

   

 

   

</validators>

 

驗證的依據是,在源文件的xwork下的default.xml的要求

 

頁面調用:

<s:fielderror cssStyle="color:red" />

 

注意避免校驗混交,要麼就在配置文件裏面校驗,要麼就在代碼裏面(validator方法)校驗

 

 

 

校驗框架-非字段校驗

注意可以通過HTTP底層協議來跳過校驗

 

客戶端驗證

1、去掉

theme="simple"

2validate = "true" //它自己會去調用相應的RegisterAction-validation.xml

進行校驗

 

如:<s:form action="register" validate = "true">

 

調用就是:標籤的調用。最好不要使用:由於只要驗證失敗,再次驗證通過,驗證信息依然保留在頁面上。使用一下驗證:

 

<%@ page language="java" import="java.util.*" pageEncoding="GB18030"%>

<%@ taglib prefix="s" uri="/struts-tags"%>

 

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>

    <head>

       <title>My JSP 'register2.jsp' starting page</title> 

    <script type="text/javascript">

    function validate()

    {

       var usernameValue = document.getElementById("usernameId").value;//通過加ID獲取不然通過name獲取到得是一個數組

       var passwordValue = document.getElementById("password").value;

       var repasswordValue = document.getElementById("repassword").value;

      

       if(usernameValue.length == 0)

       {

           alert("username should not be blank!");

           return false;

       }

       else if(usernameValue.length < 6 || usernameValue.length > 10)

       {

           alert("length of username should be between 6 and 10!");

           return false;

       }

      

       if(passwordValue.length == 0)

       {

           alert("password should not be blank!");

           return false;

       }

       else if(passwordValue.length < 6 || passwordValue.length > 10)

       {

           alert("length of password should be between 6 and 10!");

           return false;

       }

      

       if(repasswordValue.length == 0)

       {

           alert("repassword should not be blank!");

           return false;

       }

       else if(repasswordValue.length < 6 || repasswordValue.length > 10)

       {

           alert("length of repassword should be between 6 and 10!");

           return false;

       }

      

       if(passwordValue != repasswordValue)

       {

           alert("password and repassword should be same!");

           return false;

       }

       return true;

    }

    </script>

    </head>

    <body>

       <table align="center" width="40%">

           <tr>

              <td>

 

                  <s:fielderror cssStyle="color:red" />

 

              </td>

           </tr>

       </table>

       <s:form action="register" theme="simple" onsubmit = "return validate();">

           <table align="center" width="40%" border="1">

              <tr>

                  <td>

                     username

                  </td>

                  <td>

                     <s:textfield name="username" label="username" id="usernameId"></s:textfield>

                  </td>

              </tr>

              <tr>

                  <td>

                     password

                  </td>

                  <td>

                     <s:password name="password" label="password" id="passwordId"></s:password>

                  </td>

              </tr>

              <tr>

                  <td>

                     re-password

                  </td>

                  <td>

                     <s:password name="repassword" label="repassword" id="repasswordId"></s:password>

                  </td>

              </tr>

           </table>

       </s:form>

    </body>

</html>

 

 

根據方法提供校驗方式的解決:

配置文件就要寫成,action-方法名-validation.xml

如:registerAction-test-validation.xml

但如果也提供了registerAction-validation.xml的話,它會先調用:registerAction-validation.xml才調用:registerAction-test-validation.xml

 

最好的辦法就是提供局部的校驗就行

 

注意父類和子類的校驗,方法名相同,就會先校驗父類,在校驗子類就不方便了

 

非字段校驗:我用誰去校驗,我去校驗誰而字段校驗呢是:我校驗誰,我用誰來校驗

<validator type="requiredstring">

       <param name="fieldName">username</param>

       <message>username should not be blank!</message>

    </validator>

   

    <validator type="stringlength">

       <param name="fieldName">username</param>

       <param name="minLength">6</param>

       <param name="maxLength">10</param>

       <message>username should be between ${minLength} and ${maxLength}</message>

    </validator>

 

校驗的順序,先執行校驗文件xml的,纔去校驗validate方法:

 

真正存放field級別錯誤信息的對象是LinkedHashMap

 

2. LinkedHashMapkeyString類型的,valueArrayList類型的

 

3. 對於Action級別的錯誤信息,實際上是放置在ArrayList中的

 

//只增加到它的一個副本,只能讀,不用寫也不能修改進去了。下面的操作在讀取的時候是取不到的

       this.getFieldErrors().put("username","bbbbbbbbbbbbb");

 

攔截器:Interceptor

 

對象接口

package com.interceptor;

 

public interface TargetInterface

{

    public void doSomething();

}

 

目標對象:

package com.interceptor;

 

public class Target implements TargetInterface

{

    public void doSomething()

    {

       System.out.println("do something");

    }

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章