现在的位置: 首页 > 综合 > 正文

Struts2客户端验证的学习

2014年01月13日 ⁄ 综合 ⁄ 共 3908字 ⁄ 字号 评论关闭

直接上代码。 验证问题。

遇到了点问题。

regist.jsp中的表单代码

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


4个属性分别是user对象里的四个属性

注意<s:form>标签里有个属性validate为true。这样才是客户端验证。


struts2中的配置package中的action配置

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

验证代码

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

看结果

由于我们在validate文件中加入了短路属性

short-circuit="true"

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

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

这里说下遇到的问题。

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

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

一开始我的action是registAction.action多了个后缀action。 结果就变成了服务器端验证。每个属性都验证了一遍。

第二点。

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

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

不然会出现错误

错误的原因是 我们希望Struts2的客户端验证能发生作用,那我们进入该regist.jsp页面之前必须经过Struts2的核心Filter,而上面我们直接请求了regist.jsp,所以出错了。

后来又做了个例子。

<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。   不然会出错

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

注册页面表单代码如下

<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中的一样。

如果我们写了这样的代码

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

抱歉!评论已关闭.