关闭

Struts2客户端验证的学习

标签: strutsactionformshtmlencodingvalidation
517人阅读 评论(0) 收藏 举报
分类:

转自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。。。。

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:123495次
    • 积分:1485
    • 等级:
    • 排名:千里之外
    • 原创:15篇
    • 转载:61篇
    • 译文:0篇
    • 评论:18条
    最新评论