这里我们来讨论 用户输入验证的两种方式:基于手工编程验证、基于Xml文件验证。
一、基于手工编程:
1、验证该动作类的所有方法:
(1)、在struts.xml中,创建相关的动作类,在书写标签的时候,记得把input这个返回值也写上,因为一旦在数据类型转换或者验证失败,都回转到input对应的结果处理。(这里为什么有类型转换?因为在许多Mvc框架中,类型转换和验证是不分家的,看struts2的拦截器加载顺序,是先类型转换器,然后是验证器,最后就是方法的调用,这个顺序就是说,当调用方法的前两个动作,只有1个出错,它都不会调用方法,在类型转换或者验证时出现的错误信息,被框架记录在fieldError中,其中维护着一个Map。)
代码如下:
<package name="p1" namespace="/ns1" extends="struts-default">
<action name="validate1_add" class="cn.ansel.validator.validate1" method="add">
<result name="success">/add.jsp</result>
<result name="input">/validate.jsp</result>
</action>
</package>
(2)、编写相关的用户输入页面,并定义好字段名以及目标动作类(参照struts.xml)
代码如下:
<form action="${pageContext.request.contextPath}/ns1/validate1_adde" method="post">
username:<input type="text" name="username"/><br/>
password:<input type="text" name="password"/><br/>
<input type="submit" value="go"/>
</form>
(3)、根据struts.xml中对应动作,创建一个对应动作类及方法,并继承actionSupport
(4)、覆写其中的validate方法
(5)、在方法中输入自己的验证方法。
代码如下:
package cn.ansel.validator;
import java.io.Serializable;
import com.opensymphony.xwork2.ActionSupport;
public class validate1 extends ActionSupport implements Serializable {
private String username;
private String password;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String add(){
return SUCCESS;
}
public String update(){
return SUCCESS;
}
@Override
public void validate() {
//手工编程验证:
//1、判断用户名是否为null 或者空字符串,
if(username==null||"".equals(username.trim())){
//是的话放信息的addFiledError的Map中
addFieldError("username", "username can not be null");
}
//判断密码是否为3-6位的数字,不是的话也放信息到addFiledError的mAP中
if(password==null ||!password.matches("\\d{3,6}")){
addFieldError("password", "password can only be numbers which length between 3 and 6");
}
}
}
(6)使用struts标签,在input结果的处理页面中,现实错误信息
代码如下:
<s:fielderror fieldName="username"></s:fielderror>
<s:fielderror fieldName="password"></s:fielderror>
2、验证该动作类的指定方法
步骤与上一致,只是不覆写动作类的validate方法,而是覆写validate方法名,但是方法名第一个字母要大写。代码如下:
public void validateAdd(){
//手工编程验证:
//1、判断用户名是否为null 或者空字符串,
if(username==null||"".equals(username.trim())){
//是的话放信息的addFiledError的Map中
addFieldError("username", "username can not be null");
}
//判断密码是否为3-6位的数字,不是的话也放信息到addFiledError的mAP中
if(password==null ||!password.matches("\\d{3,6}")){
addFieldError("password", "password can only be numbers which length between 3 and 6");
}
}
在这里需要注意的是,如果使用了指定方法验证,就应该把validate方法去掉,否则会验证2次。
二、基于xml文件验证:
1、验证动作类中的所有方法:
(1)、与上面不同的是,把上面中动作类的所有validate的相关方法去掉
(2)、在与动作类相同的包中建立名称为动作类-validation.xml文件
validate1-validation.xml
(3)、在xwork.core.jar文件中,打开xwork.validator-1.0.3.dtd(如果还没有提示的话,把整个文件拷贝作备用),复制里面dtd的引用:
<!DOCTYPE validators PUBLIC
"-//OpenSymphony Group//XWork Validator 1.0.3//EN"
"http://www.opensymphony.com/xwork/xwork-validator-1.0.3.dtd">
(4)、在复制及设置提示完成后,开始设置里面的验证,代码如下:
<validators>
<field name="username">
<field-validator type="requiredstring">
<message>the username can not be null</message>
</field-validator>
</field>
<field name="password">
<field-validator type="requiredstring">
<message>the password can not be null</message>
</field-validator>
<field-validator type="regex">
<param name="expression"><![CDATA[/d{3,6}]]></param>
<message>the password must contain 3 to 6 numbers</message>
</field-validator>
</field>
</validators>
2、对于指定的方法进行验证:
直接更改xml文件名即可,格式为:动作类-动作名(struts.xml中的动作名)-validation.xml
validate1-validate1_add-validation.xml
以上
版权声明:本文为博主原创文章,禁止一切转载
原文地址:http://blog.csdn.net/andy_px/article/details/47358031