您的位置:首页 > 编程语言 > Java开发

Struts2客户端验证的学习

2012-03-28 20:02 218 查看
转自http://blog.csdn.net/fj359941160/article/details/7037932

直接上代码。 验证问题。

遇到了点问题。

regist.jsp中的表单代码

[html]
view plaincopyprint?

<s:form
action="registAction"
validate="true"> 

            <s:textfield
name="name"
label="用户名"></s:textfield> 

            <s:textfield
name="pass"
label="密    码"></s:textfield> 

            <s:textfield
name="age"
label="年龄"></s:textfield> 

            <s:textfield
name="birth"
label="生日"></s:textfield> 

            <s:submit
name="注册"/> 

        </s:form> 

[html]
view plaincopyprint?

<action
name="registAction"
class="fj.struts.action.RegistAction"> 

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

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

        </action> 

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


验证代码

[html]
view plaincopyprint?

<?xml
version="1.0"
encoding="GBK"?> 

 
<!DOCTYPE validators PUBLIC 
        "-//OpenSymphony Group//XWork Validator 1.0.3//EN" 
        "http://www.opensymphony.com/xwork/xwork-validator-1.0.3.dtd"> 

 
<validators> 

 
    <field
name="name"> 

        <field-validator
type="requiredstring"
short-circuit="true"> 

            <param
name="trim">true</param> 

            <message
key="name.requried"></message> 

        </field-validator> 

        <field-validator
type="regex"> 

            <param
name="expression"><![CDATA[(\w{4,25})]]></param> 

            <message
key="name.regex"></message> 

        </field-validator> 

    </field> 

     
    <field
name="pass"> 

        <field-validator
type="requiredstring"
short-circuit="true"> 

            <param
name="trim">true</param> 

            <message
key="pass.requried"></message> 

        </field-validator> 

        <field-validator
type="regex"> 

            <param
name="expression"><![CDATA[(\w{4,25})]]></param> 

            <message
key="pass.regex"></message> 

        </field-validator> 

    </field> 

     
    <field
name="age"> 

        <field-validator
type="int"
short-circuit="true"> 

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

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

            <message
key="age.range"></message> 

        </field-validator> 

    </field> 

     
    <field
name="birth"> 

        <field-validator
type="date"
short-circuit="true"> 

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

            <param
name="max">2050-02-21</param> 

            <message
key="birth.range"></message> 

        </field-validator> 

    </field> 

</validators> 

[html]
view plaincopyprint?

short-circuit="true" 

short-circuit="true"


所以第一个不符合条件后后面就不执行了。

服务器端验证不同。它还是会把所有的属性都验证一遍。

这里说下遇到的问题。

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

[html]
view plaincopyprint?

<s:form
action="registAction.action"
validate="true"> 

            <s:textfield
name="name"
label="用户名"></s:textfield> 

            <s:textfield
name="pass"
label="密    码"></s:textfield> 

            <s:textfield
name="age"
label="年龄"></s:textfield> 

            <s:textfield
name="birth"
label="生日"></s:textfield> 

            <s:submit
name="注册"/> 

        </s:form> 

[html]
view plaincopyprint?

<package
name="regist"
extends="struts-default"
namespace="/test"> 

     
        <action
name="registAction"
class="fj.struts.action.RegistAction"> 

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

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

        </action> 

         
        <action
name="*"> 

            <result>/{1}.jsp</result> 

        </action> 

         
         
</package> 

<package name="regist" extends="struts-default" namespace="/test">

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

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

</package>


我们在namespace为/test的package里配置了这些东西。
下面这个东西是为了通过Struts的核心Filter。而不直接regist.jsp。   不然会出错

[html]
view plaincopyprint?

<action
name="*"> 

            <result>/{1}.jsp</result> 

        </action> 

[html]
view plaincopyprint?

<s:form
action="registAction"
validate="true"
namespace="/test"
method="post"> 

            <s:textfield
name="name"
label="用户名"></s:textfield> 

            <s:textfield
name="pass"
label="密    码"></s:textfield> 

            <s:textfield
name="age"
label="年龄"></s:textfield> 

            <s:textfield
name="birth"
label="生日"></s:textfield> 

            <s:submit
name="注册"
/> 
        </s:form> 

<s:form action="registAction" validate="true" namespace="/test" method="post">
<s:textfield name="name" label="用户名"></s:textfield>
<s:textfield name="pass" label="密    码"></s:textfield>
<s:textfield name="age" label="年龄"></s:textfield>
<s:textfield name="birth" label="生日"></s:textfield>
<s:submit name="注册" />
</s:form>


这里必须要写明validate为true(客户端验证)和 namespace 。 namespace必须要和struts2中的一样。

如果我们写了这样的代码

[html]
view plaincopyprint?

<s:form
action="/test/registAction.action"
validate="true"
method="post"> 

            <s:textfield
name="name"
label="用户名"></s:textfield> 

            <s:textfield
name="pass"
label="密    码"></s:textfield> 

            <s:textfield
name="age"
label="年龄"></s:textfield> 

            <s:textfield
name="birth"
label="生日"></s:textfield> 

            <s:submit
name="注册"
/> 
        </s:form> 

<s:form action="/test/registAction.action" validate="true" method="post">
<s:textfield name="name" label="用户名"></s:textfield>
<s:textfield name="pass" label="密 码"></s:textfield>
<s:textfield name="age" label="年龄"></s:textfield>
<s:textfield name="birth" label="生日"></s:textfield>
<s:submit name="注册" />
</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。。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息