今天遇到了这样的问题:我的jsp页面、web.xml、struts.xml、UserAction-validation.xml等内容写的都正确,就是无法使用校验器!在网上找了半天就是不出来,迫不得已我查看了架包问题,在我的测试项目里是xwork-core-2.2.1.jar,而在我实际的项目中是xwork-core-2.3.12.jar,果断去掉了高版本的架包,使用2.2.1的版本;可是问题又出来了,我的项目报错了,说是少架包,我有把2.3.12版加上了,然后试运行,结果OK!不知道是不是把validator给剥离出来了,就去官网看看去吧。
项目如下:
1、jsp中
1 <h2>请输入您的注册信息</h2> 2 <s:fielderror/> 3 <s:form action="user_regist"> 4 <s:textfield name="user.userName" label="用户名"/> 5 <s:textfield name="user.password" label="密码"/> 6 <s:textfield name="user.id" label="type"/> 7 <s:submit value="注册" /><s:reset value="重填"/> 8 </s:form>
2、action中:
1 public class UserAction extends ActionSupport { 2 private User user; 3 4 public User getUser() { 5 return user; 6 } 7 8 public void setUser(User user) { 9 this.user = user; 10 } 11 }
3、struts.xml中
1 <action name="*" class="com.action.UserAction"> 2 <!-- 类型转换失败、输入校验失败,转入该页面 --> 3 <result name="input">/regist.jsp</result> 4 <result>/show.jsp</result> 5 </action>
4、UserAction-validation.xml:
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE validators PUBLIC 3 "-//OpenSymphony Group//XWork Validator 1.0.3//EN" 4 "http://www.opensymphony.com/xwork/xwork-validator-1.0.3.dtd"> 5 <validators> 6 <!-- 校验Action的name属性 --> 7 <field name="user.userName"> 8 <!-- 指定name属性必须满足必填规则 --> 9 <field-validator type="requiredstring"> 10 <param name="trim">true</param> 11 <message>必须输入名字</message> 12 </field-validator> 13 <!-- 指定name属性必须匹配正则表达式 --> 14 <field-validator type="regex"> 15 <param name="expression"><![CDATA[(w{4,25})]]></param> 16 <message>您输入的用户名只能是字母和数字 17 ,且长度必须在4到25之间</message> 18 </field-validator> 19 </field> 20 <!-- 校验Action的pass属性 --> 21 <field name="user.password"> 22 <!-- 指定pass属性必须满足必填规则 --> 23 <field-validator type="requiredstring"> 24 <param name="trim">true</param> 25 <message>必须输入密码</message> 26 </field-validator> 27 <!-- 指定pass属性必须满足匹配指定的正则表达式 --> 28 <field-validator type="regex"> 29 <param name="expression"><![CDATA[(w{4,25})]]></param> 30 <message>您输入的密码只能是字母和数字 31 ,且长度必须在4到25之间</message> 32 </field-validator> 33 </field> 34 </validators>
二、我又实现了这样的功能:我的action中有很多的处理逻辑,我在struts.xml中只配置了一个action,也就是使用了使用了动态结果配置:
<action name="user_*" class="action.UserAction" method="{1}">;那么在验证错误时,由于validator文件默认有一个input返回结果值,我怎样才能也配置为动态的返回页面呢?
我使用了如下方法:
<action name="user_*_*" class="action.UserAction" method="{1}">
<result name="input">/{2}.jsp</result>
之后写在action目录下的validator文件改为:action名字 + -action别名 + -validation.xml
action的别名在此即为:"user_*_*"的实际的名字,在我的系统里是:UserAction-user_regist_regist-validation.xml
下面的是从别人那里copy过来的,个人觉得比较好,收藏一下
一. 手动输入完成校验
1.普通的处理方式:只需要在action中重写validate()方法
2.一个action对应多个逻辑处理方法:指定校验摸个特定方法的方式:
重写validateXxxx()方法。Eg:如果,只校验login方法,则只需重写validateLogin().
二. 输入校验流程:
1. 类型转换器负责对字符串的请求参数执行类型转换。并将这些值设置成Action的属性值。
2. 转换过程中若出现异常,则将异常信息保存到ActionContext中,conversionError拦截器将其封装到fieldError中。
3. 通过反射调用validateXxx()方法。
4. 调用validate().
5. 如果未出现异常,则转入用户请求的处理方法,如果出现异常,则转入inout视图所指定的视图资源(所以,对于验证的方法,必须要在配置文件中为其指定input)。
三. 基于验证框架的输入校验
1. 编写校验配置文件:命名规则:action类名-validatin.xml.
2. 一个action对应多个逻辑处理方法:指定校验摸个特定方法的方式:
action类名-name属性名-validatin.xml.(name属性名:在strtus配置文件中的)
3. 配置文件存放位置:放在与Action相同的文件夹内。
4. 验证规则:先加载action类名-validatin.xml,
然后加载action类名-name属性名-validatin.xml文件。
5. 校验器的配置风格:两种:字段校验器,非字段校验器。
字段校验器配置格式:
<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>
非字段校验:先指定校验器:由谁来校验,来校验谁!
字段校验器:先指定校验的属性:我来校验谁,由谁来校验!