struts2注解方式的验证
struts2的验证分为分编程式验证、声明式验证、注解式验证。因现在的人越来越懒,都追求零配置,所以本文介绍下注解式验证。
一.hello world
参考javaeye的这篇文章,按着做一次,起码有个初步印象
http://www.javaeye.com/wiki/taojintianxiastruts2/1650-17-7-note-the-use-of-struts2-validation
Validation使用名字叫做validator的Intercepter,在默认情况下,struts2已经定义了这个Intercepter,我们在不加声明的情况下就可以使用Validation了
如果是使用默认的拦截器,就已经开启了验证框架的了,直接用。
开启验证的方式是(官网):
打开验证
默认拦截器堆栈“defaultStack”已经打开验证。在创建自己的拦截器堆栈一定要包括两对validation和workflow拦截器。来自struts-default.xml:
<interceptor-stack name="defaultStack">
   ...
   <interceptor-ref name="validation">
      <param name="excludeMethods">input,back,cancel,browse</param>
   </interceptor-ref>
   <interceptor-ref name="workflow">
      <param name="excludeMethods">input,back,cancel,browse</param>
   </interceptor-ref>
</interceptor-stack>
从版本2.0.4开始,Struts为XWork的com.opensymphony.xwork2.validator.ValidationInterceptor 拦截器提供了扩展。
<interceptor name="validation" class="org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor"/>
这个拦截器允许我们通过使用@org.apache.struts2.interceptor.validation.SkipValidation action方法的注解来关闭特定方法的验证。
即自定义的拦截器栈需要加上上述标红的部分,这样才能开启验证,验证才会起作用
一般有两种注解法
1.直接注在get方法上面,像这种
@RequiredStringValidator(message="Supply password")
public String getPassword() {
return password;
}
2.注在方法上面,like
@Validations(
requiredStrings={
@RequiredStringValidator(fieldName="username",message="用户名不能为空!"),
@RequiredStringValidator(fieldName="telNum",message="电话号码不能为空!")
},
regexFields={@RegexFieldValidator(fieldName="telNum",expression="^(\\+86|0|1)\\d{10,11}$",
message="电话号码格式不正确!")}
)
@RequiredStringValidator代表进行字符串非空验证,fildName是指需要验证的参数名称,message为验证失败后显示的信息。
但无论是哪种注解,默认情况下都是对这个action的所有方法进行验证。
如果验证不通过,将跳回result name 为 “input”的视图。错误信息是在 FieldError 里, 当然我们也可以用@InputConfig(resultName=“xxx”),设置验证不通过跳回的视图.
@InputConfig(resultName=“xxx”)要配置在action类的方法上,用来更改当前方法如果验证出错的调回视图,可以更改默认的input,注意@InputConfig(resultName=“xxx”)只会对当前action配置的当前方法起作用,无论开不开启方法级别的校验都是只对当前action配置的当前方法起作用。
显示错误的方式:<s:fielderror fieldName="验证的类的成员变量名"></s:fielderror> (
<s:fielderror /><!-- 不写fieldName属性显示所有的fielderror错误 -->
)或者使用el来取值栈中的错误
@SkipValidation 如果某个方法不想验证,那么就可以用这个标签了
默认配置下,验证框架是对所有方法都进行了验证,其实我们可以对不需要验证的方法上写了@SkipValidation注解。。但这样又出现了问题,若有两个方法都需要进行验证但参数又不相同,那怎么办呢?那就是开启方法级别的验证啦
注意:默认情况下配置的@Validations是对当前action类中的所有方法起作用的,不论它具体是配置在哪个方法上面
二.开启方法级别的验证
开启方法级别的验证只需要配置struts2的validation interceptor的一个参数validateAnnotatedMethodOnly为true即可。 默认情况下struts2的配置中没有配置这个参数,所以需要我们自己重新配置一下defaultStack:
<package name="yybean-default" extends="struts-default" abstract="true">
<interceptors>
<interceptor-stack name="defaultStack">
<interceptor-ref name="exception"/>
<interceptor-ref name="alias"/>
<interceptor-ref name="servletConfig"/>
<interceptor-ref name="prepare"/>
<interceptor-ref name="i18n"/>
<interceptor-ref name="chain"/>
<interceptor-ref name="debugging"/>
<interceptor-ref name="profiling"/>
<interceptor-ref name="scopedModelDriven"/>
<interceptor-ref name="modelDriven"/>
<interceptor-ref name="fileUpload"/>
<interceptor-ref name="checkbox"/>
<interceptor-ref name="staticParams"/>
<interceptor-ref name="params">
<param name="excludeParams">dojo\..*</param>
</interceptor-ref>
<interceptor-ref name="conversionError"/>
<interceptor-ref name="validation">
<param name="excludeMethods">input,back,cancel,browse</param>
<param name="validateAnnotatedMethodOnly">true</param>
</interceptor-ref>
<interceptor-ref name="workflow">
<param name="excludeMethods">input,back,cancel,browse</param>
</interceptor-ref>
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="defaultStack"/>
</package>
其中重点就是
<!--开启方法级别的验证-->
<interceptor-ref name="validation">
<param name="excludeMethods">input,back,cancel,browse</param>
<param name="validateAnnotatedMethodOnly">true</param>
</interceptor-ref>
还有excludeMethods,这些方法都是不会执行验证的。
开启方法级别的验证后,对于不需要进行验证的方法没必要使用@SkipValidation注解。
现在是当前方法只会使用当前方法上面配置的@Validations,不在是任何方法上配置的@Validations对所有方法都起作用了。
备注:
Annotation方式校验: Struts2提供了注解的方式校验
  1) @Validation 指明这个类或者接口将使用基于注解的校验。Struts2.1中已被标识为过时。(即现在已经不需要加这个了)
  2) @Validations() 在同一个方法上要使用多个注解校验时。
  3) @SkipValidation 指定某个方法不需要校验。否则所有方法都会使用校验。也可以在检验拦截器中使用validateAnnotatedMethodOnly
