概述

  在提交表单数据时,如果数据需要保存到数据库,空输入等可能会引发一些异常,为了避免引起用户的输入引起底层异常,通常在进行业务逻辑操作之前,先执行基本的数据校验。

  下面通过四种方式来阐述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的数据校验工作方式,它需要经过下面几个步骤:

  1. 通过转换器将请求参数转换成相应的Bean属性;
  2. 判断转换过程是否出现异常。如果有,则将其保存到ActionContext中,conversionError拦截器再封装为fieldError;如果没有,进行下一步;
  3. 通过反射(Reflection)来调用validateXxx()方法(其中,Xxx表示Action的方法名);
  4. 调用validate()方法;
  5. 如果经过上述步骤没有出现fieldError,则调用Action方法;如果有,则会跳过Action方法,通过国际化将fieldError输出到页面。

不喜欢看文字的朋友,可以参考下面的图1。

看到这里可能大家会疑问:“这么多地方可以校验表单数据,到底我应该在那里做呢?”有选择是好事,但抉择的过程往往是痛苦的,往往让人不知所措。如果大家参照以下几点建议,相信会比较容易地做出正确的抉择。

    1. 如果需要转换的数据,通常做法在转换的时候做格式的校验,在Action中的校验方法中校验取值。假如用户填错了格式,我们可以通过在资源文件配置invalid.fieldvalue.xxx(xxx为属性名)来提示用户正确的格式,不同的阶段出错显示不同的信息。具体做法请参考上面的例子;
    2. 至于用validate()还是validateXxx(),我推荐使用validate()。原因是validateXxx()使用了反射,相对来说性能稍差,而validate()则是通过接口com.opensymphony.xwork2.Validateable调用。当然如果你的表单数据取值是取决于特定Action方法,则应该使用validateXxx()。

struts2之数据校验的更多相关文章

  1. 使用Struts2实现数据校验

    使用Struts2实现数据校验 为什么需要数据校验呢?答案很简单,假如当你登录想要京东,这时就需要数据校验了如果不输入用户名的话,那么就不会登陆成功,并且会提示出"请输入用户名"的 ...

  2. (转)struts2:数据校验,通过XWork校验框架实现(validation.xml)

    转载自:http://www.cnblogs.com/nayitian/p/3475661.html struts2:数据校验,通过XWork校验框架实现(validation.xml)   根据输入 ...

  3. struts2:数据校验,通过XWork校验框架实现(validation.xml)

    根据输入校验的处理场所的不同,可以将输入校验分为客户端校验和服务器端校验两种.服务器端验证目前有两种方式: 第一种: 参考:struts2:数据校验,通过Action中的validate()方法实现校 ...

  4. struts2:数据校验,通过Action中的validate()方法实现校验,图解

    根据输入校验的处理场所的不同,可以将输入校验分为客户端校验和服务器端校验两种.服务器端验证目前有两种方式: 第一种 Struts2中提供了一个com.opensymphony.xwork2.Valid ...

  5. struts2:数据校验,通过Action中的validate()方法实现校验(续:多业务方法时的不同验证处理)

    前文:struts2:数据校验,通过Action中的validate()方法实现校验,图解 如果定义的Action中存在多个逻辑处理方法,且不同的处理逻辑可能需要不同的校验规则,在这种情况下,就需要通 ...

  6. Struts2(五)数据校验

    一.概述 在提交表单数据时,如果数据需要保存到数据库,空输入等可能会引发一些异常,为了避免引起用户的输入引起底层异常,通常在进行业务逻辑操作之前,先执行基本的数据校验. 下面通过两种方式来阐述Stru ...

  7. Struts2学习笔记(九)——数据校验

    Struts2的数据校验属于服务器端校验,Struts2 支持校验方式 : 手动校验(代码校验) :在服务器端通过编写java代码,完成数据校验 自动校验(配置校验) :XML配置校验(主流) 和 注 ...

  8. Struts2中validate数据校验的两种常用方法

    本文主要介绍Struts2中validate数据校验的两种方法及Struts2常用校验器.  1.Action中的validate()方法 Struts2提供了一个Validateable接口,这个接 ...

  9. Struts2学习第三天——保存登陆信息及数据校验

    在JSP中服务器端保存数据的作用域通常有request.session.application,它们对应的Servlet API分别是HttpServletRquerst.HttpSession.Se ...

随机推荐

  1. ELK6.6.0+filebeat6.6.0部署

    elastic不能用root用户去启动,否则会报错,所以创建elastic用户ES集群部署 1.创建elastic用户 $ useradd elastic $ passwd elastic 2..部署 ...

  2. threejs 草场足球运动视角(三)

    这次要模拟的场景如下图:就是在绿草地上足球的运动,并且视角会随着足球的运动发生变化,同时整个草地的视角也会旋转. 接下来,我们就对各个元素进行分析: 1,草地 用PlaneGeometry在三维空间里 ...

  3. python yaml用法详解

    YAML是一种直观的能够被电脑识别的的数据序列化格式,容易被人类阅读,并且容易和脚本语言交互.YAML类似于XML,但是语法比XML简单得多,对于转化成数组或可以hash的数据时是很简单有效的. Py ...

  4. pdfmake导出页眉页脚问题

    最近做项目中遇到一个导出pdf的功能,我用的是pdfmake插件 pdf使用参考 https://blog.csdn.net/qq_24380167/article/details/78735642 ...

  5. 用 jupyter notebook 打开 oui.txt 文件出现的问题及解决方案

    问题背景:下载了2018 IEEE 最新的 oui.txt 文件.里面包含了 设备 MAC 地址的前六位对应的厂商.要做的工作是,将海量设备的 MAC 地址与 oui.txt 文件的信息比对,统计出 ...

  6. Java8:Lambda表达式增强版Comparator和排序

    1.概述 在这篇教程里,我们将要去了解下即将到来的JDK 8(译注,现在JDK 8已经发布了)中的Lambda表达式——特别是怎样使用它来编写Comparator和对集合(Collection)进行排 ...

  7. mongo学习笔记2--索引及表设计

    -背景: 鉴于我们使用mongo作为数据库,期间少不了需要添加索引和对业务表进行设计.因此以下我对mongo索引及表设计原则做了一些分享.希望对大家有用,如有错误还望指正~ MongDB的索引类型简介 ...

  8. 九度1456胜利大逃亡【BFS】

    时间限制:1 秒 内存限制:128 兆 特殊判题:否 提交:4432 解决:1616 题目描述: Ignatius被魔王抓走了,有一天魔王出差去了,这可是Ignatius逃亡的好机会.魔王住在一个城堡 ...

  9. 织梦默认编辑器换成kindEditor实操教程

    织梦默认编辑是CKeditor,要想换成kindEditor编辑器,按如下步骤操作. 先看效果图: 首先下载打包好的 kindEditor_for_dedeCMS.ZIP,下载地址:https://d ...

  10. MVC,MVP和MVVM三种开发模式

    MVC: mvc模式:意思是软件可分为三部分: 视图(View):用户页面 控制器(Controller):控制器 模型(Model):模型 通讯方式: 1.View 传送指令到Controller ...