以前一直是用struts1开发程序,近日看了一下struts2。在这里发表一下自己的一下看法,欢迎大家探讨一下。
struts2 采用配置文件的形式进行验证的,action的代码如下:
public class LoginAction extends com.opensymphony.xwork2.ActionSupport{
private String userName;
private String passwd;
private String vercode;
public String login()throws Exception
{
return "";
}
}
验证文件的名称是:LoginAction-login-validation.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0.2//EN"
"http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">
<validators>
<field name="userName" >
<field-validator type="requiredstring" >
<message>login用户名必填!</message>
</field-validator>
<field-validator type="regex" >
<param name="expression"><![CDATA[(\S{2,10})]]></param>
<message>您输入的用户名的长度必须在2到10之间</message>
</field-validator>
</field>
<field name="passwd" >
<field-validator type="requiredstring" >
<message>login密码必填!</message>
</field-validator>
</field>
<field name="vercode">
<field-validator type="requiredstring">
<message>login验证码必填!</message>
</field-validator>
<field-validator type="regex">
<param name="expression"><![CDATA[(\w{6,6})]]></param>
<message>您输入的验证码只能是字母和数字,且长度必须在6位</message>
</field-validator>
</field>
</validators>
在页面提交一个form表单:
<form action="login.action" method="post" >
<table>
<tr>
<td><label>用户名:</label></td>
<td
><input type="text" name="userName
" value=""/>
</td>
<td>
<s:fielderror ><s:param>userName
</s:param></s:fielderror>
</td>
</tr>
<tr>
<td><label>密码:</label></td>
<td
><input type="password" name="passwd
" />
</td>
<td>
<s:fielderror><s:param>passwd
</s:param></s:fielderror>
</td>
</tr>
<tr>
<td><label>验证码:</label></td>
<td
><input type="text" name="vercode
" value="" />
</td>
<td>
<img src="authImg" id="authImg" onClick="refresh()" title="看不清?单击此处刷新" alt="验证码"/>
<s:fielderror><s:param>vercode
</s:param></s:fielderror>
</td>
</tr>
<tr>
<td colspan="2"><div align="right"><input type="submit" value="登陆"/>
</div></td>
</tr>
</table></form>
当你输入的字段不符合配置文件的规则,就会跳到配置的input页面里面。例如输入的用户名不符合规则,则会显示提示的信息在:<s:fielderror ><s:param>userName
</s:param></s:fielderror>里面。
有一个问题是:当你再次根据提示的信息,修改你的输入信息。还是不能提交,这是为什么呢?
原因是因为里面的fielderror的字段的信息没有清空。
有时但你需要从action里面读取一下数据,在页面显示的时候,如果你的输入信息错误,那你将读取不到action里面的信息,这是因为当验证没有通过的时候是读取不到action的东西,那当跳转到input的时候,就会有些数据读取不到了。
解决的办法是重写validate()方法。
你可以在该方法里面的开头加一句:clearErrorsAndMessages();
这样每次从新验证的时候就会把上次的错误信息清除掉。
而且重写该方法可以把你需要的数据在这里写好。
上面是我的一下看法,如果有更好的解决办法,请告诉我,谢谢