举例:
/**
* 保存
*
* @return
* @throws Exception
*/
@Validations(requiredStrings = { @RequiredStringValidator(fieldName = "brand.name", message = "品牌名称不允许为空!"),
@RequiredStringValidator(fieldName = "brand.code", message = "品牌唯一编码不允许为空!") }, urls = { @UrlValidator(fieldName = "brand.url", message = "网址格式错误!") }, requiredFields = { @RequiredFieldValidator(fieldName = "brand.displayOrder", message = "排序不允许为空!") }, intRangeFields = { @IntRangeFieldValidator(fieldName = "brand.displayOrder", min = "0", message = "排序必须为零或正整数!") })
@InputConfig(resultName = "error")
public String save() throws Exception {
Brand temp = brandService.getByField("code", brand.getCode());
if (temp != null) {
this.addActionError("保存失败!原因:品牌代码已存在!");
return ERROR;
} temp = brandService.getByField("name", brand.getName());
if (temp != null) {
this.addActionError("保存失败!原因:品牌名称已存在!");
return ERROR;
} if (logo != null) {
// validateImageUploadRules();
String logImage = brandService.buildLogoImg(logo, logoContentType, logoFileName);
brand.setLogo(logImage);
}
brand.setDeleted(false);
brand.setDpTransFlag("N");
brandService.save(brand);
redirectionUrl = "brand!list.action";
return SUCCESS;
}
三.常见的注解
| 
 注解  | 
 相应的XML  | 
 描述  | 
| 
 RequiredFieldValidator  | 
 required  | 
 确保该属性不是null  | 
| 
 RequiredStringValidator  | 
 requiredstring  | 
 确保一个String类型的属性不是null,并且非空  | 
| 
 StringLengthFieldValidator  | 
 stringlength  | 
 检查String的长度范围是否与所期望的一致  | 
| 
 IntRangeFieldValidator  | 
 int  | 
 检查int类型的数字是否超出所期望的大小范围  | 
| 
 DoubleRangeFieldValidator  | 
 double  | 
 检查double类型的数字是否超出所期望的大小范围  | 
| 
 DateRangeFieldValidator  | 
 date  | 
 检查date类型的属性是否超出所期望的范围  | 
| 
 ExpressionValidator  | 
 expression  | 
 使用值栈来估算一个ONGL表达式(必须要返回boolean值)  | 
| 
 FieldExpressionValidator  | 
 fieldexpression  | 
 使用OGNL表达式来验证字段  | 
| 
 EmailValidator  | 
 | 
 保证该属性是一个有效的email地址  | 
| 
 UrlValidator  | 
 url  | 
 保证该属性是一个有效的URL  | 
| 
 ConversionErrorFieldValidator  | 
 conversion  | 
 检查该属性是否有转换错误  | 
| 
 RegexFieldValidator  | 
 regex  | 
 检查该属性的值是否与某个正则表达式相匹配。  | 
| 
 VisitorFieldValidator  | 
 visitor  | 
 把对字段的验证动作推迟到这个字段所属的类的特有的另一个验证文件中执行。  | 
| 
 StringRegexValidator  | 
 n/a  | 
 检查字符串是否与正则表达式匹配  | 
| 
 CustomValidator  | 
 n/a  | 
 表示使用了一个自定义的validator  | 
| 
 ValidationParameter  | 
 n/a  | 
 作为CustomValidator 注解的一个参数  | 
| 
 Validation  | 
 n/a  | 
 表示该类使用了基于注解的验证——这个注解可以与接口或类一起使用  | 
| 
 Validations  | 
 n/a  | 
 用来对一个属性或类组合使用多种验证  | 
