在项目中,struts校验一般用哪种方式?xml?还是valdate()函数,还是直接自己写校验方法?并说明优劣。
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在项目中,struts校验一般用哪种方式?xml?还是valdate()函数,还是直接自己写校验方法?并说明优劣。相关的知识,希望对你有一定的参考价值。
一. 手动输入完成校验1.普通的处理方式:只需要在action中重写validate()方法
2.一个action对应多个逻辑处理方法:指定校验摸个特定方法的方式:
重写validateXxxx()方法。Eg:如果,只校验login方法,则只需重写validateLogin().
二. 输入校验流程:
1. 类型转换器负责对字符串的请求参数执行类型转换。并将这些值设置成Action的属性值。
2. 转换过程中若出现异常,则将异常信息保存到ActionContext中,conversionError拦截器将其封装到fieldError中。
3. 通过反射调用validateXxx()方法。
4. 调用validate().
5. 如果未出现异常,则转入用户请求的处理方法,如果出现异常,则转入inout视图所指定的视图资源(所以,对于验证的方法,必须要在配置文件中为其指定input)。
三. 基于验证框架的输入校验
1. 编写校验配置文件:命名规则:action类名-validatin.xml.
2. 一个action对应多个逻辑处理方法:指定校验摸个特定方法的方式:
action类名-name属性名-validatin.xml.(name属性名:在strtus配置文件中的)
3. 配置文件存放位置:放在与Action相同的文件夹内。
4. 验证规则:先加载action类名-validatin.xml,然后加载action类名-name属性名-validatin.xml文件。
5. 校验器的配置风格:两种:字段校验器,非字段校验器。
字段校验器配置格式:
<field name="被校验的字段">
<field-validator type="校验器名">
<!--此处需要为不同校验器指定数量不等的校验规则-->
<param name="参数名">参数值</param>
....................
<!--校验失败后的提示信息,其中key指定国际化信息的key-->
<message key="I18Nkey">校验失败后的提示信息</message>
<!--校验失败后的提示信息:建议用getText("I18Nkey"),否则可能出现Freemarker template Error-->
</field-vallidator>
<!-- 如果校验字段满足多个规则,下面可以配置多个校验器-->
</field>
非字段校验器配置格式:
<validator type="校验器名">
<param name="fieldName">需要被校验的字段</param>
<!--此处需要为不同校验器指定数量不等的校验规则-->
<param name="参数名">参数值</param>
<!--校验失败后的提示信息,其中key指定国际化信息的key-->
<message key="I18Nkey">校验失败后的提示信息</message>
<!--校验失败后的提示信息:建议用getText("I18Nkey"),否则可能出现Freemarker template Error-->
</validator>
非字段校验:先指定校验器:由谁来校验,来校验谁!
字段校验器:先指定校验的属性:我来校验谁,由谁来校验!
6. 校验器:struts2提供了大量的内置校验器:你可以在xwork-core-2.1.6.jar的com.opensymphony.xwork2.validator.validators下找到如下配置文件:default.xml.里面列出了所有的内置校验器。
----------------------------------------------------------
struts2表单验证里field-validator type值:
int 整数;
double 实数;
date 日期;
expression 两数的关系比较;
email Email地址;
url
visitor
conversion
regex 正则表达式验证;
required 是否为空;
requiredstring 必须字符;
stringlength 输入字符长度限制;
url web地址
visitor 访问
conversion 转换
-------------------------------------------------------------
<validators>
<!—必填校验器 -->
<validator name="required" class="com.opensymphony.xwork2.validator.validators.RequiredFieldValidator"/>
<!—必填字符串校验器-->
<validator name="requiredstring" class="com.opensymphony.xwork2.validator.validators.RequiredStringValidator"/>
<!-- 整数校验器 -->
<validator name="int" class="com.opensymphony.xwork2.validator.validators.IntRangeFieldValidator"/>
<!-- -->
<validator name="long" class="com.opensymphony.xwork2.validator.validators.LongRangeFieldValidator"/>
<validator name="short" class="com.opensymphony.xwork2.validator.validators.ShortRangeFieldValidator"/>
<validator name="double" class="com.opensymphony.xwork2.validator.validators.DoubleRangeFieldValidator"/>
<!-- 日期校验器 -->
<validator name="date" class="com.opensymphony.xwork2.validator.validators.DateRangeFieldValidator"/>
<!-- 表达式校验器 -->
<validator name="expression" class="com.opensymphony.xwork2.validator.validators.ExpressionValidator"/>
<!-- 字段表达式校验器 -->
<validator name="fieldexpression" class="com.opensymphony.xwork2.validator.validators.FieldExpressionValidator"/>
<!-- 邮件校验器 -->
<validator name="email" class="com.opensymphony.xwork2.validator.validators.EmailValidator"/>
<!-- 网址校验器 -->
<validator name="url" class="com.opensymphony.xwork2.validator.validators.URLValidator"/>
<validator name="visitor" class="com.opensymphony.xwork2.validator.validators.VisitorFieldValidator"/>
<!-- 转换器校验器 -->
<validator name="conversion" class="com.opensymphony.xwork2.validator.validators.ConversionErrorFieldValidator"/>
<!-- 字符串长度校验器 -->
<validator name="stringlength" class="com.opensymphony.xwork2.validator.validators.StringLengthFieldValidator"/>
<!-- 正则表达式校验器 -->
<validator name="regex" class="com.opensymphony.xwork2.validator.validators.RegexFieldValidator"/>
<validator name="conditionalvisitor" class="com.opensymphony.xwork2.validator.validators.ConditionalVisitorFieldValidator"/>
</validators>
这些校验器已经可以满足大多数的验证需求,如果还需要特殊的要求,建议直接采用java代码搞定,除非你有很多地方都要用到,此时你可以自定义一个校验器。
四. 校验器的执行顺序
1. 所有非字段校验风格的校验器优先于字段校验风格的校验器;
2. 所有非字段校验风格的校验器中,排在前面的会先执行;
3. 所有字段校验风格的校验器,排在前面的会先执行;
五. 校验器的短路原则
1. 所有非字段检验器时最优先执行的,如果某个非字段校验器校验失败了,则该字段上的所有字段校验器都不会获得校验机会;
2. 非字段校验校验失败,不会阻止其他非字段校验执行;
3. 如果一个字段校验器校验失败后,则该字段下且排在该校验失败后的检验器之后的其他字段校验器不会获得校验机会;
4. 字段校验器永远不会阻止非字段校验器的执行!
六. 短路校验器
短路校验器:只需在<validator>或<filed-validator>元素中添加short-circuit=”true”属性。
注:在struts2.1.6版本,已经支持客户端的短路校验。
七. 客户端的校验:
在<s:form>中添加validate=”true”.
Struts2提供了客户端校验与服务端校验。这里只是做个简易的总结。
1.)服务端校验:
当程序流程进入到Action类,并经历了struts2的类型转换阶段后。接着进入struts2的输入校验阶段。
struts2的输入校验可自己编码进行校验,也可通过有规则命名的配置文件进行校验。
1.1)编码校验:
在Action类里重写父类的validate()方法即可。
public void validate()
if(null == username || "".equals(username))
this.addFieldError("username","username should not be empty !");
else if(username.length() < 6 || username.length() > 12)
this.addFieldError("username","username should be between 6 and 12 !");
if(null == password || "".equals(password ))
this.addFieldError("password ","password should not be empty !");
else if(password .length() < 6 || password .length() > 12)
this.addFieldError("password ","password should be between 6 and 12 !");
在上面的validate方法中,一旦发现校验失败,就把失败提示通过addFieldError方法添加到系统的fieldError中。校验完毕后,若系统的fieldError不为空,则自动转到input视图对应的JSP页面中输出错误提示,这与类型转换失败后的处理是完全一样的。
为了在input视图中对应的JSP页面输出错误提示,应该在该页面中增加如下代码:
<!-- 输入类型转换失败提示和校验失败提示 -->
<s:fielderror/>
这里不能忽略另外种情况:
Struts2的Action类里可以包含多个处理逻辑,不同的处理逻辑对应不同的方法。即Struts2的Action类里定义了几个类似于execute的方法,只是方法名不同。而重写validate方法无法知道需要校验的是哪个处理逻辑。实际上重写validate方法会校验所有的处理逻辑。
为了校验指定处理逻辑,需提供一个validateXxx()方法,其中xxx为Action对应的处理逻辑方法。
例如Action类里有个login()逻辑方法,那么对应的校验方法validateLogin()方法。
但之后还是会调用validate()进行校验,因此此时validate()没必要写了,或者让validate()进行公共字段的校验。
1.2)配置文件校验
只需为Action指定一个校验文件即可。
在Action类所在的com.test.action包下建立LoginAction-validation.xml校验文件(格式:Action类名-validation.xml).
LoginAction-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">
<param name="trim">true</param>
<message>username should not be empty !</message>
</field-validator>
<field-validator type="stringlength">
<param name="minLength">6</param>
<param name="maxLength">12</param>
<message>username should be between $minLength and $maxLength!</message>
</field-validator>
</field>
<field name="password">
<field-validator type="requiredstring">
<param name="trim">true</param>
<message>password should not be empty !</message>
</field-validator>
<field-validator type="stringlength">
<param name="minLength">6</param>
<param name="maxLength">12</param>
<message>password should be between $minLength and $maxLength!</message>
</field-validator>
</field>
</validators>
每个<field.../>元素指定一个Action属性必须遵守的规则,该元素name属性指定了被校验的字段;如果该属性满足多个规则,则在该<field.../>下增多个<field-validator.../>。
每个<field-validator .../>指定一个校验规则,该元素的type属性指定校验器名称该元素可以包含多个<param .../>子元素,用户指定该校验器的参数;除外,每个<field-validator .../>元素都有一个必须的<message .../>元素,用户确定校验失败后的提示信息。
例子中只采用了"必填字符串校验器"和"字符串长度校验器"2个校验规则。
struts2貌似共提供了13个校验器:
required:必填校验器
requiredstring:必填字符串校验器
int:整数校验器
double:双精度浮点数校验器
date:日期校验器
expression:表达式校验器
fieldexpression:字段表达式校验器
email:电子邮件校验器
url:网址校验器
visitor:Visitor校验器
conversion:转换校验器
stringlength:字符串长度校验器
regex:正则表达式校验器
用法大部分雷同,用到的时候可自己google搜索。
配置文件校验肯定不输给编码校验的,自然也提供了对应于具体业务逻辑的校验规则文件的格式:
<Action类名-Action所包含的处理方法在struts.xml对应的name属性-validation.xml>
例:
<!-- 配置一个名为user的Action,对应的逻辑方法为UserAction的login方法-->
<action name="login" class="com.test.action.UserAction" method="login">
<result name="input">/login.jsp</result>
<result name="success">/index.jsp</result>
</action>
则此逻辑方法对应的校验规则文件为:
UserAction-login-validation.xml
与编码校验一样,校验错误信息会添加到系统的fieldError中,校验完毕后若FieldError不为空。则进入到input视图对应的JSP。在<fieldError/>处输出错误提示。
提醒:没记错的话。与编码校验不同的是校验顺序,配置文件校验方式下,
先UserAction-validation.xml,再UserAction-login-validation.xml,
因此若是只针login()逻辑进行输入校验的话,那UserAction-validation.xml没必要写了,或让其进行公共字段的校验
2)客户端校验
增加客户端校验非常简单,将输入页面的表单元素改为使用struts2标签来生成表单,并且为该表单增加validate="true"属性即可。
上面是我经常看的参考文档,我个人觉得,二者的主要区别就在于灵活性与易维护。
xml相对来说,比较容易维护,对于需求经常变化的项目,比较适合。
valdate相对来说灵活性比较高,对于验证比较复杂的比较适合。追问
想问一下,在一个项目中你会用那种方式?你是直接用xml?还是valdate?还是直接在方法中写自己的校验方式?我的侧重点不是怎么用,而是用那种方式
追答哪种方式的话,强烈推荐XML!
追问能不能详细说明一下优劣,我刚才说的那三种之间对比的优劣
追答首先不推荐直接在方法中写校验方式,耦合度太高。
至于其他两个,我这么说吧。
valdate和xml的区别有些类似于自定义拦截器和struts自带的拦截器的区别。
struts已经为你写好了这么多校验方式,上面都写出来了,相信你也知道。这是比较省事,也不容易出错的方式。
而valdate等于是自己写,这种方式有些类似于自定义的拦截器,自己写的,可以满足一些特殊的需要,但是如果可以用struts自带的校验实现,又何必自己写呢?
一脸懵逼学习Struts数据校验,数据回显,模型驱动,防止表单重复提交。
1:Struts2表单数据校验:
(1)前台校验,也称之为客户端校验,主要是通过Javascript编程的方式进行数据的验证。
(2)后台校验,也称之为服务器校验,这里指的是使用Struts2通过xml配置的方式进行表单数据的校验。
(3)代码方式验证Action中所有的方法;代码方式验证Action中指定的方法;xml方式验证Action中所有的方法;xml方式验证Action中指定的方法;
2:代码方式验证Action中所有的方法(自己记得导jar包和我配置web.xml文件,自己脑补吧):
注册的jsp页面:
1 <%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8"%> 3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 4 <html> 5 <head> 6 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 7 <title>数据校验</title> 8 </head> 9 <body> 10 11 <form action="${pageContext.request.contextPath}/data_checkData.action" method="post"> 12 账号:<input type="text" name="user.name"/><br/> 13 密码:<input type="password" name="user.password"/><br/> 14 邮箱:<input type="text" name="user.email"/><br/> 15 生日:<input type="text" name="user.birthday"/><br/> 16 17 <input type="submit" value="注册"/> 18 <input type="reset" value="重置"/> 19 </form> 20 21 </body> 22 </html>
数据校验的Action类的实现:
1 package com.bie.lesson10; 2 3 import com.opensymphony.xwork2.ActionSupport; 4 5 /** 6 * @author Author:别先生 7 * @date Date:2017年9月24日 下午3:28:25 8 * 9 * 1:注意,如果想要用struts的数据校验功能,必须继承ActionSupport或者实现相关接口; 10 */ 11 public class CheckAction extends ActionSupport{ 12 13 /** 14 * 15 */ 16 private static final long serialVersionUID = 1L; 17 18 //封装请求数据 19 private User user; 20 public void setUser(User user) { 21 this.user = user; 22 } 23 public User getUser() { 24 return user; 25 } 26 27 //重写数据校验的功能 28 @Override 29 public void validate() { 30 //用户名非空校验 31 if(user.getName() == null || "".equals(user.getName())){ 32 //保存错误信息 33 super.addFieldError("name", "用户的账号不能为空。"); 34 } 35 //密码非空校验 36 if(user.getPassword() == null || "".equals(user.getPassword())){ 37 //保存错误信息 38 super.addFieldError("password", "用户的密码不能为空"); 39 } 40 //用户的邮箱校验 41 /*if(user.getEmail() == null || "".equals(user.getEmail())){ 42 //保存错误信息 43 super.addFieldError("email", "用户的邮箱不能为空"); 44 }*/ 45 //用户的生日不能为空 46 /*if(user.getBirthday() == null || "".equals(user.getBirthday())){ 47 //保存错误信息 48 super.addFieldError("birthday" , "用户的生日不能为空"); 49 }*/ 50 51 } 52 53 //业务方法 54 public String checkData(){ 55 56 System.out.println(user); 57 return SUCCESS; 58 } 59 60 }
struts2的配置xml文件:
1 <?xml version="1.0" encoding="UTF-8" ?> 2 <!DOCTYPE struts PUBLIC 3 "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" 4 "http://struts.apache.org/dtds/struts-2.0.dtd"> 5 6 <struts> 7 <package name="checkPackage" extends="struts-default"> 8 <action name="data_*" class="com.bie.lesson10.CheckAction" method="{1}"> 9 <result name="success">success2.jsp</result> 10 <result name="input">error.jsp</result> 11 </action> 12 13 </package> 14 15 </struts> 16
1 <?xml version="1.0" encoding="UTF-8" ?> 2 <!DOCTYPE struts PUBLIC 3 "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" 4 "http://struts.apache.org/dtds/struts-2.0.dtd"> 5 6 <struts> 7 <!-- struts在允许的时候会加载这个总配置文件:src/struts.xml --> 8 9 <!-- 全局配置 --> 10 <!-- 修改Struts的默认访问后缀 --> 11 <!-- <constant name="struts.action.extension" value="action,do,struts,"></constant> --> 12 <include file="constant.xml"></include> 13 14 <!-- 在总配置文件中引入其他所有的配置文件 --> 15 16 <!-- <include file="com/bie/lesson/helloStruts.xml"></include> --> 17 18 <!-- <include file="com/bie/lesson02/strutsAction.xml"></include> --> 19 20 <!-- <include file="com/bie/lesson03/strutsConfig.xml"></include> --> 21 22 <!-- <include file="com/bie/lesson04/strutsData.xml"></include> --> 23 24 <!-- <include file="com/bie/lesson05/strutsType.xml"></include> --> 25 26 <!-- <include file="com/bie/lesson06/strutsUpload.xml"></include> --> 27 28 <!-- <include file="com/bie/lesson07/strutsInterceptor.xml"></include> --> 29 30 <!-- <include file="com/bie/lesson08/action/strutsAdmin.xml"></include> --> 31 32 <!-- <include file="com/bie/lesson09/strutsOgnl.xml"></include> --> 33 34 <include file="com/bie/lesson10/strutsCheck.xml"></include> 35 36 37 38 39 </struts>
用户的实体类的内容:
1 package com.bie.lesson10; 2 3 import java.util.Date; 4 5 /** 6 * @author Author:别先生 7 * @date Date:2017年9月24日 下午3:59:21 8 * 9 * 10 */ 11 public class User { 12 13 private String name; 14 private String password; 15 private String email; 16 private Date birthday; 17 public String getName() { 18 return name; 19 } 20 public void setName(String name) { 21 this.name = name; 22 } 23 public String getPassword() { 24 return password; 25 } 26 public void setPassword(String password) { 27 this.password = password; 28 } 29 public String getEmail() { 30 return email; 31 } 32 public void setEmail(String email) { 33 this.email = email; 34 } 35 public Date getBirthday() { 36 return birthday; 37 } 38 public void setBirthday(Date birthday) { 39 this.birthday = birthday; 40 } 41 public User(String name, String password, String email, Date birthday) { 42 super(); 43 this.name = name; 44 this.password = password; 45 this.email = email; 46 this.birthday = birthday; 47 } 48 public User() { 49 super(); 50 } 51 52 53 }
成功的页面和失败的页面:
1 <%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8"%> 3 <%@ taglib prefix="s" uri="/struts-tags"%> 4 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 5 <html> 6 <head> 7 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 8 <title>struts2 hello </title> 9 </head> 10 <body> 11 12 <h1>成功注册</h1> 13 14 15 16 <!-- struts的调试标签:可以观测值栈数据 --> 17 <s:debug></s:debug> 18 </body> 19 </html>
1 <%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8"%> 3 <%@ taglib uri="/struts-tags" prefix="s"%> 4 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 5 <html> 6 <head> 7 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 8 <title>Insert title here</title> 9 </head> 10 <body> 11 12 <h1>错误的视图</h1> 13 <h1>错误的error</h1> 14 15 <!-- 查看struts框架在运行时期产生的所有错误信息 --> 16 <s:fielderror></s:fielderror> 17 </body> 18 </html>
3:代码方式验证Action中指定的方法(写验证方法命名规则,validate+要验证的方法名称,举例如下所示:);
1 package com.bie.lesson10; 2 3 import com.opensymphony.xwork2.ActionSupport; 4 5 /** 6 * @author Author:别先生 7 * @date Date:2017年9月24日 下午3:28:25 8 * 9 * 1:注意,如果想要用struts的数据校验功能,必须继承ActionSupport或者实现相关接口; 10 */ 11 public class CheckAction extends ActionSupport{ 12 13 /** 14 * 15 */ 16 private static final long serialVersionUID = 1L; 17 18 //封装请求数据 19 private User user; 20 public void setUser(User user) { 21 this.user = user; 22 } 23 public User getUser() { 24 return user; 25 } 26 27 //重写数据校验的功能 28 /*@Override 29 public void validate() { 30 //用户名非空校验 31 if(user.getName() == null || "".equals(user.getName())){ 32 //保存错误信息 33 super.addFieldError("name", "用户的账号不能为空。"); 34 } 35 //密码非空校验 36 if(user.getPassword() == null || "".equals(user.getPassword())){ 37 //保存错误信息 38 super.addFieldError("password", "用户的密码不能为空"); 39 } 40 //用户的邮箱校验 41 if(user.getEmail() == null || "".equals(user.getEmail())){ 42 //保存错误信息 43 super.addFieldError("email", "用户的邮箱不能为空"); 44 } 45 //用户的生日不能为空 46 if(user.getBirthday() == null || "".equals(user.getBirthday())){ 47 //保存错误信息 48 super.addFieldError("birthday" , "用户的生日不能为空"); 49 } 50 51 }*/ 52 53 54 public void validatecheckData() { 55 //用户名非空校验 56 if(user.getName() == null || "".equals(user.getName())){ 57 //保存错误信息 58 super.addFieldError("name", "用户的账号不能为空。"); 59 } 60 //密码非空校验 61 if(user.getPassword() == null || "".equals(user.getPassword())){ 62 //保存错误信息 63 super.addFieldError("password", "用户的密码不能为空"); 64 } 65 //用户的邮箱校验 66 /*if(user.getEmail() == null || "".equals(user.getEmail())){ 67 //保存错误信息 68 super.addFieldError("email", "用户的邮箱不能为空"); 69 }*/ 70 //用户的生日不能为空 71 /*if(user.getBirthday() == null || "".equals(user.getBirthday())){ 72 //保存错误信息 73 super.addFieldError("birthday" , "用户的生日不能为空"); 74 }*/ 75 76 } 77 78 //业务方法 79 public String checkData(){ 80 81 System.out.println(user); 82 return SUCCESS; 83 } 84 85 //用户列表的展示 86 public String list(){ 87 88 System.out.println("模拟是否验证"); 89 return "list"; 90 } 91 92 }
4:xml方式验证Action中所有的方法(代码验证比较繁琐,设计很多重复的验证逻辑,例如,非空验证,数值验证,email,日期等等,struts2对于常用的验证,进行了封装,即提供了验证器,验证指定额常用业务逻辑;);
4.1:Struts提供的验证器:xwork-core-2.3.16.3.jar ---》com.opensymphony.xwork2.validator.validators ---》default.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE validators PUBLIC "-//Apache Struts//XWork Validator Definition 1.0//EN" "http://struts.apache.org/dtds/xwork-validator-definition-1.0.dtd"> <!-- START SNIPPET: validators-default --> <validators> <validator name="required" class="com.opensymphony.xwork2.validator.validators.RequiredFieldValidator"/> <validator name="requiredstring" class="com.opensymphony.xwork2.validator.validators.RequiredStringValidator"/> <validator name="int" class="com.opensymphony.xwork2.validator.validators.IntRangeFieldValidator"/> <validator name="long" class="com.opensymphony.xwork2.validator.validators.LongRangeFieldValidator"/> <validator name="short" class="com.opensymphony.xwork2.validator.validators.ShortRangeFieldValidator"/> <validator name="double" class="com.opensymphony.xwork2.validator.validators.DoubleRangeFieldValidator"/> <validator name="date" class="com.opensymphony.xwork2.validator.validators.DateRangeFieldValidator"/> <validator name="expression" class="com.opensymphony.xwork2.validator.validators.ExpressionValidator"/> <validator name="fieldexpression" class="com.opensymphony.xwork2.validator.validators.FieldExpressionValidator"/> <validator name="email" class="com.opensymphony.xwork2.validator.validators.EmailValidator"/> <validator name="url" class="com.opensymphony.xwork2.validator.validators.URLValidator"/> <validator name="visitor" class="com.opensymphony.xwork2.validator.validators.VisitorFieldValidator"/> <validator name="conversion" class="com.opensymphony.xwork2.validator.validators.ConversionErrorFieldValidator"/> <validator name="stringlength" class="com.opensymphony.xwork2.validator.validators.StringLengthFieldValidator"/> <validator name="regex" class="com.opensymphony.xwork2.validator.validators.RegexFieldValidator"/> <validator name="conditionalvisitor" class="com.opensymphony.xwork2.validator.validators.ConditionalVisitorFieldValidator"/> </validators> <!-- END SNIPPET: validators-default -->
4.2:如何写xml,从而定义验证规则:
(a)xml文件名称语法:ActionClassName-validation.xml,注意,此xml需要与当前要验证的action在同一个目录;
(b)举例:CheckXmlAction-validation.xml,找到xwork-core-2.3.16.3.jar/xwork-validator-1.0.3.dtd复制一下dtd的头文件:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE validators PUBLIC "-//Apache Struts//XWork Validator 1.0.3//EN" "http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd">
1 package com.bie.lesson11; 2 3 import com.opensymphony.xwork2.ActionSupport; 4 5 /** 6 * @author Author:别先生 7 * @date Date:2017年9月24日 下午3:28:25 8 * 9 * 1:注意,如果想要用struts的数据校验功能,必须继承ActionSupport或者实现相关接口; 10 */ 11 public class CheckXmlAction extends ActionSupport{ 12 13 /** 14 * 15 */ 16 private static final long serialVersionUID = 1L; 17 18 //封装请求数据 19 private User user; 20 public void setUser(User user) { 21 this.user = user; 22 } 23 public User getUser() { 24 return user; 25 } 26 27 28 //业务方法 29 public String checkData(){ 30 31 System.out.println(user); 32 return SUCCESS; 33 } 34 35 /*//用户列表的展示 36 public String list(){ 37 38 System.out.println("模拟是否验证"); 39 return "list"; 40 }*/ 41 42 }
验证的xml配置,注意起名规则:
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE validators PUBLIC 3 "-//Apache Struts//XWork Validator 1.0.3//EN" 4 "http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd"> 5 <validators> 6 7 <!-- 验证的每一字段用field表示 --> 8 <field name="user.name"> 9 <!-- 指定使用的验证器 --> 10 <field-validator type="requiredstring"> 11 <!-- 验证失败的错误提示信息 --> 12 <message>用户名不能为空</message> 13 </field-validator> 14 </field> 15 16 <!-- 验证的每一字段用field表示 --> 17 <field name="user.password"> 18 <!-- 指定使用的验证器 --> 19 <field-validator type="requiredstring"> 20 <!-- 验证失败的错误提示信息 --> 21 <message>密码不能为空</message> 22 </field-validator> 23 24 <!-- 密码的长度校验 --> 25 <field-validator type="stringlength"> 26 <param name="minLength">6</param> 27 <param name="maxLength">10</param> 28 <message>密码长度必须6-10位</message> 29 </field-validator> 30 </field> 31 32 <!-- 验证日期和验证邮箱 --> 33 <field name="user.email"> 34 <field-validator type="email"> 35 <message>邮箱格式不正确</message> 36 </field-validator> 37 </field> 38 <field name="user.birthday"> 39 <field-validator type="date"> 40 <message>日期格式不正确</message> 41 </field-validator> 42 </field> 43 44 </validators> 45 46
5:xml方式验证Action中指定的方法(与上面xml验证方式大致相同,验证xml文件内容不变);
5.1:命名规则:语法,ActionClassName-ActionName-validation.xml,举例:CheckXmlAction-data_checkData-validation.xml即验证CheckXmlAction的checkData方法;
验证总结
代码验证:
重写validate() , 验证action所有方法
Validate方法名(), 验证指定“方法名”的方法
Xml:
验证所有方法: ActionClassName-validation.xml
验证指定方法: ActionClassName-actionName-validation.xml
代码验证:
比较灵活,可以满足所有的需求.
比较繁琐,要写重复的验证判断逻辑!
适合: 表单字段较少的情况用!
XML验证:
通用,但不够灵活; 可以验证特定简单的业务。
适合: 验证表单字段较多,可以大大简化代码!
(配置文件过多)
6:验证错误处理的三种方法,如果数据输入错误就依旧跳转到输入数据的界面,这点在struts.xml里面控制:
1 <?xml version="1.0" encoding="UTF-8" ?> 2 <!DOCTYPE struts PUBLIC 3 "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" 4 "http://struts.apache.org/dtds/struts-2.0.dtd"> 5 6 <struts> 7 <package name="checkXmlPackage" extends="struts-default"> 8 <!-- 注册失败跳转到注册页面,显示失败信息 --> 9 <global-results> 10 <result name="input">/dataXmlCheck.jsp</result> 11 </global-results> 12 13 <action name="data_*" class="com.bie.lesson11.CheckXmlAction" method="{1}"> 14 <result name="success">/success2.jsp</result> 15 <!-- <result name="input">/error.jsp</result> --> 16 <!-- <result name="list">success2.jsp</result> --> 17 </action> 18 19 </package> 20 21 </struts> 22
然后在输入数据的页面进行错误提示:
1 <%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8"%> 3 <%@ taglib prefix="s" uri="/struts-tags"%> 4 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 5 <html> 6 <head> 7 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 8 <title>数据校验</title> 9 10 <!-- 修改struts标签默认的样式: 不让换行 --> 11 <style type="text/css"> 12 ul{display: inline;} 13 ul li{display: inline;color: red;} 14 </style> 15 16 </head> 17 <body> 18 19 <!-- 显示的是Struts2在运行时期产生的所有错误 --> 20 <!-- 方式一 --> 21 <%-- <s:fielderror></s:fielderror> --%> 22 23 <%-- <s:fielderror fieldName="user.name"></s:fielderror> 24 <s:fielderror fieldName="user.password"></s:fielderror> 25 <s:fielderror fieldName="user.email"></s:fielderror> 26 <s:fielderror fieldName="user.birthday"></s:fielderror> --%> 27 28 <form action="${pageContext.request.contextPath}/data_checkXmlData.action" method="post"> 29 账号:<input type="text" name="user.name"/> 30 <!-- 方式二 --> 31 <s:fielderror fieldName="user.name"></s:fielderror><br/> 32 密码:<input type="password" name="user.password"/> 33 <s:fielderror fieldName="user.password"></s:fielderror><br/> 34 邮箱:<input type="text" name="user.email"/><br/> 35 <%-- <s:fielderror fieldName="user.email"></s:fielderror> --%> 36 生日:<input type="text" name="user.birthday"/><br/> 37 <%-- <s:fielderror fieldName="user.birthday"></s:fielderror> --%> 38 <input type="submit" value="注册"/> 39 <input type="reset" value="重置"/> 40 </form> 41 42 </body> 43 </html>
方式三(fielderror.ftl文件):
方式3: 修改标签定义的模板
找到fielderror标签定义的模板文件:
Struts-core.jar\template\simple\ fielderror.ftl
把修改后的fielderror.ftl文件,放到src/ template/ simple/ fielderror.ftl
这样标签显示的样式就修改了!
<#-- /* * $Id: fielderror.ftl 805635 2009-08-19 00:18:54Z musachy $ * * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ --> <#if fieldErrors??><#t/> <#assign eKeys = fieldErrors.keySet()><#t/> <#assign eKeysSize = eKeys.size()><#t/> <#assign doneStartUlTag=false><#t/> <#assign doneEndUlTag=false><#t/> <#assign haveMatchedErrorField=false><#t/> <#if (fieldErrorFieldNames?size > 0) ><#t/> <#list fieldErrorFieldNames as fieldErrorFieldName><#t/> <#list eKeys as eKey><#t/> <#if (eKey = fieldErrorFieldName)><#t/> <#assign haveMatchedErrorField=true><#t/> <#assign eValue = fieldErrors[fieldErrorFieldName]><#t/> <#if (haveMatchedErrorField && (!doneStartUlTag))><#t/> <#assign doneStartUlTag=true><#t/> </#if><#t/> <#list eValue as eEachValue><#t/> ${eEachValue} </#list><#t/> </#if><#t/> </#list><#t/> </#list><#t/> <#if (haveMatchedErrorField && (!doneEndUlTag))><#t/> <#assign doneEndUlTag=true><#t/> </#if><#t/> <#else><#t/> <#if (eKeysSize > 0)><#t/> <ul<#rt/> <#if parameters.cssClass??> class="${parameters.cssClass?html}"<#rt/> <#else> class="errorMessage"<#rt/> </#if> <#if parameters.cssStyle??> style="${parameters.cssStyle?html}"<#rt/> </#if> > <#list eKeys as eKey><#t/> <#assign eValue = fieldErrors[eKey]><#t/> <#list eValue as eEachValue><#t/> <li><span><#if parameters.escape>${eEachValue!?html}<#else>${eEachValue!}</#if></span></li> </#list><#t/> </#list><#t/> </ul> </#if><#t/> </#if><#t/> </#if><#t/>
以上是关于在项目中,struts校验一般用哪种方式?xml?还是valdate()函数,还是直接自己写校验方法?并说明优劣。的主要内容,如果未能解决你的问题,请参考以下文章
二十一 Struts的数据校验两种方式:手动编码和xml校验
一脸懵逼学习Struts数据校验,数据回显,模型驱动,防止表单重复提交。