Struts2客戶端驗證的學習

轉自http://blog.csdn.net/fj359941160/article/details/7037932

直接上代碼。 驗證問題。

遇到了點問題。

regist.jsp中的表單代碼

  1. <s:form action="registAction" validate="true"> 
  2.             <s:textfield name="name" label="用戶名"></s:textfield> 
  3.             <s:textfield name="pass" label="密    碼"></s:textfield> 
  4.             <s:textfield name="age" label="年齡"></s:textfield> 
  5.             <s:textfield name="birth" label="生日"></s:textfield> 
  6.             <s:submit name="註冊"/> 
  7.         </s:form> 


4個屬性分別是user對象裏的四個屬性

注意<s:form>標籤裏有個屬性validate爲true。這樣纔是客戶端驗證。


struts2中的配置package中的action配置

  1. <action name="registAction" class="fj.struts.action.RegistAction"> 
  2.             <result name="input">/regist.jsp</result> 
  3.             <result name="success">/show.jsp</result> 
  4.         </action> 


驗證代碼

  1. <?xml version="1.0" encoding="GBK"?> 
  2.  
  3. <!DOCTYPE validators PUBLIC 
  4.         "-//OpenSymphony Group//XWork Validator 1.0.3//EN" 
  5.         "http://www.opensymphony.com/xwork/xwork-validator-1.0.3.dtd"> 
  6.  
  7. <validators> 
  8.  
  9.     <field name="name"> 
  10.         <field-validator type="requiredstring" short-circuit="true"> 
  11.             <param name="trim">true</param> 
  12.             <message key="name.requried"></message> 
  13.         </field-validator> 
  14.         <field-validator type="regex"> 
  15.             <param name="expression"><![CDATA[(\w{4,25})]]></param> 
  16.             <message key="name.regex"></message> 
  17.         </field-validator> 
  18.     </field> 
  19.      
  20.     <field name="pass"> 
  21.         <field-validator type="requiredstring" short-circuit="true"> 
  22.             <param name="trim">true</param> 
  23.             <message key="pass.requried"></message> 
  24.         </field-validator> 
  25.         <field-validator type="regex"> 
  26.             <param name="expression"><![CDATA[(\w{4,25})]]></param> 
  27.             <message key="pass.regex"></message> 
  28.         </field-validator> 
  29.     </field> 
  30.      
  31.     <field name="age"> 
  32.         <field-validator type="int" short-circuit="true"> 
  33.             <param name="min">1</param> 
  34.             <param name="max">150</param> 
  35.             <message key="age.range"></message> 
  36.         </field-validator> 
  37.     </field> 
  38.      
  39.     <field name="birth"> 
  40.         <field-validator type="date" short-circuit="true"> 
  41.             <param name="min">1900-01-01</param> 
  42.             <param name="max">2050-02-21</param> 
  43.             <message key="birth.range"></message> 
  44.         </field-validator> 
  45.     </field> 
  46. </validators> 


看結果


由於我們在validate文件中加入了短路屬性

  1. short-circuit="true" 

所以第一個不符合條件後後面就不執行了。


服務器端驗證不同。它還是會把所有的屬性都驗證一遍。


這裏說下遇到的問題。


首先第一個在regist.jsp文件中

  1. <s:form action="registAction.action" validate="true"> 
  2.             <s:textfield name="name" label="用戶名"></s:textfield> 
  3.             <s:textfield name="pass" label="密    碼"></s:textfield> 
  4.             <s:textfield name="age" label="年齡"></s:textfield> 
  5.             <s:textfield name="birth" label="生日"></s:textfield> 
  6.             <s:submit name="註冊"/> 
  7.         </s:form> 

一開始我的action是registAction.action多了個後綴action。 結果就變成了服務器端驗證。每個屬性都驗證了一遍。

第二點。

在struts.xml文件中配置如下內容

<action name="*">
    <result>/{1}.jsp</result>
    </action>


不然會出現錯誤

錯誤的原因是 我們希望Struts2的客戶端驗證能發生作用,那我們進入該regist.jsp頁面之前必須經過Struts2的核心Filter,而上面我們直接請求了regist.jsp,所以出錯了。



後來又做了個例子。


  1. <package name="regist" extends="struts-default" namespace="/test"> 
  2.      
  3.         <action name="registAction" class="fj.struts.action.RegistAction"> 
  4.             <result name="input">/regist.jsp</result> 
  5.             <result name="success">/show.jsp</result> 
  6.         </action> 
  7.          
  8.         <action name="*"> 
  9.             <result>/{1}.jsp</result> 
  10.         </action> 
  11.          
  12.          
  13. </package> 



我們在namespace爲/test的package裏配置了這些東西。

下面這個東西是爲了通過Struts的核心Filter。而不直接regist.jsp。   不然會出錯

  1. <action name="*"> 
  2.             <result>/{1}.jsp</result> 
  3.         </action> 


註冊頁面表單代碼如下

  1. <s:form action="registAction" validate="true" namespace="/test" method="post"> 
  2.             <s:textfield name="name" label="用戶名"></s:textfield> 
  3.             <s:textfield name="pass" label="密    碼"></s:textfield> 
  4.             <s:textfield name="age" label="年齡"></s:textfield> 
  5.             <s:textfield name="birth" label="生日"></s:textfield> 
  6.             <s:submit name="註冊" /> 
  7.         </s:form> 


這裏必須要寫明validate爲true(客戶端驗證)和 namespace 。 namespace必須要和struts2中的一樣。


如果我們寫了這樣的代碼

  1. <s:form action="/test/registAction.action" validate="true" method="post"> 
  2.             <s:textfield name="name" label="用戶名"></s:textfield> 
  3.             <s:textfield name="pass" label="密    碼"></s:textfield> 
  4.             <s:textfield name="age" label="年齡"></s:textfield> 
  5.             <s:textfield name="birth" label="生日"></s:textfield> 
  6.             <s:submit name="註冊" /> 
  7.         </s:form> 


這樣就變成了服務器端驗證。


在這搞了半天。

後來上網查了資料。在Struts2的官方客戶端驗證例子中有這個一段話http://struts.apache.org/2.1.8.1/docs/client-validation.html




下面這段話正是我剛纔錯誤的配置。 看While the following will "work" in the sense that the form will function correctly, client-side validation will not. That is because Struts must know the exact namespace and action (rather than a URL) to properly support validation.

英語很差。。 稍微翻譯一下:
大概的意思是: 客戶端驗證不能執行。這是因爲Struts2必須知道額外的namespace(而不是一個URL)去支持驗證功能
所以必須要寫namepsace而不要在action裏寫一個包含namespace的URL。。。。

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