struts2之数据校验
概述
在提交表单数据时,如果数据需要保存到数据库,空输入等可能会引发一些异常,为了避免引起用户的输入引起底层异常,通常在进行业务逻辑操作之前,先执行基本的数据校验。
下面通过四种方式来阐述Struts 2的数据校验功能。
校验前准备工作
1.创建实体类
public class UserInfo {
private String uname;
private String upwd;
private String repwd;
public String getUname() {
return uname;
}
public void setUname(String uname) {
this.uname = uname;
}
public String getUpwd() {
return upwd;
}
public void setUpwd(String upwd) {
this.upwd = upwd;
}
public String getRepwd() {
return repwd;
}
public void setRepwd(String repwd) {
this.repwd = repwd;
}
}
2.创建Action
public class LoginAction extends ActionSupport {
private UserInfo info;
@Override
public String execute() throws Exception {
return SUCCESS;
}
public UserInfo getInfo() {
return info;
}
public void setInfo(UserInfo info) {
this.info = info;
}
}
3.jsp页面
<h1>用户注册</h1>
<s:fielderror></s:fielderror>
<s:form action="aaaaa" method="POST">
<s:textarea label="用户名" name="info.uname"/><br>
<s:password label="密码" name="info.upwd"/><br>
<s:password label="确认密码" name="info.repwd"/><br>
<s:submit value="注册"/>
一 用execute()实现校验
@Override
public String execute() throws Exception {
if (info.getUname().length()==){
addFieldError("uname","用户名不能为空");
}
if (info.getUpwd().length()==){
addFieldError("upwd","密码不能为空");
}
if(!info.getRepwd().equals(info.getUpwd())){
addFieldError("repwd","两次输入密码不一致");
}
if(this.hasFieldErrors()){
return INPUT;
}
return SUCCESS;
}
struts.xml配置
<!--使用execute()方法实现数据校验-->
<action name="loginAction" class="cn.happy.action.LoginAction">
<result name="input">login.jsp</result>
<result name="success">sucess.jsp</result>
</action>
二.使用validate()实现数据校验
@Override
public void validate() {
if (info.getUname().length()==){
addFieldError("uname","用户名不能为空");
}
if (info.getUpwd().length()==){
addFieldError("upwd","密码不能为空");
}
if(!info.getRepwd().equals(info.getUpwd())){
addFieldError("repwd","两次输入密码不一致");
}
}
struts.xml配置
<!--使用validate()实现数据校验-->
<action name="loginAction" class="cn.happy.action.LoginAction">
<result name="input">login.jsp</result>
<result name="success">sucess.jsp</result>
</action>
三.使用validateXxx()方法实现数据校验
public void validateRegist(){
if(info.getUname().length()<||info.getUname().length()>){
addFieldError("uname","用户名长度在6-15位");
}
if(info.getUpwd().length()<){
addFieldError("upwd","密码要大于6位");
}
}
public String Regist(){
return SUCCESS;
}
public void validate() {
if (info.getUname().length()==){
addFieldError("uname","用户名不能为空");
}
if (info.getUpwd().length()==){
addFieldError("upwd","密码不能为空");
}
if(!info.getRepwd().equals(info.getUpwd())){
addFieldError("repwd","两次输入密码不一致");
}
}
struts.xml配置
配置action元素,指定Action由Regist()方法来进行请求的处理
<!--使用validateXxx()方法实现数据校验-->
<action name="loginAction" class="cn.happy.action.LoginAction" method="Regist">
<result name="input">login.jsp</result>
<result name="success">sucess.jsp</result>
</action>
四.使用框架验证
已有的校验器
Struts 2.0已经为您实现很多常用的校验了,以下在jar的default.xml中的注册的校验器。
< 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 ="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" />
</ validators >
使用校验框架既可以方便地实现表单数据校验,又能够将校验与Action分离,故我们应该尽可能使用校验框架。
1编写验证文件,验证文件要和验证的Action放在同一个包下,并且采用ClassName-validation.xml方式命名,其中ClassName表示Action的类名
LoginAction-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-15位-->
<field name="info.uname">
<field-validator type="requiredstring">
<param name="trim">true</param>
<message>用户名不能为空</message>
</field-validator>
<field-validator type="stringlength">
<param name="maxLength"></param>
<param name="minLength"></param>
<message>用户名长度必须在${minLength}和${maxLength}之间</message>
</field-validator>
</field> <!--验证密码不为空,长度不小于6-->
<field name="info.upwd">
<field-validator type="requiredstring">
<param name="trim">true</param>
<message>密码不能为空</message>
</field-validator>
<field-validator type="stringlength">
<param name="minLength"></param>
<message>密码长度应大于等于${minLength}</message>
</field-validator>
</field> <!--验证确认密码-->
<field name="info.repwd">
<field-validator type="fieldexpression">
<param name="expression">info.upwd==info.repwd</param>
<message>两次输入密码要相同</message>
</field-validator>
</field>
</validators>
struts.xml配置
<!--使用框架验证-->
<action name="aaaaa" class="cn.happy.action.LoginAction" >
<result name="input">login.jsp</result>
<result name="success">sucess.jsp</result>
</action>
上述的输出说明了Struts 2.0的数据校验工作方式,它需要经过下面几个步骤:
- 通过转换器将请求参数转换成相应的Bean属性;
- 判断转换过程是否出现异常。如果有,则将其保存到ActionContext中,conversionError拦截器再封装为fieldError;如果没有,进行下一步;
- 通过反射(Reflection)来调用validateXxx()方法(其中,Xxx表示Action的方法名);
- 调用validate()方法;
- 如果经过上述步骤没有出现fieldError,则调用Action方法;如果有,则会跳过Action方法,通过国际化将fieldError输出到页面。
不喜欢看文字的朋友,可以参考下面的图1。