详解:
举例:@Validations(requiredStrings = { @RequiredStringValidator(fieldName = "brand.name", message = "品牌名称不允许为空!") }, urls = { @UrlValidator(fieldName = "brand.url", message = "网址格式错误!") }, requiredFields = { @RequiredFieldValidator(fieldName = "brand.displayOrder", message = "排序不允许为空!") }, intRangeFields = { @IntRangeFieldValidator(fieldName = "brand.displayOrder", min = "0", message = "排序必须为零或正整数!") })
举例:
@Validations(intRangeFields =
            { @IntRangeFieldValidator(fieldName = "age", min = "6", max = "10", message = "age must be between ${min} and ${max}")}
)
@IntRangeFieldValidator:必须是整数而且范围在min 和max之间,包括min和max
@RequiredStringValidator:确保一个String类型的属性不是null,并且非空(非空即""),注意:如果都是提交的时候表单都是空格,也是空。
@UrlValidator:不起作用
@RequiredFieldValidator:确保该属性不是null
struts2注解方式的验证的更多相关文章
- struts2  注解方式
		
struts2扫描方法: 扫描其位于包的命名注解的类 “struts, struts2, action 或 actions“. 接着,扫描相匹配下列任一条件的文件: 实例了 com.opensymph ...
 - Spring MVC 数据验证——validate注解方式
		
1.说明 学习注解方式之前,应该先学习一下编码方式的spring注入.这样便于理解验证框架的工作原理.在出错的时候,也能更好的解决这个问题.所以本次博客教程也是基于编码方式.仅仅是在原来的基础加上注解 ...
 - spring security结合数据库验证用户-注解方式
		
项目目录结构如下: 首先数据库的建立和数据导入,以及一些类的依赖参考XML配置方式,需要修改一些配置. 一.在AppConfig文件中添加DataSource的配置 @Bean(name = &quo ...
 - struts2注解
		
一.配置web.xml <filter> <filter-name>struts2</filter-name> <filter-class>org.ap ...
 - 基于已构建S2SH项目配置全注解方式简化配置文件
		
如果还不熟悉s2sh项目搭建的朋友可以先阅读 eclipse环境下基于tomcat-7.0.82构建struts2项目 eclipse环境下基于已构建struts2项目整合spring+hiberna ...
 - Shiro启用注解方式
		
shiro验证权限方式一种是基于url配置文件: 例如: <bean id="shiroFilter" class="org.apache.shiro.spring ...
 - Annotation(四)——Struts2注解开发
		
Hibernate和Spring框架的开发前边总结了,这次看一下流行的MVC流程框架Struts2的注解开发吧.Struts2主要解决了从JSP到Action上的流程管理,如何进行Uri和action ...
 - Struts2注解学习1
		
这是开博的第一篇,我希望每天把我学到的东西记录下来,成为一个知识库,方便以后的学习和分享 在项目中看到用struts2注解来做,很方便,做了一个用户登录的例子 1.加载所需jar包 commons-f ...
 - struts2+ajax实现异步验证实现
		
由于老师布置作业的需要,在添加管理员的时候,要实现验证添加的管理员的用户名是否在数据库中已经存在,然后再客户端给用户一个提示.我首先想到的就是利用ajax实现异步验证技术,由于利用的ssh框架,所以在 ...
 
随机推荐
- java虚拟机规范(se8)——java虚拟机的编译(二)
			
3.3 算术运算 java虚拟机通常在操作数栈上进行算术运算(例外情况是iinc指令,它直接增加一个局部变量的值).例如下面的align2grain()方法,它的作用是将int值对齐到2的指定次幂: ...
 - 一句话概括 tcp三次握手
			
服务端和客户端都需要直到自己均可收发,因此需要三次握手. 简化三次握手: <img width="487" alt="2018-07-10 3 42 11" ...
 - UICollectionView中的cell包含UIScrollview
			
需求:在scrollview的子View不为0,当scrollview的展示的index不为0且向右滑动CollectionView.CollectionView不滑动Cell,而是让scrollvi ...
 - eclipse发布路径变更
			
但是其默认访问的目录是eclipse临时目录而非Tomcat目录, 建议双击tomcat進入配制界面Service Locations 修改选项为:Use Tomcat installation(ta ...
 - Android 如何使edittext默认失去焦点
			
1.在布局文件中给edittext的父控件增加两个属性 android:focusable="true" android:focusableInTouchMode="tr ...
 - list集合获取相同以及不同的对象
			
List<StyleMenuModule> list1 = new ArrayList<>(); StyleMenuModule s1 = new StyleMenuModul ...
 - Vue中的作用域插槽
			
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
 - 1.隐藏继承的成员new / 虚方法(override)/ abstract / 多态 ----- 重写
			
总结: 1. 在继承上, new/override没区别 2. 在多态上,new不支持多态,override支持 在C#中改变类中相同名称的方法的实现过程中有三种方式:重载.重写和覆盖. 重载:指具有 ...
 - Mongodb导入本地数据(.dat)到仓库(window)
			
借鉴文章,完成了数据文件导入到Mongodb, 尊重作者版权:https://blog.csdn.net/weixin_44198965/article/details/100022616 1.找到你 ...
 - C# 16进制转字符串,字符串转16进制
			
{ //========================================================== //16进制转字符串 public static byte[] HexTo ...