struts2数据校验
第一种校验的方式:使用execute()方法进行数据校验
创建一个名为:ExecuteAction去继承ActionSupport类
package cn.happy.action; import cn.happy.entity.UserInfo; import com.opensymphony.xwork2.ActionSupport; public class ExecuteAction extends ActionSupport { private UserInfo info; // 确认密码 private String okpwd; @Override public String execute() throws Exception { if (info.getUsername().length() == 0) { addFieldError("username", "用户名不能为空"); } if (info.getPassword().length() == 0) { addFieldError("pwd", "密码不能为空"); } if (!info.getPassword().equals(okpwd)) { addFieldError("pwd", "两次密码必须一致"); } //判定FieldError对象中是否有错误信息 //若有错误信息 则返回input if(this.hasErrors()){ return INPUT; } return SUCCESS; } public UserInfo getInfo() { return info; } public void setInfo(UserInfo info) { this.info = info; } public String getOkpwd() { return okpwd; } public void setOkpwd(String okpwd) { this.okpwd = okpwd; } }
然后我们在创建一个struts.xml
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd"> <struts> <!-- 修改文件 tomact不用重启 --> <constant name="struts.devMode" value="true" /> <package name="default" namespace="/" extends="struts-default"> <!-- 测试execute方法 --> <action name="execute" class="cn.happy.action.ExecuteAction"> <result name="success">success.jsp</result> <result name="input">regist.jsp</result> </action> </package> </struts>
jsp页面我就不做展示了
然后我们通过:http://localhost:8080/Chap06_validate 来进行访问
首先我们会先进入注册界面:
然后我们什么都不输入直接点注册看一下执行效果:
然后我们去输入用户名和密码,但是我们在确认密码的文本框中输入一个不对应的密码:
在此我们可以看出,如果两次的输入的密码不一致是不可以的。
以上是第一种校验的方式: 继承自ActionSupport类,重写execute()
第二种:用validate()方法实现数据校验
同样我们先创建一个:ValidateAction
package cn.happy.action; import cn.happy.entity.UserInfo; import com.opensymphony.xwork2.ActionSupport; public class ValidateAction extends ActionSupport{ private UserInfo info; //确认密码 private String okpwd; @Override public String execute() throws Exception{ return SUCCESS; } //实现数据校验 @Override public void validate() { if(info.getUsername().length()==0){ addFieldError("username", "用户名不能为空"); } if(info.getPassword().length()==0){ addFieldError("pwd", "密码不能为空"); } if(!info.getPassword().equals(okpwd)){ addFieldError("pwd", "两次密码必须一致"); } } public UserInfo getInfo() { return info; } public void setInfo(UserInfo info) { this.info = info; } public String getOkpwd() { return okpwd; } public void setOkpwd(String okpwd) { this.okpwd = okpwd; } }
其次就是struts.xml
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd"> <struts> <!-- 修改文件 tomact不用重启 --> <constant name="struts.devMode" value="true" /> <package name="default" namespace="/" extends="struts-default"> <!-- 测试validate方法 --> <action name="Validate" class="cn.happy.action.ValidateAction"> <result name="success">success.jsp</result> <result name="input">regist.jsp</result> </action> </package> </struts>
其效果再次就不做演示了,反正是给我自己看的又上不了首页!!!
以上是第二种:继承ActionSupport类,该类实现了Validateable接口,该接口中定义了一个validate()方法,在自定义的Action类中重写validate()方法,如果校验表单输入域出现错误,则将错误添加到ActionSupport类的fieldErrors域中,然后通过OGNL表达式负责输出。
第三种:用validateXxx()方法实现数据校验
同样创建一个:ValidateXxxAction
package cn.happy.action;
import cn.happy.entity.UserInfo;
import com.opensymphony.xwork2.ActionSupport;
public class ValidateXxxAction extends ActionSupport{
private UserInfo info;
//确认密码
private String okpwd;
public void validateRegist(){
if(info.getUsername().length()<6){
addFieldError("username", "用户名长度不能小于6位");
}
}
public String regist(){
return SUCCESS;
}
@Override
public String execute() throws Exception{
return SUCCESS;
}
//实现数据校验
@Override
public void validate() {
if(info.getUsername().length()==0){
addFieldError("username", "用户名不能为空");
}
if(info.getPassword().length()==0){
addFieldError("pwd", "密码不能为空");
}
if(!info.getPassword().equals(okpwd)){
addFieldError("pwd", "两次密码必须一致");
}
}
public UserInfo getInfo() {
return info;
}
public void setInfo(UserInfo info) {
this.info = info;
}
public String getOkpwd() {
return okpwd;
}
public void setOkpwd(String okpwd) {
this.okpwd = okpwd;
}
}
struts.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<!-- 修改文件 tomact不用重启 -->
<constant name="struts.devMode" value="true" />
<package name="default" namespace="/" extends="struts-default">
<!-- 测试validateXxx方法 -->
<action name="ValidateXxx" class="cn.happy.action.ValidateXxxAction" method="regist">
<result name="success">success.jsp</result>
<result name="input">regist.jsp</result>
</action>
</package>
</struts>
效果我就不展示了,啊哈哈哈!
以上是第三种校验方式:在validate()方法中对数据验证是可以工作的,如果在字段非常多的情况下,而且每个字段又有很复杂的验证,那么我们的validate方法中的代码会越来越多。 针对特定的方法输入的数据的验证我们把他放到validateXxx方法中,Xxx是方法名的首字母大写形式
接下来就是重点了,我们要使用struts2的验证框架实现数据校验(好东西)
同样我们先创建一个:UserAction
package cn.happy.action; import cn.happy.entity.UserInfo; import com.opensymphony.xwork2.ActionSupport; public class UserAction extends ActionSupport{ private UserInfo info; private String okpwd; @Override public String execute() throws Exception { return SUCCESS; } public UserInfo getInfo() { return info; } public void setInfo(UserInfo info) { this.info = info; } public String getOkpwd() { return okpwd; } public void setOkpwd(String okpwd) { this.okpwd = okpwd; } }
但是这不是重点,我们要在UserAction这个的同目录下去创建一个UserAction-validation.xml文件
<!DOCTYPE validators PUBLIC "-//Apache Struts//XWork Validator 1.0.3//EN" "http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd"> <validators> <!-- 用户名:不能为空 长度在6-10之间 --> <field name="info.username"> <field-validator type="requiredstring"> <param name="trim">true</param> <message>用户名不能为空</message> </field-validator> <field-validator type="stringlength"> <param name="maxLength">10</param> <param name="minLength">6</param> <message>用户名长度必须在${minLength}到${maxLength}之间</message> </field-validator> </field> <!-- 密码 --> <field name="info.password"> <field-validator type="requiredstring"> <param name="trim">true</param> <message>密码不能为空</message> </field-validator> </field> <field name="okpwd"> <field-validator type="fieldexpression"> <param name="expression">info.password==okpwd</param> <message>两次输入的密码必须一致</message> </field-validator> </field> <!-- 电话号码 --> <field name="info.phone"> <field-validator type="requiredstring"> <param name="trim">true</param> <message>电话号码不能为空</message> </field-validator> </field> <field name="info.phone"> <field-validator type="regex"> <param name="regex">^(\d{3,4}-){0,1}(\d{7,8})$</param> <message>电话号码格式不正确</message> </field-validator> </field> </validators>
再次我要在给你们一个好东西
常用验证规则:
然后我来简单阐述用struts2的验证框架实现数据校验
① 为什么要用验证框架:
当验证规则比较复杂时,Action类的代码将变得很繁琐,假如我们要对电话号码的格式进行验证,是非常麻烦的
②验证框架的优点:
Struts2中内置了一个验证框架,将常用的验证规则进行了编码实现,使用验证框架时,用户无需再进行编码,只要在外部配置文件中指定某个字段需要进行的验证类型,并提供出错误信息即可,从而大大减轻了开发者的负担,提高开发效率
③命名规范:
1、文件的命名规则:
ActionName-validation.xml,ActionName为需要校验的Action类名,如:UserAction-validation.xml
2、文件存放路径:
该文件与Action类的class文件位于同一个路径下
3、文件格式:包括如下3个配置元素
<field>: 为每一个需要校验的字段添加一个验证元素<field>,name属性表示要校验的字段名。
<field-validator>: 使用该元素来指定校验规则,type属性为校验规则名
<message>: 使用该元素来指定校验出错时要显示的标签,key属性指向资源文件中的标签名
实现数据校验的流程:
① 对输入的数据首先进行类型转换,并封装成Action属性
② 如果类型转换出现错误,就将错误提示保存到ActionContext,并封装到fieldError中
③ 类型转换执行完毕后,会根据项目的配置执行验证框架的校验,也可能通过执行validate()或者validateXxx()方法进行校验
④ 如果经过以上步骤都没有出现错误,那么将直接调用Action里用于处理用户请求的方法,然后根据结果类型转入相应的视图资源。一旦出现了错误,那么系统将直接返回输入数据的视图资源,后者通常由workflow拦截器处理