看到这里可能大家会疑问:“这么多地方可以校验表单数据,到底我应该在那里做呢?”有选择是好事,但抉择的过程往往是痛苦的,往往让人不知所措。如果大家参照以下几点建议,相信会比较容易地做出正确的抉择。
- 如果需要转换的数据,通常做法在转换的时候做格式的校验,在Action中的校验方法中校验取值。假如用户填错了格式,我们可以通过在资源文件配置invalid.fieldvalue.xxx(xxx为属性名)来提示用户正确的格式,不同的阶段出错显示不同的信息。具体做法请参考上面的例子;
- 至于用validate()还是validateXxx(),我推荐使用validate()。原因是validateXxx()使用了反射,相对来说性能稍差,而validate()则是通过接口com.opensymphony.xwork2.Validateable调用。当然如果你的表单数据取值是取决于特定Action方法,则应该使用validateXxx()。
struts2之数据校验的更多相关文章
- 使用Struts2实现数据校验
使用Struts2实现数据校验 为什么需要数据校验呢?答案很简单,假如当你登录想要京东,这时就需要数据校验了如果不输入用户名的话,那么就不会登陆成功,并且会提示出"请输入用户名"的 ...
- (转)struts2:数据校验,通过XWork校验框架实现(validation.xml)
转载自:http://www.cnblogs.com/nayitian/p/3475661.html struts2:数据校验,通过XWork校验框架实现(validation.xml) 根据输入 ...
- struts2:数据校验,通过XWork校验框架实现(validation.xml)
根据输入校验的处理场所的不同,可以将输入校验分为客户端校验和服务器端校验两种.服务器端验证目前有两种方式: 第一种: 参考:struts2:数据校验,通过Action中的validate()方法实现校 ...
- struts2:数据校验,通过Action中的validate()方法实现校验,图解
根据输入校验的处理场所的不同,可以将输入校验分为客户端校验和服务器端校验两种.服务器端验证目前有两种方式: 第一种 Struts2中提供了一个com.opensymphony.xwork2.Valid ...
- struts2:数据校验,通过Action中的validate()方法实现校验(续:多业务方法时的不同验证处理)
前文:struts2:数据校验,通过Action中的validate()方法实现校验,图解 如果定义的Action中存在多个逻辑处理方法,且不同的处理逻辑可能需要不同的校验规则,在这种情况下,就需要通 ...
- Struts2(五)数据校验
一.概述 在提交表单数据时,如果数据需要保存到数据库,空输入等可能会引发一些异常,为了避免引起用户的输入引起底层异常,通常在进行业务逻辑操作之前,先执行基本的数据校验. 下面通过两种方式来阐述Stru ...
- Struts2学习笔记(九)——数据校验
Struts2的数据校验属于服务器端校验,Struts2 支持校验方式 : 手动校验(代码校验) :在服务器端通过编写java代码,完成数据校验 自动校验(配置校验) :XML配置校验(主流) 和 注 ...
- Struts2中validate数据校验的两种常用方法
本文主要介绍Struts2中validate数据校验的两种方法及Struts2常用校验器. 1.Action中的validate()方法 Struts2提供了一个Validateable接口,这个接 ...
- Struts2学习第三天——保存登陆信息及数据校验
在JSP中服务器端保存数据的作用域通常有request.session.application,它们对应的Servlet API分别是HttpServletRquerst.HttpSession.Se ...
随机推荐
- PHP工程师必备知识整理
一.http/https协议,tcp/ip协议,websocket,session,cookie 二.php:oop,thinkphp5,laravel 三.mysql.memcache.redis ...
- idea for Mac for循环快捷键
1.itar 生成array for代码块 for (int i = 0; i < array.length; i++) { = array[i]; } 2.itco 生成Collection迭 ...
- highcharts数据标签显示在柱状图里面解决办法
1.现象:当各项占比相同时,数据显示在柱状图里面 2.解决方法: 3.效果
- Jenkins部署的时候报错
拿了一个最简单的,好不容易maven开始跑了 最终给我报错了 [INFO] -------------------------------------------------------------- ...
- syncbackse操作
有4类操作,包括同步,备份,镜像和组 同步是前文件夹内和后文件夹内的文件同步,使得二者的所有文件保持一致,但是也可以修改不同类型文件的覆盖操作,如果左侧有文件123.txt,右侧无123.txt文件, ...
- DAY18 常用模块(二)
一.随机数:RANDOM 1.(0,1)小数:random.random() 2.[1,10]整数:random.randint(1,10) 3.[1,10)整数:random.randrang(1, ...
- CDH5.16.1集群新增节点
如果是全新安装集群的话,可以参考<Ubuntu 16.04上搭建CDH5.16.1集群> 下面是集群新增节点步骤: 1.已经存在一个集群,有两个节点 192.168.100.19 hado ...
- Pandas Series和DataFrame的基本概念
1,创建Series 1.1,通过iterable创建Series Series接收参数是Iterable,不能是Iterator pd.Series(Iterable) 可以多加一个index参数, ...
- spring boot2 kafka
一.软件版本 1.linux:centos6 2.zookeeper:zookeeper-3.4.1 3.kafka:kafka_2.12-2.2.0 4.jdk:1.8 5.instelliJ Id ...
- python3.7导入gevent模块报错的解决方案
最近更新了python解释器3.7 结果安装gevent,在导入gevent之后就报错了,错误信息如下 RuntimeWarning: greenlet.greenlet size changed, ...