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 ...
随机推荐
- PowerDesigner概念(概念数据模型概述)
- HTML和CSS查缺补漏
margin的问题: 1.margin-top向上传递 解决:1.父元素border边框,2.父元素使用overflow:hidden 3.为父元素或者子元素声明绝对定位,4.为父元素或者子元素声明浮 ...
- [Dababase - MySQL- Linux] 数据库安装位置
数据库安装最好是安装在 usr/local/ 里面,因为默认的很多东西都是指向这个文件夹中的.
- python爬取某站磁力链
不同磁力链网站网页内容都不同,需要定制 1,并发爬取 并发爬取后,好像一会就被封了 import requests from lxml import etree import re from conc ...
- 20190323——HeadFirestPython学习之异常处理
man=[] other=[] try: data=open('sketch.txt') for each_line in data: try: (role,line_spoken)=each_lin ...
- fiddler安装及mock数据
1,fiddler安装,解决无法抓到https问题 可用本机的火狐浏览器测试,不行,就fiddler生成证书,拷到火狐里 在firefox中,选项->进入配置界面:高级-> 证书 -> ...
- Oracle扩展的统计信息
我们在收集列的统计信息与直方图时,往往都是对某一列的收集.当谓词使用多个相关列时,会导致约束条件的冗余.这几个相关的列也被称作关联列.出现这种情况时,查询优化器也会做出不准确的判断.所以我们必须对这些 ...
- JAVA写接口傻瓜(%)教程(五)
今天主要说一下在URL 中使用?传值的问题.在显式的使用get方法获取特点数据时,一般会通过?传递参数值,sevlert根据参数在数据库中对应的查找内容.所以,SQL语句需要拼接,要加上后面的参数.参 ...
- 采用梯度下降优化器(Gradient Descent optimizer)结合禁忌搜索(Tabu Search)求解矩阵的全部特征值和特征向量
[前言] 对于矩阵(Matrix)的特征值(Eigens)求解,采用数值分析(Number Analysis)的方法有一些,我熟知的是针对实对称矩阵(Real Symmetric Matrix)的特征 ...
- vue-cli脚手架build目录中的webpack.prod.conf.js配置文件
// 下面是引入nodejs的路径模块 var path = require('path') // 下面是utils工具配置文件,主要用来处理css类文件的loader var utils = req ...