使用Struts2实现数据校验
为什么需要数据校验呢?答案很简单,假如当你登录想要京东,这时就需要数据校验了如果不输入用户名的话,那么就不会登陆成功,并且会提示出"请输入用户名"的字样
那么,在Struts2中实现数据校验的方法有哪些呢?接下来我们探讨一下。
实现数据校验有四种方法:
====================================================================================
1.用execute()方法实现数据校验
编写一个Action,继承ActionSupport类,重写execute()
步骤1:在Web项目的cn.happy.action下创建一个ExecuteAction(UserInfo为用户实体,其中有uname和upwd属性,并且封装)
1 package cn.happy.action; 2 3 import cn.happy.entity.UserInfo; 4 import com.opensymphony.xwork2.ActionSupport; 5 6 /** 7 * 数据校验 8 * Created by CKW on 2017/3/13. 9 */ 10 public class ExecuteAction extends ActionSupport { 11 private UserInfo info; 12 @Override 13 public String execute() throws Exception { 14 if (info.getUname().length()==0){ 15 addFieldError("name","用户名不能为空"); 16 } 17 if (info.getUpwd().length()==0){ 18 addFieldError("pwd","密码不能为空"); 19 } 20 21 //判定FieldError对象中是否有错误信息 22 //若有错误信息 则返回input 23 if (this.hasFieldErrors()){ 24 return INPUT; 25 } 26 27 return SUCCESS; 28 } 29 30 public UserInfo getInfo() { 31 return info; 32 } 33 34 public void setInfo(UserInfo info) { 35 this.info = info; 36 } 37 }
步骤2:创建struts.xml文件,引用ExecuteAction类
1 <!-- 测试execute方法 --> 2 <action name="execute" class="cn.happy.action.ExecuteAction"> 3 <result name="success">/form/success.jsp</result> 4 <result name="input">/form/login.jsp</result> 5 </action>
步骤3.准备前段注册页面login.jsp和成功页面success.jsp
1 <%@ page contentType="text/html;charset=UTF-8" language="java" %> 2 <%@taglib prefix="s" uri="/struts-tags" %> 3 <html> 4 <head> 5 <title>登录</title> 6 </head> 7 <body> 8 <s:fielderror></s:fielderror> 9 <s:form action="regist" method="post"> 10 用户名:<s:textfield name="info.uname"></s:textfield><br> 11 密 码<s:password name="info.upwd"></s:password><br> 12 <s:submit value="提交"></s:submit> 13 </s:form> 14 </body> 15 </html>
1 <%@ page contentType="text/html;charset=UTF-8" language="java" %> 2 <%@taglib prefix="s" uri="/struts-tags" %> 3 <html> 4 <head> 5 <title>成功页面</title> 6 </head> 7 <body> 8 欢迎你:<s:property value="info.uname"></s:property> 9 </body> 10 </html>
2.使用validate()实现数据校验
继承ActionSupport类,该类实现了Validateable接口,该接口中定义了一个validate()方法,在自定义的Action类中重写validate()方法,如果校验表单输入域出现错误,则将错误添加到ActionSupport类的fieldErrors域中,然后通过OGNL表达式负责输出
步骤1:创建ValidateAction类(UserInfo同样为UserInfo实体类)
1 @Override 2 public void validate() { 3 if (info.getUname().length()==0){ 4 addFieldError("name","用户名不能为空"); 5 } 6 if (info.getUpwd().length()==0){ 7 addFieldError("pwd","密码不能为空"); 8 } 9 }
步骤2:在struts.xml文件中再配置一个action
1 <!-- 测试validate方法 --> 2 <action name="validate" class="cn.happy.action.UserInfoAction"> 3 <result name="success">/form/success.jsp</result> 4 <result name="input">/form/login.jsp</result> 5 </action>
步骤三和上面第一种方法一样,同样是两个jsp页面,只是把<s:form action="execute" method="post">的execute改为validate就可以了。
3.使用ValidateXxx方法实现数据校验
在validate()方法中对数据验证是可以工作的,如果在字段非常多的情况下,而且每个字段又有很复杂的验证,那么我们的validate方法中的代码会越来越多。 针对特定的方法输入的数据的验证我们把他放到validateXxx方法中,Xxx是方法名的首字母大写形式
步骤1:在Web项目的cn.happy.action下创建一个ValidateXxxAction(UserInfo为用户实体,其中有username和password属性,并且封装)
1 package cn.happy.action; 2 3 import cn.happy.entity.UserInfo; 4 import com.opensymphony.xwork2.ActionSupport; 5 6 /** 7 * 数据校验 8 * Created by CKW on 2017/3/12. 9 */ 10 public class UserInfoAction extends ActionSupport { 11 private UserInfo info; 12 13 @Override 14 public String execute() throws Exception { 15 return SUCCESS; 16 } 17 18 19 @Override 20 public void validate() { 21 if (info.getUname().length()==0){ 22 addFieldError("name","用户名不能为空"); 23 } 24 if (info.getUpwd().length()==0){ 25 addFieldError("pwd","密码不能为空"); 26 } 27 } 28 29 30 31 public void validateRegist(){ 32 if (info.getUname().length()<6||info.getUname().length()>15){ 33 addFieldError("name","用户名长度必须在6~15之间"); 34 } 35 if (info.getUpwd().length()<6||info.getUpwd().length()>12){ 36 addFieldError("name","用密码长度必须在6~12之间"); 37 } 38 } 39 40 public String regist(){ 41 return SUCCESS; 42 } 43 44 45 public UserInfo getInfo() { 46 return info; 47 } 48 49 public void setInfo(UserInfo info) { 50 this.info = info; 51 } 52 }
步骤2:创建struts.xml文件,引用ValidateXxxAction类(这里加多了一个method属性,用来指定实现的方法)
<action name="validateXxx" class="cn.happy.action.UserInfoAction" method="regist"> <result name="success">/form/success.jsp</result> <result name="input">/form/login.jsp</result> </action>
步骤3.准备前段注册页面login.jsp和成功页面success.jsp
4、用struts2的验证框架实现数据校验(这里将不再Action中进行数据校验,而是在cn.happy.action下创建一个ActionName-validation.xml的文件,在这个文件中进行数据校验)
① 为什么要用验证框架:
当验证规则比较复杂时,Action类的代码将变得很繁琐,假如我们要对电话号码的格式进行验证,是非常麻烦的
②验证框架的优点:
Struts2中内置了一个验证框架,将常用的验证规则进行了编码实现,使用验证框架时,用户无需再进行编码,只要在外部配置文件中指定某个字段需要进行的验证类型,并提供出错误信息即可,从而大大减轻了开发者的负担,提高开发效率
③命名规范:
1、文件的命名规则:
ActionName-validation.xml,ActionName为需要校验的Action类名,如:UserAction-validation.xml
2、文件存放路径:
该文件与Action类的class文件位于同一个路径下
3、文件格式:包括如下3个配置元素
<field>: 为每一个需要校验的字段添加一个验证元素<field>,name属性表示要校验的字段名。
<field-validator>: 使用该元素来指定校验规则,type属性为校验规则名
<message>: 使用该元素来指定校验出错时要显示的标签,key属性指向资源文件中的标签名
步骤1:在Web项目的cn.ckw.action下创建一个ValidateXxxAction(UserInfo为用户实体,其中有uname和upwd属性,并且封装)
1 package cn.ckw.entity; 2 3 /** 4 * Created by CKW on 2017/3/12. 5 */ 6 public class UserInfo { 7 private String uname; 8 private String upwd; 9 10 public String getUname() { 11 return uname; 12 } 13 14 public void setUname(String uname) { 15 this.uname = uname; 16 } 17 18 public String getUpwd() { 19 return upwd; 20 } 21 22 public void setUpwd(String upwd) { 23 this.upwd = upwd; 24 } 25 }
步骤2.在cn.ckw.action下创建UserInfoAction-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"> <message>密码不能为空</message> </field-validator> </field> <!-- 验证电话号码 --> <field name="info.phone"> <field-validator type="requiredstring"> <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>
步骤3.创建struts.xml
<action name="regist" class="cn.ckw.action.UserInfoAction"> <result name="success">/form/success.jsp</result> <result name="input">/form/login.jsp</result> </action>
步骤4.准备前段注册页面login.jsp和成功页面success.jsp