struts2输入校验
来源:互联网 发布:东安格利亚大学 知乎 编辑:程序博客网 时间:2024/06/05 14:34
输入校验
一、什么是输入校验
在Action封装了请求参数后,还需要对其进行校验。例如name不能为空,age只能在18~60之间等等!我们一定要搞清楚,输入校验是在类型转换成功之后,才可能执行的。
校验分类:
l JavaScript客户端校验(改善用户体验);
l 服务器端校验(保证安全性),即使用Struts2输入校验。
二、struts2中输入校验分类
Struts2输入校验分为两种:
l 编程式校验;
1.让Action继承ActionSupport=> 实现两个接口=> Validateable ValidationAware
2.重写validate或添加validateXXX,validateDoXXX,其中XXX标示要验证的action方法名称
l 配置校验:
1.可以在action路径下加入校验文件
action的ClassName+-validation.xml => 为整个action中的所有方法进行校验
action的ClassName-action注册名称+-validation.xml => 指定要验证action中的某个方法
2.校验文件写法
1.新建一个xml校验文件
2.加入一个dtd=> xwork-core-2.3.15.1.jar/xwork-validator-1.0.3.dtd
3.加入校验器 => com.opensymphony.xwork2.validator.validators 该包下找
Ø XML配置校验(了解);
三、编程式输入校验
覆盖ActionSupport类的validate()方法,在这个方法中完成对参数的校验。
validate()方法会在参数封装之后,在execute()方法之前执行。
如果validate()方法中向fieldError中添加了错误信息,那么就不会再执行execute()方法,而是跳转到input结果码对应的页面。
<s:fielderror /><form action="<c:url value='/Demo1Action.action'/>" >用户名:<input type="text" name="username"/><br/>密 码:<input type="password" name="password"/><br/><input type="submit" value="提交"/></form>
action:
public class Demo1Action extends ActionSupport {private String username;private String password;@Overridepublic void validate() {if(username == null || username.trim().length() == 0) {this.addFieldError("username", "用户名不能为空");}if(password == null || password.trim().length() == 0) {this.addFieldError("password", "密码不能为空");}}public String execute() {System.out.println(username + ", " + password);return NONE;}}
在validate方法中
使用addFieldError(fieldName, errorMessage)方法存入字段的错误信息.
使用addActionError(anErrorMessage)方法存入action的错误信息
使用addActionMessage(aMessage)方法存入action提示信息在页面
使用<s:fielderror fieldName="xxx" />取出字段的错误信息
使用<s:actionerror/>取出action的错误信息
使用<s:actionmessage/>取出action提示信息
当然如果你的页面使用了struts2提供的表单标签.表单标签会自动显示字段的错误信息
四、校验进阶
1、跳过指定的校验方法:
如果想跳过某个Action方法的校验,在不需要校验的Action方法上加入@SkipValidation
我们都知道,一个Action中可以存在多个请求处理方法,不同的请求处理方法应该有不同的校验逻辑,所以我们应该为每个请求处理方法提供自己独有的校验方法。
而validate()方法是所有请求处理方法公共的校验方法。
action:
package cn.itheima.a_validate;import org.apache.struts2.interceptor.validation.SkipValidation;import com.opensymphony.xwork2.ActionSupport;public class Demo1Action extends ActionSupport {private String name;//表单提交到add,add方法需要验证public String add(){return "success";}//不是接受表单提交的,如果访问的是find方法,那么我不需要校验@SkipValidationpublic String find(){return "find";}@Overridepublic void validate() {if(name == null || name.trim().equals("")|| name.length() == 0){addFieldError("name", "请输入有效的用户名!");}super.validate();}//----------------------------------------------------------public String getName() {return name;}public void setName(String name) {this.name = name;}}
<package name="validate" namespace="/validate" extends="struts-default" ><action name="Demo1Action_*" class="cn.itheima.a_validate.Demo1Action" method="{1}" ><result name="find" type="dispatcher" >/index.jsp</result><result name="success" type="dispatcher" >/validate/demo1.jsp</result><result name="input" type="dispatcher" >/validate/demo1.jsp</result></action>
jsp:
<body> <s:form action="Demo1Action_add" namespace="/validate" > <s:textfield name="name" label="用户名" ></s:textfield> <s:submit value="添加" ></s:submit> </s:form> </body>
2、指定校验某个方法: (更好)
1. public的,没有返回值,没有参数(public void xxx());
2. 方法名称前缀为validate(public void validateXxx());
3. 方法名后缀必须与请求处理方法名相同,例如请求处理方法为login(),那么它的私有校验方法为:public validateLogin()。
注意,私有校验方法会在公共校验方法(validate())之前被调用。如果你要为execute()提供私有校验方法,那么这个方法名为validateExecute()。
public class Demo2Action extends ActionSupport {public void validateLogin() {System.out.println("validateLogin()...");}public void validateRegist() {System.out.println("validateRegist()...");}public void validate() {System.out.println("validate()...");}public String login() {System.out.println("login()");return NONE;}public String regist() {System.out.println("regist()"); return NONE; }}
package cn.itheima.a_validate;import org.apache.struts2.interceptor.validation.SkipValidation;import com.opensymphony.xwork2.ActionSupport;public class Demo2Action extends ActionSupport {private String name;//表单提交到add,add方法需要验证public String add(){return "success";}//不是接受表单提交的,如果访问的是find方法,那么我不需要校验public String find(){return "find";}//指定方法校验格式: validate+待验证的方法名/*public void validateAdd() {addFieldError("name", "用户名就是不对!");}*/public void validateDoAdd() {addFieldError("name", "用户名就是不对!");}//----------------------------------------------------------public String getName() {return name;}public void setName(String name) {this.name = name;}}
<action name="Demo2Action_*" class="cn.itheima.a_validate.Demo2Action" method="{1}" ><result name="find" type="dispatcher" >/index.jsp</result><result name="success" type="dispatcher" >/validate/demo2.jsp</result><result name="input" type="dispatcher" >/validate/demo2.jsp</result></action>
<body> <s:form action="Demo2Action_add" namespace="/validate" > <s:textfield name="name" label="用户名" ></s:textfield> <s:submit value="添加" ></s:submit> </s:form> </body>
五、xml配置方式校验
使用XML配置方式是先把常用的校验规则写好,然后在XML配置中指定要使用的校验规则。
当然Struts2已经帮我们写好了很多的校验规则。我们只需要指在XML文档中配置当前的请求处理方法需要哪些校验规则。
1、xml配置方式校验要求
要使用XML配置方式校验,你的Action类必须实现Validateable接口。
ActionSupport类已经实现了Validateable接口,所以我们通常是直接继承ActionSupport类。
为属性提供getXXX()和setXXX()方法!代码校验是在Action本类中来完成校验,这说明我们可以直接使用本类的private属性,
但如果使用XML配置方式校验,这需要使用校验框架的代码来完成校验工作,那么校验框架需要调用Action的getXXX()方法来获取被校验的属性,
所以一定要为被校验的属性提供getXXX()方法。
2、创建校验文件
1. 校验文件的命名必须为:ActionName-validation.xml。例如LoginAction的校验文件命名为:LoginAction-validation.xml。
2. 校验文件的路径:必须与Action在同包下。
3. 校验文件的DTD:在xwork-core-x.x.x.jar中找到xwork-validator-x.x.x.dtd,打开它,内部会有一段DTD,我们把它copy过来,放到我们的校验文件中。
xwork-validator-1.0.3.dtd
<?xml version="1.0" encoding="UTF-8"?><!-- XWork Validators DTD. Used the following DOCTYPE. <!DOCTYPE validators PUBLIC "-//Apache Struts//XWork Validator 1.0.3//EN" "http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd">--><!ELEMENT validators (field|validator)+><!ELEMENT field (field-validator+)><!ATTLIST fieldname CDATA #REQUIRED><!ELEMENT field-validator (param*, message)><!ATTLIST field-validatortype CDATA #REQUIRED short-circuit (true|false) "false"><!ELEMENT validator (param*, message)><!ATTLIST validatortype CDATA #REQUIRED short-circuit (true|false) "false"><!ELEMENT param (#PCDATA)><!ATTLIST param name CDATA #REQUIRED><!ELEMENT message (#PCDATA|param)*><!ATTLIST message key CDATA #IMPLIED>
4. 为了在MyEclipse中对XML有提示功能,那么还需要让MyEclipse导入DTD文件的位置。
3、编写校验文件
校验文件的元素结果如下:
<validators><field name=""><field-validator type=""><param name=""></param><message></message></field-validator></field></validators>
param标签:修改校验器的属性
<field>的name属性指定要校验的属性,例如<feldname=”username”>,表示要校验的属性是username属性。
<field-validator>的type属性指定校验规则,校验规则由Struts2提供,Struts2提供的所有校验规则在:
打印default.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"><!-- START SNIPPET: validators-default --><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="long" class="com.opensymphony.xwork2.validator.validators.LongRangeFieldValidator"/> <validator name="short" class="com.opensymphony.xwork2.validator.validators.ShortRangeFieldValidator"/> <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"/> <validator name="conditionalvisitor" class="com.opensymphony.xwork2.validator.validators.ConditionalVisitorFieldValidator"/></validators>
上面文件中每个<validator>元素都是一个校验规则,校验规则对应一些已经写好的方法,他们有校验属性非空的规则,有校验字符串属性长度的规则,有校验int属性范围的规则等等。通常我们不需要自己来编写校验规范,因为上面的校验规则已经足够了。
每个规则都有自己的名字,校验文件中<field-validator>的type就是用来指定校验规则的名称。例如下面的代码是对username属性的非空校验:
<validators><field name="username"><field-validator type="requiredString"> ……</field-validator></field></validators>
其中type=”requiredString”是校验规则的名称,它必须对应defualt.xml文件中<validator>元素的name属性值。
requiredString校验规则是校验字符串属性是否长度为0,如果长度为0,它会向fieldError中添加错误信息。
<message>元素指定的是错误信息,例如:
<validators><field name="username"><field-validator type="requiredstring"><message>用户名不能为空</message></field-validator></field></validators>
每个校验规则还都有自己的参数,如果想知道每个校验规则有什么参数,那么最好的方法是去查看校验规则的源代码。
例如requiredstring校验规则有一个trim参数,它是boolean类型的参数,当trim为true时,requiredString校验器会先调用属性的trim()方法(去掉前后空白),然后再校验长度是否为0。trim参数的默认值就是true。
public class RequiredStringValidator extends FieldValidatorSupport { private boolean doTrim = true; public void setTrim(boolean trim) { doTrim = trim; } public boolean getTrim() { return doTrim; } public void validate(Object object) throws ValidationException { String fieldName = getFieldName(); Object value = this.getFieldValue(fieldName, object); if (!(value instanceof String)) { addFieldError(fieldName, object); } else { String s = (String) value; if (doTrim) { s = s.trim(); } if (s.length() == 0) { addFieldError(fieldName, object); } } }}
LoginAction-validation.xml
<validators><field name="username"><field-validator type="requiredstring"><!-- 调用校验器的setTrim()方法传递参数false --><param name="trim">false</param><message>用户名不能为空</message></field-validator><field-validator type="stringlength"><!-- 调用校验器的setMaxLength()方法传递参数16 --><param name="maxLength">16</param><!-- 调用校验器的setMinLength()方法传递参数3 --><param name="minLength">3</param><message>用户名长度必须在3~16之间</message></field-validator></field><field name="password"><field-validator type="requiredstring"><param name="trim">false</param><message>密码不能为空</message></field-validator></field></validators>
package cn.itheima.a_validate;import org.apache.struts2.interceptor.validation.SkipValidation;import com.opensymphony.xwork2.ActionSupport;public class Demo3Action extends ActionSupport {private String name;private Integer age;public String add(){return "success";}public String find(){return "find";}//----------------------------------------------------------public String getName() {return name;}public void setName(String name) {this.name = name;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}}
struts.xml:
<action name="Demo3Action_*" class="cn.itheima.a_validate.Demo3Action" method="{1}" ><result name="success" type="dispatcher" >/validate/demo3.jsp</result><result name="input" type="dispatcher" >/validate/demo3.jsp</result><result name="find" type="dispatcher" >/index.jsp</result></action>
Demo3Action-Demo3Action_add-validation.xml:指定要校验add方法
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE validators PUBLIC "-//Apache Struts//XWork Validator 1.0.3//EN" "http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd"><validators><!-- 在Action要校验的属性名称 --><field name="name"><!-- 验证该属性使用什么校验器 --><field-validator type="requiredstring"><!-- 配置校验器的参数 --><param name="trim" >false</param><!-- 添加校验失败的错误信息 --><message>用户名不能为空!!!!!!!!!!</message></field-validator><field-validator type="regex"><param name="regex">^([a-z0-9_\.-]+)@([\da-z\.-]+)\.([a-z\.]{2,6})$</param><message>用户名必须是邮箱地址!</message></field-validator></field><field name="age"><field-validator type="int"><param name="min">0</param><param name="max">120</param><message>您填写的年龄必须在0~120之间!</message></field-validator></field></validators>
<body> <s:form action="Demo3Action_add" namespace="/validate" > <s:textfield name="name" label="用户名" ></s:textfield> <s:textfield name="age" label="年龄:" ></s:textfield> <s:submit value="添加" ></s:submit> </s:form> </body>
1.可以在action路径下加入校验文件
action的ClassName+-validation.xml => 为整个action中的所有方法进行校验
action的ClassName-action注册名称+-validation.xml => 指定要验证action中的某个方法
2.校验文件写法
1.新建一个xml校验文件
2.加入一个dtd=> xwork-core-2.3.15.1.jar/xwork-validator-1.0.3.dtd
3.加入校验器 => com.opensymphony.xwork2.validator.validators 该包下找
4、校验规则介绍
required:当属性为null时校验失败;
requiredstring:当字符串属性长度为0时校验失败:
Ø 参数trim:默认值为true,表示去除前后空白后再校验长度。
stringlength:当字符串长度不在指定范围内时校验失败:
Ø minLength:指定字符串的最小长度;
Ø maxLength:指定字符串的最大长度。
regex:属性不能匹配正则表达式时校验失败:
Ø expression:指定正则表达式;
Ø caseSensitive:默认值为true,表示不忽略大小写。
int:当int属性不在指定范围内校验失败:
Ø min:最小值;
Ø max:最大值。
double:当double属性不在指定范围内校验失败:
Ø min:最小值;
Ø max:最大值。
fieldexpression:属性必须是OGNL表达式:
Ø expression:用来校验的ONGL表达式,例如pass == repass,其中pass和repass是两个属性名称,当这两个属性的值相等时校验通过,否则失败。
email:属性必须是合法的邮件地址;
url:属性必须是合法的网址;
date:属性必须是合法的日期格式。
- Struts2输入校验实例
- struts2关于输入校验
- struts2 输入校验
- Struts2输入校验
- Struts2输入校验
- Struts2输入校验总结
- Struts2中的输入校验
- Struts2(服务器端)输入校验
- Struts2输入校验
- struts2输入校验
- struts2输入校验
- Struts2输入校验总结
- struts2输入校验流程
- struts2输入校验
- Struts2的 输入校验
- struts2 输入校验
- Struts2输入校验总结
- Struts2输入校验(一)
- android studio模块化开发
- 数据库表格行和列倒置
- QT 界面美化
- 系统函数解释
- C++——克鲁斯卡尔模板
- struts2输入校验
- Caused by: java.sql.SQLException: Value '0000-00-00' can not be represented as java.sql.Date
- java开发规范
- js 获取php 变量
- python 调用shell命令的方法
- imageview 设置圆角
- C语言QueryPerformanceFrequency和QueryPerformanceCounter的用法
- shell 获取 postgresql返回字段值
- 三菱Q系列PLC批量读取软元件