Struts2的校验
08_struts2_表单验证
* 要校验指定的方法通过重写validateXxx()方法实现, validateXxx()只会校验action中
方法名为Xxx的方法。其中Xxx的第一个字母要大写。
* 当某个数据校验失败时,调用addFieldError()方法往系统的fieldErrors添加校验失败
2、Action中
* 要继承ActionSupport
* 重写Validateable接口中的validate()方法 ,在该方法中完成验证
3、* 要进行验证:
* * 需求:
* * 用户名不能为null ,""
* * 密码不能为null, "" 并且密码的长度6-12之间
【3、配置验证的xml文件】
* 验证的xml文件的规范在xwork-core-2.1.6.jar包下的:xwork-validator-1.0.3.dtd
* 验证文件的命名
* 在这个校验文件中,对action中字符串类型的username属性进行验证,
首先要求调用trim()方法去掉空格,然后判断用户名是否为空
return "success";
}
public String test(){
System.out.println("test^^^^^^6");
return "success";
}
public String getUsername() {
return username;
【7、在xml中配置验证出错信息】
<result name="input">/validate/login.jsp</result>
Struts2校验器类型详解
Struts2校验器类型详解一、Struts2内建校验器位于xwork-2.0.4.jar压缩包中(com.opensymphony.xwork2.validator.validators)有个文件default.xml ,该文件中定义了Struts2框架内建的校验器。
default.xml文件定义了常用的校验器类型。
首先搞清楚:struts2字段校验器与非字段校验器的区别字段校验器配置格式:<field name="被校验的字段"><field-validator type="校验器名"><!--此处需要为不同校验器指定数量不等的校验规则--><param name="参数名">参数值</param>....................<!--校验失败后的提示信息,其中key指定国际化信息的key--><message key="I18Nkey">校验失败后的提示信息</message><!--校验失败后的提示信息:建议用getText("I18Nkey"),否则可能出现Freemarker template Error--></field-vallidator><!-- 如果校验字段满足多个规则,下面可以配置多个校验器--></field>非字段校验器配置格式:<validator type="校验器名"><param name="fieldName">需要被校验的字段</param><!--此处需要为不同校验器指定数量不等的校验规则--><param name="参数名">参数值</param><!--校验失败后的提示信息,其中key指定国际化信息的key--><message key="I18Nkey">校验失败后的提示信息</message><!--校验失败后的提示信息:建议用getText("I18Nkey"),否则可能出现Freemarker template Error--></validator>非字段校验:先指定校验器:由谁来校验,来校验谁!字段校验器:先指定校验的属性:我来校验谁,由谁来校验!下面是对应在包中的类:<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>二、各种类型校验器1、类型转换检验器:(1)非字段校验:<validator type="conversion"><param name="fieldName">myField</param><message>类型转换错误</message><param name ="repopulateField">true</param></validator>(2)字段校验:<field name="myField"><field-validator type="conversion"><message>类型转换错误</message><param name ="repopulateField">true</param></field-validator></field>fieldName:该参数指定检查是否存在转换异常的字段名称,如果是字段校验,则不用指定该参数。
struts2 html默认校验规则
一、概述struts2是一个开源的Web应用程序框架,它通过MVC模式将业务逻辑与表示逻辑分离,提高了Web应用程序的模块化和可维护性。
在struts2中,可以使用html标签库来简化页面的设计和交互,同时也提供了默认的表单校验规则,以确保用户输入的数据符合要求。
本文将重点介绍struts2中的html默认校验规则。
二、html标签库简介1. html标签库是struts2提供的一个简化页面设计的工具,它包含了大量的标签,用于生成HTML和XHTML。
2. 使用html标签库可以减少页面设计与后端逻辑代码的耦合度,提高了代码的可维护性和重用性。
3. html标签库还提供了一些默认的表单校验规则,可以帮助开发人员快速实现表单的校验功能。
三、默认校验规则的使用1. 在struts2中,可以通过html标签库来定义表单,并且可以利用标签库提供的默认校验规则来验证表单提交的数据。
2. struts2提供了一些常见的默认校验规则,例如required、em本人l、url、int、double等,这些规则可以直接在表单字段上进行声明。
3. 开发人员只需要在表单字段的属性中添加相应的校验规则,struts2就会在后台自动进行表单数据的校验,如果不符合规则,将会返回错误信息。
四、默认校验规则的配置1. 默认校验规则可以通过struts.xml文件进行配置,其中可以自定义校验规则的错误信息、校验失败时的处理方式等。
2. 在struts.xml中,可以使用<validator>标签对表单字段进行校验规则的声明,通过type、field和message等属性来配置校验规则。
3. 通过配置struts.xml文件,开发人员可以对默认校验规则进行灵活的控制和定制,以满足实际项目的需求。
五、总结struts2通过html标签库提供了丰富的默认校验规则,可以帮助开发人员快速实现表单数据的验证和校验。
开发人员也可以通过struts.xml文件对默认校验规则进行灵活的配置和定制,以满足不同项目的需求。
Strust2 数据校验
Strust2-数据校验一. ActionSupport是个工具类,他实现了Action, Validatable等接口, Validatable提供validate()方法进行数据验证.Action只要继承ActionSupport类,重写validate()方法就可以进行数据验证二. 校验的流程首先,Struts框架对输入数据进行类型转换,然后再进行数据校验,如果类型转换与数据校验都没有错误发生, 就进入execute(),否则请求将被转发到input视图三. 注册实例1. register.jsp[html]view plaincopy1.<span style="font-size:16px;"><%@ page language="java"contentType="text/html; charset=utf-8"%>2.<%@ taglib prefix="s"uri="/struts-tags"%>3.<html>4.<head>5.<title>Insert title here</title>6.</head>7.<body>8.<s:form action="register"method="post">9.<s:textfield name="name"label="姓名"required="true"/>10.<s:textfield name="age"label="年龄"required="true"/>11.<s:submit value="提交"></s:submit>12.</s:form>13.</body>14.</html>15.</span>2.当姓名和年龄提交时候,用RegistAction类来获取数值:RegistAction.java[html]view plaincopy1.<span style="font-size:16px;"> 1: public class RegistAction extends ActionSupport {2. 2: private String name;3. 3:4. 4: private int age;5. 5:6. 6: ...//省略name,age的setter,getter方法7. 7:8. 8: public String execute() {9. 9: return SUCCESS;10. 10: }11. 11:12. 12: public void validate() {13. 13: if ("".equals(name)) {14. 14: this.addFieldError("name", "用户名不能为空");15. 15: }16. 16: if (name.length() > 6) {17. 17: this.addFieldError("name", "用户名长度不能超过5位");18. 18: }19. 19:20. 20: if (age <1 || age > 150) {21. 21: this.addFieldError("age", "年龄范围必须在1~150之间");22. 22: }23. 23: }24. 24: }25.</span>[html]view plaincopy1.<span style="font-size:16px;">.struts.xml2.3. 1: <package name="test1"extends="struts-default"namespace="test1">4. 2: <action name="register1"class="test1.RegistAction">5. 3: <result name="input">register.jsp</result>6. 4: <result name="success">../success.jsp</result>7. 5: </action>8. 6: </package>9.</span>[html]view plaincopy1.<span style="font-size:16px;">4.success.jsp2.3. 1: <%@ page contentType="text/html;charset=GBK"%>4. 2: <%@ taglib prefix="s"uri="/struts-tags" %>5. 3: <s:property value="name"/>,欢迎您登录!6.7.</span>如果name和age都不输入,则会执行Action中的校验方法,会提示用户名不能为空如果不输入userName, age输入为abc,会提示Invalid field value for field "age".username is empty1. 其中Invalid field value for field "age" 信息是struts2通过内置的类型转换器进行类型转换时,如果不能成功转换, struts2框架自动生成一条错误信息,并将该错误信息放到addFieldError里面,这种默认的输出信息格式是在xwork-2.0.4.jar中定义的.com/opensymphony/xwork2/xwork-messages.properties文件中有一条xwork.default.invalid.fieldvalue=Invalid field value for field "{0}".2. 这是一种全局的错误提示方式,整个系统中只要是字段类型转换错误都会这样提示,我们也可以改变这种输出格式,只要在全局的国际资源文件中重写xwork.default.invalid.fieldvalue就可以了.实现方式:在struts.xml中加入<constant name="struts.custom.i18n.resources"value="messageResource"></constant>或者也可以在struts.properties中加入struts.custom.i18n.resources=messageResource指定国际化资源文件名为messageResource. Properties新建messageResource. Properties资源文件并添加数据xwork.default.invalid.fieldvalue={0} failure 修改之后字段类型转换错误提示为: {0} failure3 所有的类型转换失败后,struts2会将基本类型设置为0,对象类型设置为null,这里的age的类型为Integer,当类型转换失败age值为null,如果age的类型为int,那么转换失败后值为04.这种提示信息不够友好,也可以定义局布的提示信息,为每一个Action新建一个properties文件,文件名为XXX.properties(Action名.properties)实现方式:新建RegistAction.properties并添加invalid.fieldvalue.age=age errorinvalid.fieldvalue.birthday=birthday error其中age和birthday分别为字段的名称四.Struts2也提供类似BaseDispatchAction的功能1.<span style="font-size:16px;">1: package com;2. 2:3. 3: import com.opensymphony.xwork2.ActionSupport;4. 4:5. 5: public class Regist2Action extends ActionSupport {6. 6:7. 7: private String userName;8. 8:9. 9:10. 10:11. 11: public String getUserName() {12. 12:13. 13: return userName;14. 14:15. 15: }16. 16:17. 17: public void setUserName(String userName) {18. 18:19. 19: erName = userName;20. 20:21. 21: }22. 22:23. 23: public String regist() throws Exception {24. 24:25. 25: System.out.println("注册成功-regist");26. 26:27. 27: return SUCCESS;28. 28:29. 29: }30. 30:31. 31:32. 32:33. 33: public void validateRegist() {34. 34:35. 35: if(userName.equals("")){36. 36:37. 37: addFieldError("userName", "请输入用户名-registValidate");38. 38:39. 39: }40. 40:41. 41: }42. 42:43. 43: }44. 44:45. 45: <action name="regist2"class="com.Regist2Action"method="regist">46. 46: <result name="success">/welcome.jsp</result>47. 47: <result name="input">/regist2.jsp</result>48. 48: </action>49.</span>指定了method为regist,当请求时会执行regist(),不会再去执行默认的execute()方法了, validateRegist()方法是专门针对regist校验的.(格式为validate+方法名)。
struts2校验框架
二十七、action的getFieldErrors()方法返回的是一个不可以增加错误,它返回的是一个新的或不可修改的action。getFieldErrors()返回的是一个原来LinkedHashMap的一个复本,所以不可以从这里添加,它是只读的。
二十、在校验框架里validator是非字段校验,其中type属性对应的校验的类型如:required、requiredstring、int、long、short、double、date、expression、fieldexpression、email、url、visitor、conversion、stringlength、regex、conditionalvisitor;里面的第一个param的name属性一定要是fieldName而值是要校验的字段其余的param与message与字段校验里的一样。
十一、param是一个字符串,它也有一个name属性也是字符串类型的,name属性对应default.xml里类型所实现的类里的属性名,值为自己的要求。
十二、message也是一个字符串,字有一个属性key也是字符串类型的,它可以提供也可以不提供。message的值是用户提示的错误信息,它里面是可以国际化的。
十七、struts2会给自己的标签生成ID但是如果指定了ID就不会生成ID了,以指定的为标准。
十八、当多个业务逻辑方法的时候,准确的说应该是一个逻辑方法对应一个校验方式,校验文件应该是:action类名+“-”+方法名+“-validation.xml”。如果也有action的类名+“-validation.xml”的文件它会先执行action的类名+“-validation.xml”的再执行action类名+“-”+方法名+“-validation.xml”,所有如果有多个逻辑方法时就写多个action类名+“-”+方法名+“-validation.xml”的校验文件。
Struts2 数据输入校验(3) —— 问题补遗
Struts2中的13个校验规则:required、req uiredstring、int、double、date、e xpressio n、fielde xpressio n、email、url、visitor、co nversio n、stringleng th、rege x。
两种验证机制的执行顺序先执行validation.xml,后执行Action内部的validate()方法。
Actio nSupport类对ActionError和FieldError的实现细节在Actio nAware接口中声明的ActionError,ActionMessage: Collection<String>FieldError: Map<String,List<String>>Actio nSupport组合了一个实现了Validatio nAwa re的ValidationAwareSupport来继承Validatio nAwa re接口:Validatio nAwa reSupport类内部声明了三个私有变量,其中actionMessage = new ArrayList<String>();actionError = new ArrayList<String>();fieldErrors = new LinkedHashMap<String, List<String>>();FieldErro rs需要注意的一点我们往FieldErrors中添加错误的时候,需要调用addFieldError(),而不应该调用getFieldErrors().p ut()函数.这两个方法看起来是一样的,其实不然。
getFieldErrors()在实现的时候返回的是fieldErrors的一个可写副本,修改这个副本不会真正将错误传入fieldErro rs中去。
第4章 Struts 2的输入校验
清华大学出版社
regex(正则表达式校验器)
• <field-validator type="regex"> • <param name="expression"><![CDATA[^1[3578]\d{9}$]]></param> • <message>手机号格式不正确!</message> • </field-validator>
• • • • • • • • • •
无限挑战 无限飞翔
Struts 2框架应用教程
清华大学出版社
required(必填校验器)
• <field-validator type="required"> • <message>性别不能为空!</message> • </field-validator>
7.1.2
服务端校验
• 服务器端校验对于系统的安全性、完整性、健壮性起到了 至关重要的作用。Struts 2框架是非常强大的,它提供了 一套验证框架,通过验证框架能够非常简单和快速地完成 输入校验。 • 在服务器端,对于输入校验Struts 2提供了两种实现方法 :一是采用手工编写代码实现(手工编程),二是基于 XML配置方式实现(Struts 2校验框架)。
• • • • • 1.创建JSP页面practice724733.jsp,该页面与practice724.jsp页面完全一样,唯一不 同的就是表单的action属性值。该页面的action属性值practice724733.action 。 2.创建Action类Practice724733Action.java 3.在action包下编写校验文件Practice724733Action-validation.xml 4.配置Action 5.校验显示效果
Struts2用户校验
§2.1 Struts2用户校验(struts2校验框架)Struts2提供了功能强大的输入校验机制,通过Struts2内建的输入校验器,应用无需书写任何代码,即可完成大部分的校验功能,并可以同时完成客户端和服务器端的校验。
如果应用的输入校验规则特别,Struts2也允许通过重写validate方法来完成自定义校验,另外Struts2的开放性还允许开发者提供自定义的校验器。
表现层的数据处理包括两个方面:一是数据类型的转化,因为Web应用接收到的所有数据都是字符串类型的;另一个就是输入校验,因为开发者必须全面考虑用户输入的各种情况,尤其需要注意那些非正常输入。
客户端的校验最基础的方法就是在页面写javascript代码手工校验,服务器端的校验最基础的方法就是在处理请求的Servlet的service()方法中添加校验代码。
Struts2中可以通过重写validate方法来完成输入校验。
如果我们重写了validate方法,则该方法会应用于此Action中的所有提供服务的业务方法。
Struts2支持校验特定方法的validateXxx()方法。
例如某个Action中有一个regist()业务方法,我们可以写一个validateRegist()方法来进行regist()的特殊校验,客户端请求调用的次序如下:validateRegist()--------------->validate()-------------->regist()Struts2的输入校验流程如下:1,类型转换器负责对字符串的请求参数执行类型转换,并将这此值设置成Action的属性值。
2,在执行类型转换过程中可能出现异常,如果出现异常,将异常信息保存到ActionContext 中,conversionError拦截器负责将其封装到fieldError里,然后执行第3步;如果转换过程没有异常信息,则直接进入第3步。
struts2中所有方法进行输入校验
拦截器将异常封装到filedErrors里。不管类型转换是否出现异常,都会进入第3步。
3.系统通过反射技术先调用action中的validateXxx()方法,Xxx为方法名。
4.再调用action中的validate()方法。
5.经过上面4步,如果系统中的filedErrors存在错误信息(即存放错误信息的集合的size大于0),
系统自动将请求转发至名称为input的视图。如果系统中的filedErrors 没有任何错误信息,系统将执行
action中的处理方法。
return username;
}
public void setUsername(String username){
ername = username;
}
public String getMobile(){
return mobile;
}
public void setMobile(String mobile){
对指定方法进行校验
validate.Xxx
public void validateUpdate(){ //重写,会对action 中的指定方法进行校验
==========================
输入校验的流程:
1.类型转换器对请求参数执行类型转换,并把转换后的值赋给action属性。
import com.opensymphony.xwork2.ActionSupport;
pubilc class PersonAction extends ActionSupport{
struts2中方法验证的三种形式
<result name="input">/index.jsp</result>
<interceptor-ref name="defaultStack">
<param name="validation.excludeMethods">*</param>
如果有多个方法,方法名以“,”隔开,例如要验证add和delete方法:
<param name="validation.includeMethods">add,delete</param>
1,采用注解annotation形式:在不需要验证的方法前加上@SkipValidation
2,针对每一个需要验证的方法单独生成一个配置文件,例如在UserAction中有两个方法add()和delete()
并且我们假设只对add()方法进行校验,配置如下:
-------------------------------struts.xml----------------------------------------------
<result>/success.jsp</result>
<result name="input">/index.jsp</result>
</action>
<!-- 配置这个action主要是为了让其他的请求能进入其他的方法 -->
<action name="user_*" class="erAction" method="{1}">
第4章 Struts 2输入校验
4.2.1 正则表达式
客户端校验一般都使用JavaScript来进行输入的 校验。JavaScript对输入判断都会使用到正则表 达式。正则表达式是字符串处理的利器,功能非 常强大。 正则表达式的功能非常强大,通过它可以进行字 符串匹配、字符串查找、字符串替换。今天重点 介绍字符串的匹配功能,字符串的匹配功能对于 输入校验提供了很大的帮助。先看下面简单的正 则表达式的示例。 正则表达式:a.b 匹配abb,acb,等 “.“是正则表达式的特殊字符,它的含义是匹配 所有的字符还有空格和Tab键。
4.4.3 校验动态方法
前面介绍的在一个Action中包含多个处理逻辑,不同处理逻辑对 应不同的方法。那如何定义输入校验来校验这些处理逻辑呢? 下面来看一个简单示例,首先将上一示例中的Action中添加一个 validate()方法,该方法将在控制台上简单的打印一句话,代码 如下所示。 public void validate() { System.out.println("validate method"); } 这里为了简单测试,并不输入任何的用户信息。直接单击“注册” 按钮,在控制台将打印如下语句: validate method execute method 从控制台打印的语句可以看出,在Action中首先执行了validate() 校验方法,然后再执行execute()处理逻辑方法。如果单击“删除” 按钮,在控制台将打印如下语句。 validate method delete method
4.2.2 JavaScript中使用正则表达式
下面以一个简单示例来介绍在JavaScript中使用 正则表达式进行字符串匹配。程序要求必须输入 数字,如果输入的不是数字就弹出提示,代码如 下所示。
Struts2 数据输入校验(2) —— XML验证
Struts2 数据输入校验(2) —— XML验证struts2提供了通过XML方式对输入数据进行验证的校验框架。
在与XXXAction同级的目录下,建立XXXAction-validation.xml,即为该Action的校验逻辑。
该校验XML的dtd格式文件为/xwork/xwork-validator-1.0.2.dtd,具体内容可以展开下面的代码:/xwork/xwork-validator-1.0.2.dtd可以看到,数据校验XML的根元素<validator>下面可以包含两种子元素:field和validator1、前者field 是针对字段进行的校验;2、后者validator 是非字段或者说全局范围的校验。
在介绍完校验是怎么回事后,后面会简单比较一下两种校验方式的区别。
一、字段校验:(field)先看个基本示例<validators><field name="username"><field-validator type="requiredstring"><message key="ername.required"/></field-validator></field><field name="password"><field-validator type="stringlength"><param name="trim">true</param><param name="minLength">4</param><param name="maxLength">10</param><message>password should be ${minLength} to ${maxLength} characters lon g.</message></field-validator></field></validators>有几个地方需要注意一下的。
struts2验证规则配置文件命名方式
1. Action级别校验命名格式:ActionClassName-validation.xml2. Action中某个方法的校验命名格式:ActionClassName-ActionAliasName-validation.xml注意:这里的ActionAliasName(action别名)指的是struts.xml中Action name="XX"的xx的名称,而不是method="XX"的名称。
3. 如果以上2个校验文件都存在,那么2个文件都会被执行;如果2个校验文件中的校验属性相同那么将被执行同校验属性中ActionClassName-ActionAliasName-validation.xml中的校验规则。
4.在使用visitor校验器的时候,<message>out</message>必须要配置且out消息必须得写,否则会报空指针错误。
5.visitor校验器配置方法,这里不详细列举。
仅说明其用途:如果几个Action同时用到一个模型类,都要验证这个模型类中的某个属性。
那么只需要配置这个模型类的验证文件,然后以visitor校验器的方式在Action 的验证文件中引用模型类的验证文件名即可。
例如:模型类的验证文件名叫:User-userContext-validation.xmlAction的验证文件名件中引用如下:<field name="user"><field-validator type="visitor"><param name="context">userContext</param><param name="appendPrefix">true</param><message>out</message></field-validator></field>6.采用非字段校验器配置格式,配置示例:<validators><!--使用非字段校验器风格;来配置字段表达式校验器--><validator type="fieldexpression"><!--指定校验字段pass--><param name="fieldName">pass</param><!--指定逻辑表达式--><param name="expression"><![CDATA[(pass == rpass)]]</param><!--指定校验失败的提示信息--><message>两个密码必须相同!</message></validator></validators>7.采用字段校验器配置格式,配置示例:<validators><!--使用字段校验器格式来配置字段表达式校验器,校验pass属性--><field name="pass"><field-validator type="fieldexpression"><!--指定逻辑表达式--><param name="expression"><![CDATA[(pass == rpass)]]</param> <!--指定校验失败的提示信息--><message>两个密码必须相同!</message></field-validator></field></validators>。
第15章struts2校验机制
输入校验一、Struts2校验机制Struts2框架提供了优秀的校验机制,它们可以分为3部分:(1)内置校验器,对web应用开发中常见的校验功能进行了封装(2)校验规则声明,允许开发人员通过XML配置文件或者Java Annoation来引用内置校验器定义输入校验规则(3)校验拦截器,框架通过拦截器validation和workflow 来实现对输入信息的校验工作。
Validation拦截器根据校验规则声明调用内置拦截器实现校验工作,并负责维护创建一个字段相关的错误信息列表,workflow负责检查此错误信息列表,如果存在错误信息,则返回Action组件相关的input结果视图,并在返回的视图中显示相关的错误信息。
此外还支持开发人员定义自己的校验器。
类型转换和输入校验是Struts2框架对客户端提交信息进行处理的两个阶段。
客户端提交的信息首先进行类型转换,不管是否在转换过程中出现异常,都将进入输入校验阶段。
只有在类型转换和输入校验没有任何错误的情况下才会进入Action组件的业务逻辑处理。
二、利用Struts2框架实现校验【例子】【Quiz.jsp】<%@page contentType="text/html"pageEncoding="UTF-8"%><%@taglib prefix="s"uri="/struts-tags"%><!DOCTYPE HTML PUBLIC"-//W3C//DTD HTML 4.01Transitional//EN""/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type"content="text/html; charset=UTF-8"><title>问卷调查</title></head><body><H1>你喜欢的笔记本品牌</H1><s:fielderror/><s:form action="basicValidate"method="post" namespace="/validate"><s:textfield name="name"label="姓名"/><br><s:textfield name="age"label="年龄"/><br><s:textfield name="answer"label="笔记本品牌"/><br><s:submit value="提交"/></s:form></body></html>【Quiz_success.jsp】<%@page contentType="text/html"pageEncoding="UTF-8"%><%@taglib prefix="s"uri="/struts-tags"%><%@page isELIgnored="false"%><!DOCTYPE HTML PUBLIC"-//W3C//DTD HTML 4.01Transitional//EN""/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type"content="text/html; charset=UTF-8"><title>问卷结果</title></head><body>谢谢!<b><s:property value="name"/></b>你喜欢的笔记本品牌是:<b><s:property value="answer"/></b></body></html>【QuizAction.java】package my.ognl;import com.opensymphony.xwork2.ActionSupport;public class QuizAction extends ActionSupport{ private String name;private int age;private String answer;public String getName() {return name;}public void setName(String name) { = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getAnswer() {return answer;}public void setAnswer(String answer) {this.answer = answer;}}【QuizAction-validation.xml】<?xml version="1.0"encoding="UTF-8"?><!DOCTYPE validators PUBLIC"-//Apache Struts//XWork Validator 1.0.2//EN""/dtds/xwork-validator-1.0.2.dtd" ><validators><field name="name"><field-validator type="requiredstring"><message>用户名不可为空</message></field-validator></field><field name="age"><field-validator type="int"><param name="min">6</param><param name="max">120</param><message>年龄值超出合理范围</message></field-validator></field></validators>【struts.xml】<package name="mypack2"extends="struts-default"> <action name="basicValidate"class="my.ognl.QuizAction"method="execute"><resultname="success">/WEB-INF/page/Quiz_success.jsp</result><result name="input">/Quiz.jsp</result></action></package>测试地址栏输入http://localhost:8080/example_ch1/ Quiz.jsp如果不输入姓名,年龄输入200,笔记本品牌输入IBM,得到的结果为在与Action组件同样的package路径下寻找名为**-validation.xml的校验规则声明文件,其中**代表Action 组件的名称。
CH05 Struts2数据校验
validation.xml文件配置。
注意:该文件应该保存在与Action class文件相同的路径下。
校验框架实现输入校验
校验器配置文件命名
如果要对同一个UserAction的不同方法reg()与login()分别 进行验证,如何做呢? 这时需要给出二个不同的验证文件:命名规则如下: UserAction-reg-validation.xml和UserAction-loginvalidation.xml 但是请注意UserAction-reg-validation.xml和
校验框架实现输入校验
日期校验器date
校验框架实现输入校验
表达式校验器expression
表达式校验器的名字是expression,它基于ONGL表达 式进行验证,要求表达式的返回值为true,否则校验 失败。参数: • expression:该参数指定一个逻辑表达式,该逻辑 表达式基于ValueStack进行求值,最后返回一个 Boolean值,当返回true时,校验通过;否则校验 失败。 由于该校验器是一个非字段校验器,所以不能以字 段校验器的配置风格来配置。
输入校验概述:客户端校验
客户端校验主要是过滤正常用户的误操作,主要 通过JavaScript代码完成。 例子:ch05/register.jsp
输入校验概述:服务器端端校验
对于某些恶意用户绕过客户端验证,直接用其他方 式提交请求的行为,需要用服务器端验证来阻止非 法数据进入系统,对于系统的安全性、完整性,承 载着不可替代的作用。 Strut2中的输入校验
例子:User.java, UserAction2.java userInfo1.jsp, UserAction2-validation.xml User-validation.xml
Struts2正则表达式校验总结
Struts2正则表达式校验总结正则表达式验证如下,注意验证框架的XML文件中如下写:<field name="sno"><field-validator type="regex"><param name="trim">true</param><param name="expression"><![CDATA[(\d{8})]]></param><message>学号必须为8位数字!</message></field-validator></field>field-validator的type具体查看xwork包下的com\opensymphony\xwork2\validator\validators下default.xml文件,然后在xwork源代码中(需单独下载)找到相应的处理类,param即该类的属性intege:"^-?[1-9]\\d*$", //整数intege1:"^[1-9]\\d*$", //正整数intege2:"^-[1-9]\\d*$", //负整数num:"^([+-]?)\\d*\\.?\\d+$", //数字num1:"^[1-9]\\d* ¦0$", //正数(正整数 + 0)num2:"^-[1-9]\\d* ¦0$", //负数(负整数 + 0)decmal:"^([+-]?)\\d*\\.\\d+$", //浮点数decmal1:"^[1-9]\\d*.\\d* ¦0.\\d*[1-9]\\d*$", //正浮点数decmal2:"^-([1-9]\\d*.\\d* ¦0.\\d*[1-9]\\d*)$", //负浮点数decmal3:"^-?([1-9]\\d*.\\d* ¦0.\\d*[1-9]\\d* ¦0?.0+ ¦0)$", //浮点数decmal4:"^[1-9]\\d*.\\d* ¦0.\\d*[1-9]\\d* ¦0?.0+ ¦0$", //非负浮点数(正浮点数 + 0)decmal5:"^(-([1-9]\\d*.\\d* ¦0.\\d*[1-9]\\d*)) ¦0?.0+ ¦0$",//非正浮点数(负浮点数 + 0)email:"^\\w+((-\\w+) ¦(\\.\\w+))*\\@[A-Za-z0-9]+((\\. ¦-)[A-Za-z0-9]+)*\\.[A-Za-z0-9]+$", //邮件color:"^[a-fA-F0-9]{6}$", //颜色url:"^http[s]?:\\/\\/([\\w-]+\\.)+[\\w-]+([\\w-./?%&=]*)?$", //urlchinese:"^[\\u4E00-\\u9FA5\\uF900-\\uFA2D]+$", //仅中文ascii:"^[\\x00-\\xFF]+$", //仅ACSII字符zipcode:"^\\d{6}$", //邮编mobile:"^(13 ¦15)[0-9]{9}$", //手机ip4:"^(\\d{1,2} ¦1\\d\\d ¦2[0-4]\\d ¦25[0-5]).(\\d{1,2} ¦1\\d\\d ¦2[0-4]\\d ¦25[0-5]).(d{1,2} ¦1\\d\\d ¦2[0-4]\\d ¦25[0-5]).(\\d{1,2} ¦1\\d\\d ¦2[0-4]\\d ¦25[0-5])$", //ip 地址notempty:"^\\S+$", //非空picture:"(.*)\\.(jpg ¦bmp ¦gif ¦ico ¦pcx ¦jpeg ¦tif ¦png ¦raw ¦tga)$", //图片rar:"(.*)\\.(rar ¦zip ¦7zip ¦tgz)$", //压缩文件date:"(([0-9]{3}[1-9] ¦[0-9]{2}[1-9][0-9]{1} ¦[0-9]{1}[1-9][0-9]{2} ¦[1-9][0-9]{3})-(((0[13578] ¦1[02])-(0[1-9] ¦[12][0-9] ¦3[01])) ¦((0[469] ¦11)-(0[1-9] ¦[12][0-9] ¦30)) ¦(02-(0[1-9] ¦[1][0-9] ¦2[0-8])))) ¦((([0-9]{2})(0[48] ¦[2468][048] ¦[13579][26])¦((0[48] ¦[2468][048] ¦[3579][26])00))-02-29), //日期qq:"^[1-9]*[1-9][0-9]*$", //QQ号码tel:"(\\d{3}- ¦\\d{4}-)?(\\d{8} ¦\\d{7})", //国内电话username:"^\\w+$", //用来用户注册。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
6.2 struts2的校验6.2.1 校验的必要性在Web开发中的,当注册或是登录时对用户输入的相关信息来校验是非常必要的。
输入校验直接影响了系统的稳定性。
因为不能保证每个用户都按照开发者的意图来输入数据,而往往有些用户喜欢恶意的输入些非法数据来进行测试和破坏,所以必须对用户输入的信息。
6.2.2 struts2的校验方式在Web开发中的,当注册或是登录时对用户输入的相关信息来校验是非常必要的。
校验的方式有通过ajax来校验,在JavaEE的开发中,struts2框架也给我们提供了一种校验方式,那就是struts2的校验方式。
Struts2的校验方式有两种方法:(1)手工编写代码来实现(基本验证)。
(2)基于xml配置方式实现(验证框架实现),即校验器实现校验,校验器中的校验又分为以下两种校验格式。
①非字段校验格式:<validators><validator type="校验类型"><param name="fieldName">字段名称</param><param name="参数1">参数1</param><param name="参数2">参数2</param>.............<message >校验异常信息message></validator>............</validators>②字段校验文件格式:<validators><field name="校验字段名称"><field-validator type="校验类型"><param name="参数1">参数值1</param><param name="参数2">参数值2</param>..........<message>校验失败后的错误信息</message></field-validator><field-validator type="校验类型">........</field-validator></field></validators>注:所谓的字段校验,即校验ValidateFrameAction中的属性。
一个<field>表示对Action 中的一个属性的校验。
字段校验,属于是字段优先。
即我去校验谁,然后是我用谁去校验非字段校验,则校验器优先。
即我用谁去校验,然后是我去校验谁,即字段校验中先定义name="username"对哪个字段校验,再定义type="requiredstring"如何校验。
而非字段校验先定义type="requiredstring"确定校验器,再定义name="fieldName"指定所校验的属性字段校验和非字段校验的本质都是一样的,只是说话的顺序不同罢了。
反映到底层后,二者实质上都是一样的。
相对来说不推荐使用非字段验证,实际应用中如果需要验证的字段非常多的话,那么在维护的时候就比较困难了6.2.3 struts2的框架校验案例本案例中以一个简单的博客系统注册页面,来实现对注册功能的校验。
(1) 新建一个名为chapter06-2的web工程,并导入struts2的开发jar。
如图6.8所示。
图6.8建立的web工程(2)编写register.jsp文件和success.jsp页面代码如下所示。
register.jsp代码:<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%><%@ taglib prefix="s" uri="/struts-tags" %><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN""/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=gb2312" /><title>博客注册</title></head><body><form action="register.action" method="post"><table width="600" border="1"><tr height="30"><td colspan="3" align="center">新博客注册</td></tr><tr height="30"><td align="right" width="160">帐号 </td><td><input type="text" name="username"/>*</td><td><s:fielderror><s:param>username</s:param></s:fielderror></td> </tr><tr height="30"><td align="right">密码 </td><td><input type="password" name="password"/>*</td><td><s:fielderror><s:param>password</s:param></s:fielderror></td> </tr><tr height="30"><td align="right">确认密码 </td><td><input type="password" name="repassword"/>*</td><td><s:fielderror><s:param>repassword</s:param></s:fielderror></td> </tr><tr height="30"><td align="right">昵称 </td><td><input type="text" name="nickname"/>*</td><td><s:fielderror><s:param>nickname</s:param></s:fielderror></td> </tr><tr height="30"><td align="right">密码保护问题 </td><td><select name="question"><option value="你的生日">你的生日</option><option value="你的家乡">你的家乡</option><option value="你最喜欢的食物">你最喜欢的食物</option></select>*</td><td><s:fielderror><s:param>question</s:param></s:fielderror></td> </tr><tr height="30"><td align="right">密码保护的答案 </td><td><input type="text" name="answer"/>*</td><td><s:fielderror><s:param>answer</s:param></s:fielderror></td></tr><tr height="30"><td colspan="3" align="center"><input type="submit" value="提交"/> <input type="reset" value="重置"/></td></tr></table></form></body></html>success.jsp代码<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%><%String path = request.getContextPath();String basePath =request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html><head><base href="<%=basePath%>"><title>注册成功</title></head><body><%@ taglib uri="/struts-tags" prefix="s" %>您好,${ername}恭喜注册成功!<br/>您的注册信息为:<br/><s:text name="密码"></s:text>:${param.password}<br/><s:text name="密保问题"></s:text> :${param.question}<br/><s:text name="密保答案"></s:text>:${param.answer}<br/></body></html>(3) 编写Action类和校验器RegisterAction-validation.xml文件。