struts2驗證框架後臺驗證用戶註冊

在項目根目錄,也就是struts.xml相同的位置添加一個validators.xml,用來添加自定義規則.我只添加了一條自定義的規則,用來驗證密碼提示問題是否存在與相關數據庫中,避免惡意提交(雖然我覺得也可能沒有必要,但爲了學一下怎麼自定義驗證規則,我就多此一舉了):

 

自定義規則的配置文件:validators.xml

 

Xml代碼  收藏代碼
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <!DOCTYPE validators PUBLIC  
  3.         "-//OpenSymphony Group//XWork Validator Config 1.0//EN"  
  4.         "http://www.opensymphony.com/xwork/xwork-validator-config-1.0.dtd">  
  5.           
  6. <validators>        
  7.     <validator name="valueintable" class="com.validators.ValueInSpecificTable"/>  
  8. </validators>  

 

相應的類:ValueInSpecificTable

 

Java代碼  收藏代碼
  1. package com.validators;  
  2.   
  3. import org.hibernate.Query;  
  4. import org.hibernate.Session;  
  5. import org.hibernate.SessionFactory;  
  6. import org.hibernate.Transaction;  
  7. import org.hibernate.cfg.Configuration;  
  8.   
  9. import com.opensymphony.xwork2.validator.ValidationException;  
  10. import com.opensymphony.xwork2.validator.validators.FieldValidatorSupport;  
  11.   
  12. public class ValueInSpecificTable extends FieldValidatorSupport{  
  13.       
  14.     private String table;  
  15.       
  16.     public String getTable() {  
  17.         return table;  
  18.     }  
  19.   
  20.     public void setTable(String table) {  
  21.         this.table = table;  
  22.     }  
  23.   
  24.     public void validate(Object object) throws ValidationException {      
  25.         String fieldName = getFieldName();  
  26.         String value = (String)this.getFieldValue(fieldName, object);  
  27.           
  28.         SessionFactory factory = new Configuration().configure().buildSessionFactory();  
  29.         Session session = factory.openSession();  
  30.         Transaction transaction = session.beginTransaction();  
  31.         Query query = session.createQuery("from " + table + " where problemContent = '" + value + "'");  
  32.         transaction.commit();  
  33.           
  34.         if(query.list().isEmpty())  
  35.         {  
  36.             System.out.println("WARN: " + value + "is not in table: " + table);  
  37.             addFieldError(fieldName, object);  
  38.         }  
  39.           
  40.         session.close();  
  41.     }  
  42. }  

 

Action的驗證配置文件(和Action放在相同目錄下):UserRegisterSaveAction-vaidation.xml

 

