Struts2:效验器——声明式
就是用xml配置的方式,而不是Java代码的形式,那个是“编程式”
Action:
package org.ah.s2; import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven; public class C1 extends ActionSupport implements ModelDriven<Model> {
public String m1() {
return "success";
} @Override
public Model getModel() {
return new Model();
} }
Model:
package org.ah.s2;
import java.util.Date;
public class Model {
private String uname;
private String pwd;
private String pwd2;
private Date birth;
private int weight;
public int getWeight() {
return weight;
}
public void setWeight(int weight) {
this.weight = weight;
}
public String getPwd2() {
return pwd2;
}
public void setPwd2(String pwd2) {
this.pwd2 = pwd2;
}
public String getUname() {
return uname;
}
public void setUname(String uname) {
this.uname = uname;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
public Date getBirth() {
return birth;
}
public void setBirth(Date birth) {
this.birth = birth;
}
}
struts.xml
<struts>
<constant name="struts.enable.DynamicMethodInvocation" value="true" />
<constant name="struts.devMode" value="true" />
<constant name="struts.configuration.xml.reload" value="true" />
<package name="p1" namespace="/" extends="struts-default">
<action name="*Action" class="org.ah.s2.C1" method="{1}">
<result name="success" type="dispatcher">
/inputMsg.jsp
</result>
<result name="input">/index.jsp</result>
</action>
</package>
</struts>
表示层:
index.jsp核心代码
<s:form action="m1Action" method="post">
<s:textfield name="uname" label="用户名"/>
<s:textfield name="pwd" label="密码"/>
<s:textfield name="pwd2" label="确认密码"/>
<s:textfield name="birth" label="生日"/>
<s:textfield name="weight" label="体重"/>
<s:submit value="提交"></s:submit>
</s:form>
input.jsp 无关大局,略
自定义效验器:
package org.ah.s2; import java.util.regex.Matcher;
import java.util.regex.Pattern; import com.opensymphony.xwork2.validator.ValidationException;
import com.opensymphony.xwork2.validator.validators.FieldValidatorSupport; public class MyValidator extends FieldValidatorSupport {
private String model; public String getModel() {
return model;
} public void setModel(String model) {
this.model = model;
} @Override
public void validate(Object obj_i) throws ValidationException {
// 字段名
String fieldName = getFieldName();
// 字段值
Object fieldValue = getFieldValue(fieldName, obj_i); if (fieldValue instanceof String) {
String strV = (String) fieldValue;
/*
* 中文unicode none:无中文 all :全中文
*/
if ("none".equals(model)) {
// compile:编译
Pattern p = Pattern.compile("[\u4e00-\u9fa5]");
Matcher m = p.matcher(strV); if (m.find()) {// 找到中文
// 效验失败(显示不出来,随便写写,不写不报错)
addFieldError(fieldName, obj_i);
}
} else if ("all".equals(model)) {
if (!Pattern.matches("[\u4e00-\u9fa5]+", strV)) {
// 不是全中文
addFieldError(fieldName, obj_i);// 效验失败
}
}
}
} }
配合自定义效验器,放在src下:validators.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">
<validators>
<validator name="cn" class="org.ah.s2.MyValidator" />
</validators>
配置效验器,其中使用了系统预定义效验器&自定义效验器
C1-validation.xml,和C1.java放在一起
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0.2//EN"
"http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd">
<validators>
<field name="uname">
<field-validator type="requiredstring">
<param name="trim">true</param>
<message>必须输入名字</message>
</field-validator> <field-validator type="cn">
<param name="model">all</param>
<message>需要中文</message>
</field-validator> </field>
<field name="pwd">
<field-validator type="requiredstring">
<param name="trim">true</param>
<message>必须输入密码</message>
</field-validator>
<field-validator type="regex">
<param name="regex"><![CDATA[(\w{4,25})]]></param>
<message>您输入的密码只能是字母和数组,且长度必须在4到25之间</message>
</field-validator>
</field>
<field name="pwd2">
<field-validator type="fieldexpression">
<param name="expression"><![CDATA[pwd eq pwd2]]></param>
<message>两次输入密码不一致</message>
</field-validator>
</field> <field name="birth">
<field-validator type="date">
<param name="min">1900-01-01</param>
<param name="max">2050-02-21</param>
<message>年纪必须在${min}到${max}之间</message>
</field-validator>
</field> <field name="weight">
<field-validator type="conversion">
<message>体重请输入数字类型</message>
</field-validator>
<field-validator type="int">
<param name="min">1</param>
<param name="max">300</param>
<message>体重必须在${min}到${max}之间</message>
</field-validator>
</field>
</validators>
运行结果:

Struts2:效验器——声明式的更多相关文章
- 9、 Struts2验证(声明式验证、自定义验证器)
1. 什么是Struts2 验证器 一个健壮的 web 应用程序必须确保用户输入是合法.有效的. Struts2 的输入验证 基于 XWork Validation Framework 的声明式验证: ...
- Struts2学习---拦截器+struts的工作流程+struts声明式异常处理
这一节我们来看看拦截器,在讲这个之前我是准备先看struts的声明式异常处理的,但是我发现这个声明式异常处理就是由拦截器实现的,所以就将拦截器的内容放到了前面. 这一节的内容是这样的: 拦截器的介绍 ...
- Struts2:效验器——注解
效验器三类: 编程式——Java代码 声明式——xml 注释法——@ 注解验证可以修饰属性的getter方法,也可以修饰执行方法Action中校验失败时,返回input逻辑视图 struts.xml ...
- [原创]java WEB学习笔记70:Struts2 学习之路-- 输入验证,声明式验证,声明是验证原理
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- java struts2入门学习--基于xml文件的声明式验证
一.知识点总结 后台验证有两种实现方式: 1 手工验证顺序:validateXxx(针对Action中某个业务方法验证)--> validate(针对Action中所有的业务方法验证) 2 声明 ...
- Struts2学习第八课 声明式异常处理
异常处理:exception-mapping元素 exception-mapping元素:配置当前的action的声明式异常处理 exception-mapping元素有两个属性: --excepti ...
- Struts2的声明式异常处理
在struts2应用程序中你还在使用try catch语句来捕获异常么?如果是这样的,那你OUT啦!struts2支持声明式异常处理,可以再Action中直接抛出异常而交给struts2来 处理,当然 ...
- Spring Boot 声明式事务结合相关拦截器
我这项目的读写分离方式在使用ThreadLocal实现的读写分离在迁移后的偶发错误里提了,我不再说一次了,这次是有要求读写分离与事务部分要完全脱离配置文件,程序员折腾了很久,于是我就查了一下,由于我还 ...
- JAVAWEB 一一 框架整合(SSH,Spring+Struts2+Hibernate IOC/DI AOP声明式事务处理 定时任务)
package org.springframework.orm.hibernate3; import java.io.Serializable; import java.util.List; impo ...
随机推荐
- TOJ2647
2647: How Many Tables 时间限制(普通/Java):1000MS/ ...
- [1]开发准备-使用C#.NET开发基于本地数据缓存的PC客户端
小记:本人是PHPer,对C#.NET的开发只能说看得懂,也写得了功能略简单的PC客户端程序,下面的是本人开发一款名叫“理财速记”的PC客户端软件的全过程记录,期间包括比较繁琐的C#.NET资料查询等 ...
- 【转载】Python的包管理工具Pip
接触了Ruby,发现它有个包管理工具RubyGem很好用,并且有很完备的文档系统http://rdoc.info 发现Python下也有同样的工具,包括easy_install和Pip.不过,我没有细 ...
- Kindle Unlimited上的技术书籍
直达链接:Kindle Unlimited 前不久,亚马逊在中国也推出了电子书包月服务.消息不灵通的我过了好久才看到这个消息,随后第一时间上官网查看具体情况. ...
- 浏览器angent分析工具
cz.mallat.uasparser.UserAgentInfo info = null; info = uasParser.parse(userAgent);
- Spring使用ThreadLocal技术来处理这些问题
过去我习惯于从左到右的思考,因为这符合书写的习惯,对于“好”得前端工程师,我们首先可能会去思考什么是好,好的定义和范围,标准和要求?但现在我习惯于从右到左的思考,因为我觉得越是抽象越难以定义,从粒度更 ...
- 由一个RABBITMQ监听器死循环引出的SPRING中BEAN和MAPPER接口的注入问题
1 @Slf4j 2 @RestController 3 @Component 4 public class VouchersReceiverController implements Message ...
- 差分:IncDec Sequence 差分数组
突然就提到了这个东西,为了不再出现和去年联赛看见二分没学二分痛拿二等第一的情况,就去学了一下,基础还是比较简单的-- 先看一个经典例题: 给定一个长度为n的数列{a1,a2...an},每次可以选择一 ...
- relative
进行relative定位后的元素,不会影响原本的文本流. 下图左列的第二张图是进行了margin-top取负值,右列第二张图进行了relative定位
- 51nod 1228 序列求和 ( 1^k+2^k+3^k+...+n^k )
C为组合数,B为伯努利数 具体推到过程略 参考博客:http://blog.csdn.net/acdreamers/article/details/38929067# (我的式子和博客中的不一样,不过 ...