Xml代碼  收藏代碼
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <!DOCTYPE validators PUBLIC   
  3.     "-//OpenSymphonyGroup//XWorkValidator1.0.2//EN"   
  4.     "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">  
  5.   
  6.     <validators>    
  7.         <field name="register.user_id">   
  8.             <field-validator type="requiredstring">    
  9.                 <param name="trim">true</param>    
  10.                 <message>用戶名不能爲空</message>    
  11.             </field-validator>  
  12.               
  13.             <field-validator type="stringlength">  
  14.                 <param name="minLength">4</param>    
  15.                 <param name="maxLength">16</param>  
  16.                 <message>用戶名長度應在4到16之間</message>  
  17.             </field-validator>  
  18.         </field>  
  19.           
  20.         <field name="register.password">     
  21.             <field-validator type="requiredstring">    
  22.                 <param name="trim">true</param>    
  23.                 <message>密碼不能爲空</message>    
  24.             </field-validator>    
  25.       
  26.             <field-validator type="stringlength">    
  27.                 <param name="minLength">6</param>    
  28.                 <param name="maxLength">18</param>    
  29.                 <message>密碼長度應在6到18個字符之間</message>    
  30.             </field-validator>     
  31.         </field>        
  32.           
  33.         <field name="register.pwd_repeat">     
  34.             <field-validator type="fieldexpression">  
  35.                 <param name="fieldName">register.password</param>  
  36.                 <param name="fieldName">register.pwd_repeat</param>  
  37.                 <param name="expression"><![CDATA[register.password == register.pwd_repeat]]></param>  
  38.                 <message>密碼必須和確認密碼相等</message>  
  39.             </field-validator>   
  40.         </field>   
  41.           
  42.         <field name="register.problem_content">     
  43.             <field-validator type="valueintable">     
  44.                 <param name="table">PromptProblem</param>  
  45.                 <message>請輸入信息</message>     
  46.             </field-validator>  
  47.         </field>        
  48.           
  49.         <field name="register.answer">     
  50.             <field-validator type="requiredstring">    
  51.                 <param name="trim">true</param>    
  52.                 <message>密碼提示答案不能爲空</message>    
  53.             </field-validator>  
  54.               
  55.             <field-validator type="stringlength">  
  56.                 <param name="minLength">2</param>    
  57.                 <param name="maxLength">10</param>  
  58.                 <message>密碼提示答案長度應在2到10之間</message>  
  59.             </field-validator>     
  60.         </field>        
  61.           
  62.         <field name="register.nickname">     
  63.             <field-validator type="requiredstring">    
  64.                 <param name="trim">true</param>    
  65.                 <message>暱稱不能爲空</message>    
  66.             </field-validator>  
  67.               
  68.             <field-validator type="stringlength">  
  69.                 <param name="minLength">2</param>    
  70.                 <param name="maxLength">10</param>  
  71.                 <message>暱稱長度應在2到10之間</message>  
  72.             </field-validator>     
  73.         </field>        
  74.           
  75.         <field name="register.phone">     
  76.             <field-validator type="regex">     
  77.                 <param name="fieldName">register.phone</param>  
  78.                 <param name="trim">true</param>  
  79.                 <param name="expression"><![CDATA[(((13[0-9]{1})|159|186|188|189|(15[0-9]{1}))+\d{8})]]></param>  
  80.                 <message>請輸入正確的手機號碼</message>    
  81.             </field-validator>  
  82.         </field>    
  83.           
  84.         <field name="register.email">     
  85.             <field-validator type="email">     
  86.                 <message>請輸入正確的郵箱地址</message>                          
  87.             </field-validator>     
  88.         </field>            
  89.           
  90.     </validators>    














  91. 1. Struts2中的輸入校驗

    2. 編碼方式校驗
      1) Action一定要繼承自ActionSupport
      2) 針對某個要進行校驗的請求處理方法編寫一個 public void validateXxx()方法,在方法內部進行表單數據校驗.
      3) 也可針對所有的請求處理方法編寫public void validate()方法。
      4) 在校驗方法中,可以通過addFieldError()方法來添加字段校驗錯誤消息。
      5) 當校驗失敗時,Struts框架會自動跳轉到name爲input的Result頁面。在校驗失敗頁面中,可以使用<s:fielderror/>來顯示錯誤消息
      6) 簡單,靈活。但重用性不高。
      
    3. XML配置方式校驗。在編碼方式之前被執行。
      1) 針對要校驗的Action類,在同包下編寫一個名爲:Action類名-validation.xml校驗規則文件。
      2) 在校驗規則文件中添加校驗規則:具體的校驗器名,參數可參看Struts2的reference或Struts2的API。
         a) Field校驗:針對Action類中每個非自定義類型的Field進行校驗的規則。
        <field name="要校驗的Field名">
         <field-validator type="校驗規則器名" short-circuit="是否要短路徑校驗(默認是false)">
             <param name="校驗器要使用的參數名">值</param>
                <message>校驗失敗時的提示消息</message>
      </field-validator>
      <!-- 還可添加其它的校驗規則 -->
     </field>
     
         b) 非Field校驗:針對Action類的某些Field使用OGNL表達進行組合校驗。
        <validator type="fieldexpression">
      <param name="fieldName">pwd</param>
         <param name="fieldName">pwd2</param>
         <param name="expression"><![CDATA[pwd==pwd2]]></param><!-- OGNL表達式 -->
         <message>確認密碼和密碼輸入不一致</message>
     </validator>
     
         c) visitor校驗:主要是用來校驗Action類中的自定義類型Field。(針對使用模型驅動方式時)
           i) 在Action類的的校驗規則文件中針對自定義類型Field使用visitor校驗規則。
        <!-- 針對自定義Field使用visitor校驗 -->
     <field name="user">
      <field-validator type="required" short-circuit="true">
                <message>用戶的信息必填</message><!-- 消息前綴 -->
      </field-validator>
      <field-validator type="visitor"><!-- 指定爲visitor校驗規則 -->
       <param name="context">userContext</param><!-- 指定本visitor校驗的上下文名 -->
                <param name="appendPrefix">true</param><!-- 是否要添加校驗失敗消息的前綴 -->
                <message>用戶的</message><!-- 消息前綴 -->
      </field-validator>
     </field>
        ii) 針對visitor的Field編寫一個校驗規則文件.文件名爲: visitor字段類型名[-visitor校驗的上下文名]-validation.xml. 例如: 本例中的文件名爲User-userContext-validation.xml
                      注意: 此文件要存放到visitor字段類型所在的包下.
        iii) 在visitor的Field校驗規則文件中針對要校驗的Field添加校驗規則.
       3) 在校驗失敗頁面(名爲input的result頁面)中,可以使用<s:fielderror/>來顯示錯誤消息。
       4) 默認情況下,XML的校驗規則對Action中所有的請求處理方法生效.此時應該只針對每個要校驗的請求處理方法指定校驗。有兩種方式:
          i) 只爲Action中的指定方法指定校驗規則文件,配置文件命名爲:Action類型名-別名-validation.xml,
                          別名是要校驗的方法對應的Action標籤的name屬性值。
                          如:UserAction在struts2.xml的配置爲:
        <package name="my" extends="struts-default" namespace="/">
      <action name="user_*" class="com.javacrazyer.web.action.UserAction" method="{1}">
       <result name="success">/info.jsp</result>
       <result name="input">/user_{1}.jsp</result>
      </action>
        </package>              
                    ● UserAction中有registe方法和login方法,要對registe方法進行校驗,則它的校驗規則文件名爲:UserAction-user_registe-validation.xml。
                     ● 如果使用visitor校驗器,必需指定visitor校驗的上下文名。
          ii) 在校驗攔截器中指定要驗證的方法。不太實用。
       <action name="user_*" class="com.javacrazyer.web.action.UserAction" method="{1}">
        <result name="success">/info.jsp</result>
        <result name="input">/user_{1}.jsp</result>
         <interceptor-ref name="defaultStack">
            <!-- 給校驗攔截器指定不進行校驗的方法列表:用逗號隔開 -->
            <param name="validation.excludeMethods">*</param>
            <!-- 給校驗攔截器指定要進行校驗的方法列表:用逗號隔開 -->
            <param name="validation.includeMethods">regist</param>
          </interceptor-ref>
       </action>
       5) 同時使用客戶端校驗和服務器端校驗
          i) 設置<s:form>標籤的validate屬性:
             false:默認值。校驗框架只執行服務器端校驗。
             true:先執行客戶端校驗,然後再執行服務器端校驗。
             form標籤會根據你在服務器端配置的驗證規則生成對應的JavaScript驗證代碼。
                          目前支持的內置校驗器:required、requiredstring、stringlength、regex validator、email、url、int、double
          ii) 不太好用,不建議使用。建議使用jQuery進行頁面表單校驗。
       6) 自定義校驗器:
          i) 繼承自FieldValidatorSupport抽象類。重寫validate(Object obj)方法
          ii) 註冊校驗器類. 在應用程序的classpath下新建一校驗器註冊文件。名爲validators.xml,內容如下:
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE validators PUBLIC
            "-//OpenSymphony Group//XWork Validator Config 1.0//EN"
            "
    http://www.opensymphony.com/xwork/xwork-validator-config-1.0.dtd">
    <validators>
      <validator name="校驗器名" class="校驗器類的全限定名"/> 
    </validators>

     

    4. Annotation方式校驗: Struts2提供了註解的方式校驗
      1) @Validation 指明這個類或者接口將使用基於註解的校驗。Struts2.1中已被標識爲過時。
      2) @Validations() 在同一個方法上要使用多個註解校驗時。
      3) @SkipValidation 指定某個方法不需要校驗。否則所有方法都會使用校驗。也可以在檢驗攔截器中使用validateAnnotatedMethodOnly
      4) 13個內置校驗器的註解版本:(注:這些註解都只能用在方法級別上) 具體參數參見Struts2的API或Reference。
    @RequiredFieldValidator
    @RequiredStringValidator
    @StringLengthFieldValidator
    @IntRangeFieldValidator
    @DoubleRangeFieldValidator
    @DateRangeFieldValidator
    @ExpressionValidator
    @FieldExpressionValidator
    @RegexFieldValidator
    @EmailValidator
    @UrlValidator
    @VisitorFieldValidator
    @ConversionErrorFieldValidator

     


    acc_registe.jsp

    1. <span style="font-size: medium;"><%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>  
    2. <%@ taglib uri="/struts-tags" prefix="s" %>  
    3. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  
    4. <html>  
    5.   <head>  
    6.     <title>Struts2中基於XML配置式的校驗器使用示例</title>  
    7.   </head>  
    8.   <body>  
    9. <h3>XML配置式校驗器---註冊頁面</h3><hr/>  
    10.   
    11. <div style="color:red"><s:fielderror/></div>  
    12. <form action="acc_registe.action" method="post">  
    13.     <table>  
    14.         <tr>  
    15.             <td>ID</td>  
    16.             <td><input type="text" name="id" value="${param.id}"/></td>  
    17.         </tr>  
    18.         <tr>  
    19.             <td>登錄名</td>  
    20.             <td><input type="text" name="name" value="${param.name}"/></td>  
    21.         </tr>  
    22.         <tr>  
    23.             <td>密碼</td>  
    24.             <td><input type="password" name="pwd"/></td>  
    25.         </tr>  
    26.         <tr>  
    27.             <td>重複密碼</td>  
    28.             <td><input type="password" name="pwd2"/></td>  
    29.         </tr>  
    30.         <tr>  
    31.             <td>時間</td>  
    32.             <td><input type="text" name="registed_date" value="${param.registed_date}"/></td>  
    33.         </tr>  
    34.         <tr>  
    35.             <td>email</td>  
    36.             <td><input type="text" name="email" value="${param.email}"/></td>  
    37.         </tr>  
    38.         <tr>  
    39.             <td>考試成績</td>  
    40.             <td><input type="text" name="score" value="${param.score}"/></td>  
    41.         </tr>  
    42.         <tr>  
    43.             <td colspan="2"><input type="submit" value=" 提交 "/></td>  
    44.         </tr>  
    45.     </table>  
    46. </form>  
    47.   </body>  
    48. </html></span>  
     src/struts.xml

    1. <span style="font-size: medium;"><?xml version="1.0" encoding="UTF-8" ?>  
    2. <!DOCTYPE struts PUBLIC  
    3.     "-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN"  
    4.     "http://struts.apache.org/dtds/struts-2.1.7.dtd">  
    5.   
    6. <struts>  
    7.     <!-- 請求參數的編碼方式 -->  
    8.     <constant name="struts.i18n.encoding" value="UTF-8"/>  
    9.     <!-- 指定被struts2處理的請求後綴類型。多個用逗號隔開 -->  
    10.     <constant name="struts.action.extension" value="action,do,go,xkk"/>  
    11.     <!-- 當struts.xml改動後,是否重新加載。默認值爲false(生產環境下使用),開發階段最好打開  -->  
    12.     <constant name="struts.configuration.xml.reload" value="true"/>  
    13.     <!-- 是否使用struts的開發模式。開發模式會有更多的調試信息。默認值爲false(生產環境下使用),開發階段最好打開  -->  
    14.     <constant name="struts.devMode" value="false"/>  
    15.     <!-- 設置瀏覽器是否緩存靜態內容。默認值爲true(生產環境下使用),開發階段最好關閉  -->  
    16.     <constant name="struts.serve.static.browserCache" value="false" />  
    17.     <!-- 是否允許在OGNL表達式中調用靜態方法,默認值爲false -->  
    18.     <constant name="struts.ognl.allowStaticMethodAccess" value="true"/>  
    19.       
    20.     <!-- 指定由spring負責action對象的創建   
    21.     <constant name="struts.objectFactory" value="spring" />  
    22.     -->  
    23.     <!-- 是否開啓動態方法調用 -->  
    24.     <constant name="struts.enable.DynamicMethodInvocation" value="false"/>  
    25.       
    26.     <package name="my" extends="struts-default" namespace="/">  
    27.         <action name="acc_*" class="com.javacrazyer.web.action.AccountAction" method="{1}">  
    28.             <result name="success">/info.jsp</result>  
    29.             <result name="input">/acc_{1}.jsp</result>  
    30.         </action>  
    31.           
    32.     </package>  
    33.       
    34. </struts>  
    35. </span>  

    AccountAction.java

    1. <span style="font-size: medium;">package com.javacrazyer.web.action;  
    2.   
    3. import java.util.Date;  
    4.   
    5. import com.opensymphony.xwork2.ActionSupport;  
    6.   
    7.   
    8. public class AccountAction extends ActionSupport {  
    9.     private static final long serialVersionUID = -1418893621512812472L;  
    10.     private Integer id;  
    11.     private String name;  
    12.     private String pwd;  
    13.     private String pwd2;  
    14.     private Double score;  
    15.     private Date registed_date;  
    16.     private String email;  
    17.       
    18.     public String registe() throws Exception{  
    19.         System.out.println("registe-------------------");  
    20.         return SUCCESS;  
    21.     }  
    22.       
    23.     public String login()throws Exception{  
    24.         return SUCCESS;  
    25.     }  
    26.       
    27.     public Integer getId() {  
    28.         return id;  
    29.     }  
    30.     public void setId(Integer id) {  
    31.         this.id = id;  
    32.     }  
    33.     public String getName() {  
    34.         return name;  
    35.     }  
    36.     public void setName(String name) {  
    37.         this.name = name;  
    38.     }  
    39.     public Double getScore() {  
    40.         return score;  
    41.     }  
    42.     public void setScore(Double score) {  
    43.         this.score = score;  
    44.     }  
    45.     public Date getRegisted_date() {  
    46.         return registed_date;  
    47.     }  
    48.     public void setRegisted_date(Date registedDate) {  
    49.         registed_date = registedDate;  
    50.     }  
    51.     public String getEmail() {  
    52.         return email;  
    53.     }  
    54.     public void setEmail(String email) {  
    55.         this.email = email;  
    56.     }  
    57.   
    58.     public String getPwd() {  
    59.         return pwd;  
    60.     }  
    61.   
    62.     public void setPwd(String pwd) {  
    63.         this.pwd = pwd;  
    64.     }  
    65.   
    66.     public String getPwd2() {  
    67.         return pwd2;  
    68.     }  
    69.   
    70.     public void setPwd2(String pwd2) {  
    71.         this.pwd2 = pwd2;  
    72.     }  
    73. }</span>  

    AccountAction-validation.xml [與AccountAction同目錄]

    1. <span style="font-size: medium;"><?xml version="1.0" encoding="UTF-8"?>  
    2. <!DOCTYPE validators PUBLIC   
    3.     "-//OpenSymphony Group//XWork Validator 1.0.2//EN"   
    4.     "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">  
    5. <validators>  
    6.     <!-- 字段校驗 -->  
    7.     <field name="id">  
    8.         <field-validator type="required" short-circuit="true">  
    9.             <message>ID必填的</message>  
    10.         </field-validator>  
    11.         <field-validator type="int">  
    12.             <param name="min">20</param>  
    13.             <param name="max">50</param>  
    14.             <message>ID必須在 ${min} 到 ${max} 之間</message>  
    15.         </field-validator>  
    16.     </field>  
    17.     <field name="name">  
    18.         <field-validator type="requiredstring" short-circuit="true">  
    19.             <message>姓名是必填的</message>  
    20.         </field-validator>  
    21.         <field-validator type="regex">  
    22.             <param name="expression"><![CDATA[(^[a-zA-Z_]\w{3,9}$)]]></param>  
    23.             <message>姓名不合法</message>  
    24.         </field-validator>  
    25.     </field>  
    26.     <field name="pwd">  
    27.         <field-validator type="requiredstring" short-circuit="true">  
    28.             <message>密碼是必填的</message>  
    29.         </field-validator>  
    30.     </field>  
    31.       
    32.     <!-- 非字段校驗 -->  
    33.     <validator type="fieldexpression">  
    34.         <param name="fieldName">pwd</param>  
    35.         <param name="fieldName">pwd2</param>  
    36.         <param name="expression"><![CDATA[pwd==pwd2]]></param><!-- OGNL表達式 -->  
    37.         <message>確認密碼和密碼輸入不一致</message>  
    38.     </validator>  
    39.       
    40.     <field name="score">  
    41.         <field-validator type="double">  
    42.              <param name="minInclusive">0.0</param>  
    43.                <param name="maxInclusive">100.0</param>  
    44.                <message>成績必須在${minInclusive}和${maxInclusive}之間</message>  
    45.         </field-validator>  
    46.     </field>  
    47.     <field name="email" >  
    48.         <field-validator type="regex">  
    49.              <param name="expression"><![CDATA[(^[_A-Za-z0-9-]+(\.[_A-Za-z0-9-]+)*@([A-Za-z0-9-])+((\.com)|(\.cn)|(\.net)|(\.org)|(\.info)|(\.edu)|(\.mil)|(\.gov)|(\.biz)|(\.ws)|(\.us)|(\.tv)|(\.cc)|(\.aero)|(\.arpa)|(\.coop)|(\.int)|(\.jobs)|(\.museum)|(\.name)|(\.pro)|(\.travel)|(\.nato)|(\..{2,3})|(\..{2,3}\..{2,3}))$)]]></param>  
    50.              <message>郵箱不合法</message>  
    51.         </field-validator>  
    52.     </field>  
    53.       
    54.     <field name="registed_date">  
    55.         <field-validator type="date">  
    56.              <param name="min">1970-01-01</param>  
    57.              <param name="max">2019-01-01</param>  
    58.              <message>註冊日期不合法</message>  
    59.         </field-validator>  
    60.     </field>  
    61. </validators></span>  

    第二個示例:XML配置式校驗器---登錄和註冊頁面

    user_login.jsp

    1. <span style="font-size: medium;"><%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>  
    2. <%@ taglib uri="/struts-tags" prefix="s" %>  
    3. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  
    4. <html>  
    5.   <head>  
    6.     <title>Struts2中基於XML配置式的校驗器使用示例</title>  
    7.   </head>  
    8.   <body>  
    9. <h3>XML配置式校驗器---登錄頁面</h3><hr/>  
    10. <div style="color:red"><s:fielderror/></div>  
    11. <form action="user_login.action" method="post">  
    12.     <table>  
    13.         <tr>  
    14.             <td>登錄名</td>  
    15.             <td><input type="text" name="user.name" value="${param['user.name']}"/></td>  
    16.         </tr>  
    17.         <tr>  
    18.             <td>密碼</td>  
    19.             <td><input type="password" name="user.pwd"/></td>  
    20.         </tr>  
    21.         <tr><td colspan="2"><input type="submit" value=" 提交 "/></td></tr>  
    22.     </table>  
    23. </form>  
    24.   </body>  
    25. </html></span>  
    user_registe.jsp

    1. <span style="font-size: medium;"><%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>  
    2. <%@ taglib uri="/struts-tags" prefix="s" %>  
    3. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  
    4. <html>  
    5.   <head>  
    6.     <title>Struts2中基於XML配置式的校驗器使用示例</title>  
    7.   </head>  
    8.   <body>  
    9. <h3>XML配置式校驗器---註冊頁面</h3><hr/>  
    10.   
    11. <div style="color:red"><s:fielderror/></div>  
    12. <form action="user_registe.action" method="post">  
    13.     <table>  
    14.         <tr>  
    15.             <td>ID</td>  
    16.             <td><input type="text" name="user.id" value="${param['user.id']}"/></td>  
    17.         </tr>  
    18.         <tr>  
    19.             <td>登錄名</td>  
    20.             <td><input type="text" name="user.name" value="${param['user.name']}"/></td>  
    21.         </tr>  
    22.         <tr>  
    23.             <td>密碼</td>  
    24.             <td><input type="password" name="user.pwd"/></td>  
    25.         </tr>  
    26.         <tr>  
    27.             <td>重複密碼</td>  
    28.             <td><input type="password" name="user.pwd2"/></td>  
    29.         </tr>  
    30.         <tr>  
    31.             <td>時間</td>  
    32.             <td><input type="text" name="user.registed_date" value="${param['user.registed_date']}"/></td>  
    33.         </tr>  
    34.         <tr>  
    35.             <td>email</td>  
    36.             <td><input type="text" name="user.email" value="${param['user.email']}"/></td>  
    37.         </tr>  
    38.         <tr>  
    39.             <td>考試成績</td>  
    40.             <td><input type="text" name="user.score" value="${param['user.score']}"/></td>  
    41.         </tr>  
    42.         <tr>  
    43.             <td colspan="2"><input type="submit" value=" 提交 "/></td>  
    44.         </tr>  
    45.     </table>  
    46. </form>  
    47.   </body>  
    48. </html></span>  
    src/struts.xml
    1. <span style="font-size: medium;"><?xml version="1.0" encoding="UTF-8" ?>  
    2. <!DOCTYPE struts PUBLIC  
    3.     "-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN"  
    4.     "http://struts.apache.org/dtds/struts-2.1.7.dtd">  
    5.   
    6. <struts>  
    7.     <!-- 請求參數的編碼方式 -->  
    8.     <constant name="struts.i18n.encoding" value="UTF-8"/>  
    9.     <!-- 指定被struts2處理的請求後綴類型。多個用逗號隔開 -->  
    10.     <constant name="struts.action.extension" value="action,do,go,xkk"/>  
    11.     <!-- 當struts.xml改動後,是否重新加載。默認值爲false(生產環境下使用),開發階段最好打開  -->  
    12.     <constant name="struts.configuration.xml.reload" value="true"/>  
    13.     <!-- 是否使用struts的開發模式。開發模式會有更多的調試信息。默認值爲false(生產環境下使用),開發階段最好打開  -->  
    14.     <constant name="struts.devMode" value="false"/>  
    15.     <!-- 設置瀏覽器是否緩存靜態內容。默認值爲true(生產環境下使用),開發階段最好關閉  -->  
    16.     <constant name="struts.serve.static.browserCache" value="false" />  
    17.     <!-- 是否允許在OGNL表達式中調用靜態方法,默認值爲false -->  
    18.     <constant name="struts.ognl.allowStaticMethodAccess" value="true"/>  
    19.       
    20.     <!-- 指定由spring負責action對象的創建   
    21.     <constant name="struts.objectFactory" value="spring" />  
    22.     -->  
    23.     <!-- 是否開啓動態方法調用 -->  
    24.     <constant name="struts.enable.DynamicMethodInvocation" value="false"/>  
    25.       
    26.     <package name="my" extends="struts-default" namespace="/">  
    27.         <action name="user_*" class="com.javacrazyer.web.action.UserAction" method="{1}">  
    28.             <result name="success">/info.jsp</result>  
    29.             <result name="input">/user_{1}.jsp</result>  
    30.         </action>  
    31.     </package>  
    32.       
    33. </struts>  
    34. </span>  

    UserAction.java

    1. <span style="font-size: medium;">package com.javacrazyer.web.action;  
    2.   
    3.   
    4. import com.javacrazyer.domain.User;  
    5. import com.opensymphony.xwork2.ActionSupport;  
    6.   
    7.   
    8. public class UserAction extends ActionSupport {  
    9.     private static final long serialVersionUID = -2554018432709689579L;  
    10.     private User user; //自定義類型Field  
    11.       
    12.       
    13.       
    14.     public String registe() throws Exception{  
    15.         System.out.println("registe======================");  
    16.         return SUCCESS;  
    17.     }  
    18.       
    19.     public String login() throws Exception{  
    20.         return SUCCESS;  
    21.     }  
    22.     /* 
    23.     public void validate(){ 
    24.         System.out.println("調用validate方法"); 
    25.     } 
    26.      
    27.     //執行exceute方法前調用 
    28.     public void validateRegiste(){ 
    29.         System.out.println("調用validateRegiste方法"); 
    30.         String lname = user.getLoginname(); 
    31.          if(null != lname && !lname.trim().matches("[a-zA-Z_]\\w{3,19}")){ 
    32.                 this.addFieldError("loginname", "用戶名不能爲空,且只能由4-20個字母和數字組成"); 
    33.                 //this.addActionError("用戶名不能爲空,且只能由4-20個字母和數字組成"); 
    34.         } 
    35.     } 
    36.      
    37.     public void validateLogin(){ 
    38.         System.out.println("調用validateLogin方法"); 
    39.     } 
    40. */  
    41.     public User getUser() {  
    42.         return user;  
    43.     }  
    44.   
    45.     public void setUser(User user) {  
    46.         this.user = user;  
    47.     }  
    48.       
    49. }</span>  
    UserAction-user_login-validation.xml

    1. <span style="font-size: medium;"><?xml version="1.0" encoding="UTF-8"?>  
    2. <!DOCTYPE validators PUBLIC   
    3.     "-//OpenSymphony Group//XWork Validator 1.0.2//EN"   
    4.     "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">  
    5. <validators>  
    6.     <!-- 針對自定義Field使用visitor校驗 -->  
    7.     <field name="user">  
    8.         <field-validator type="required" short-circuit="true">  
    9.             <message>用戶的信息必填</message><!-- 消息前綴 -->  
    10.         </field-validator>  
    11.         <field-validator type="visitor">  
    12.             <param name="context">userLoginContext</param><!-- 指定本visitor校驗的上下文 -->  
    13.             <param name="appendPrefix">true</param><!-- 是否要添加校驗失敗消息的前綴 -->  
    14.             <message>用戶的</message><!-- 消息前綴 -->  
    15.         </field-validator>  
    16.     </field>  
    17. </validators></span>  

    UserAction-user_registe-validation.xml
    1. <span style="font-size: medium;"><?xml version="1.0" encoding="UTF-8"?>  
    2. <!DOCTYPE validators PUBLIC   
    3.     "-//OpenSymphony Group//XWork Validator 1.0.2//EN"   
    4.     "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">  
    5. <validators>  
    6.     <!-- 針對自定義Field使用visitor校驗 -->  
    7.     <field name="user">  
    8.         <field-validator type="required" short-circuit="true">  
    9.             <message>用戶的信息必填</message><!-- 消息前綴 -->  
    10.         </field-validator>  
    11.         <field-validator type="visitor">  
    12.             <param name="context">userContext</param><!-- 指定本visitor校驗的上下文 -->  
    13.             <param name="appendPrefix">true</param><!-- 是否要添加校驗失敗消息的前綴 -->  
    14.             <message>用戶的</message><!-- 消息前綴 -->  
    15.         </field-validator>  
    16.     </field>  
    17. </validators></span>  
    第三個示例:註解方式校驗器---註冊頁面
    acc2_registe.jsp
    1. <span style="font-size: medium;"><%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>  
    2. <%@ taglib uri="/struts-tags" prefix="s" %>  
    3. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  
    4. <html>  
    5.   <head>  
    6.     <title>Struts2中基於Annotation配置式的校驗器使用示例</title>  
    7.   </head>  
    8.   <body>  
    9. <h3>Annotation配置式校驗器---註冊頁面</h3><hr/>  
    10.   
    11. <div style="color:red"><s:fielderror/></div>  
    12. <form action="acc2_registe.action" method="post">  
    13.     <table>  
    14.         <tr>  
    15.             <td>ID</td>  
    16.             <td><input type="text" name="id" value="${param.id}"/></td>  
    17.         </tr>  
    18.         <tr>  
    19.             <td>登錄名</td>  
    20.             <td><input type="text" name="name" value="${param.name}"/></td>  
    21.         </tr>  
    22.         <tr>  
    23.             <td>密碼</td>  
    24.             <td><input type="password" name="pwd"/></td>  
    25.         </tr>  
    26.         <tr>  
    27.             <td>重複密碼</td>  
    28.             <td><input type="password" name="pwd2"/></td>  
    29.         </tr>  
    30.         <tr>  
    31.             <td>時間</td>  
    32.             <td><input type="text" name="registed_date" value="${param.registed_date}"/></td>  
    33.         </tr>  
    34.         <tr>  
    35.             <td>email</td>  
    36.             <td><input type="text" name="email" value="${param.email}"/></td>  
    37.         </tr>  
    38.         <tr>  
    39.             <td>考試成績</td>  
    40.             <td><input type="text" name="score" value="${param.score}"/></td>  
    41.         </tr>  
    42.         <tr>  
    43.             <td colspan="2"><input type="submit" value=" 提交 "/></td>  
    44.         </tr>  
    45.     </table>  
    46. </form>  
    47.   </body>  
    48. </html></span>  

    src/struts.xml

    1. <span style="font-size: medium;"><?xml version="1.0" encoding="UTF-8" ?>  
    2. <!DOCTYPE struts PUBLIC  
    3.     "-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN"  
    4.     "http://struts.apache.org/dtds/struts-2.1.7.dtd">  
    5.   
    6. <struts>  
    7.     <!-- 請求參數的編碼方式 -->  
    8.     <constant name="struts.i18n.encoding" value="UTF-8"/>  
    9.     <!-- 指定被struts2處理的請求後綴類型。多個用逗號隔開 -->  
    10.     <constant name="struts.action.extension" value="action,do,go,xkk"/>  
    11.     <!-- 當struts.xml改動後,是否重新加載。默認值爲false(生產環境下使用),開發階段最好打開  -->  
    12.     <constant name="struts.configuration.xml.reload" value="true"/>  
    13.     <!-- 是否使用struts的開發模式。開發模式會有更多的調試信息。默認值爲false(生產環境下使用),開發階段最好打開  -->  
    14.     <constant name="struts.devMode" value="false"/>  
    15.     <!-- 設置瀏覽器是否緩存靜態內容。默認值爲true(生產環境下使用),開發階段最好關閉  -->  
    16.     <constant name="struts.serve.static.browserCache" value="false" />  
    17.     <!-- 是否允許在OGNL表達式中調用靜態方法,默認值爲false -->  
    18.     <constant name="struts.ognl.allowStaticMethodAccess" value="true"/>  
    19.       
    20.     <!-- 指定由spring負責action對象的創建   
    21.     <constant name="struts.objectFactory" value="spring" />  
    22.     -->  
    23.     <!-- 是否開啓動態方法調用 -->  
    24.     <constant name="struts.enable.DynamicMethodInvocation" value="false"/>  
    25.       
    26.     <package name="my" extends="struts-default" namespace="/">  
    27.             <action name="acc2_*" class="com.javacrazyer.web.action.Account2Action" method="{1}">  
    28.             <result name="success">/info.jsp</result>  
    29.             <result name="input">/acc2_{1}.jsp</result>  
    30.         </action>  
    31.     </package>  
    32.       
    33. </struts>  
    34. </span>  

    Account2Action.java

    1. <span style="font-size: medium;">package com.javacrazyer.web.action;  
    2.   
    3. import java.util.Date;  
    4.   
    5. import org.apache.struts2.interceptor.validation.SkipValidation;  
    6.   
    7. import com.opensymphony.xwork2.ActionSupport;  
    8. import com.opensymphony.xwork2.validator.annotations.FieldExpressionValidator;  
    9. import com.opensymphony.xwork2.validator.annotations.RegexFieldValidator;  
    10. import com.opensymphony.xwork2.validator.annotations.RequiredStringValidator;  
    11. import com.opensymphony.xwork2.validator.annotations.Validations;  
    12. import com.opensymphony.xwork2.validator.annotations.ValidatorType;  
    13.   
    14. /** 
    15.  * 使用註解來配置校驗的示例 
    16.  * 
    17.  */  
    18. public class Account2Action extends ActionSupport {  
    19.     private static final long serialVersionUID = -1418893621512812472L;  
    20.     private Integer id;  
    21.     private String name;  
    22.     private String pwd;  
    23.     private String pwd2;  
    24.     private Double score;  
    25.     private Date registed_date;  
    26.     private String email;  
    27.       
    28.       
    29.     @Validations(  
    30.             requiredStrings={@RequiredStringValidator(fieldName="name",message="我的用戶名是必須的",shortCircuit=true,trim=true,type=ValidatorType.FIELD),  
    31.                     @RequiredStringValidator(fieldName="pwd",message="我的密碼是必須的",shortCircuit=true,trim=true,type=ValidatorType.FIELD)},  
    32.             fieldExpressions={@FieldExpressionValidator(fieldName="pwd", message="兩次密碼不相同",expression="pwd==pwd2")},  
    33.             regexFields={@RegexFieldValidator(expression="^[_A-Za-z0-9-]+(\\.[_A-Za-z0-9-]+)*@([A-Za-z0-9-])+((\\.com)|(\\.cn)|(\\.net)|(\\.org)|(\\.info)|(\\.edu)|(\\.mil)|(\\.gov)|(\\.biz)|(\\.ws)|(\\.us)|(\\.tv)|(\\.cc)|(\\.aero)|(\\.arpa)|(\\.coop)|(\\.int)|(\\.jobs)|(\\.museum)|(\\.name)|(\\.pro)|(\\.travel)|(\\.nato)|(\\..{2,3})|(\\..{2,3}\\..{2,3}))$")}  
    34.     )  
    35.     public String registe() throws Exception{  
    36.         System.out.println("registe-------------------");  
    37.         return SUCCESS;  
    38.     }  
    39.       
    40.     @SkipValidation  
    41.     public String login()throws Exception{  
    42.         return SUCCESS;  
    43.     }  
    44.       
    45.     public Integer getId() {  
    46.         return id;  
    47.     }  
    48.     public void setId(Integer id) {  
    49.         this.id = id;  
    50.     }  
    51.     public String getName() {  
    52.         return name;  
    53.     }  
    54.     public void setName(String name) {  
    55.         this.name = name;  
    56.     }  
    57.     public Double getScore() {  
    58.         return score;  
    59.     }  
    60.     public void setScore(Double score) {  
    61.         this.score = score;  
    62.     }  
    63.     public Date getRegisted_date() {  
    64.         return registed_date;  
    65.     }  
    66.     public void setRegisted_date(Date registedDate) {  
    67.         registed_date = registedDate;  
    68.     }  
    69.     public String getEmail() {  
    70.         return email;  
    71.     }  
    72.     public void setEmail(String email) {  
    73.         this.email = email;  
    74.     }  
    75.   
    76.     public String getPwd() {  
    77.         return pwd;  
    78.     }  
    79.   
    80.     public void setPwd(String pwd) {  
    81.         this.pwd = pwd;  
    82.     }  
    83.   
    84.     public String getPwd2() {  
    85.         return pwd2;  
    86.     }  
    87.   
    88.     public void setPwd2(String pwd2) {  
    89.         this.pwd2 = pwd2;  
    90.     }  
    91. }</span> 
      
  92.      
發佈了39 篇原創文章 · 獲贊 11 · 訪問量 14萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章