struts2类型转换+校验
1.action中validate()与validateXxx()
用于action执行前的校验,如果校验失败,跳到input视图,
前者校验整个Action;
后者校验该Action中的Xxx方法.
如果两者都有,则validateXxx方法会先调用。
2.struts2中输入校验的流程
a.类型转换器将用户请求字符串的参数转化为java类型,并将其设为Action的属性值。
b.如果转换过程中出现异常,异常将保存在ActionContext中,conversionError拦截器负责将其封装到fieldError中,否则直接到c,类型转换完毕。
c.通过反射调用validateXxx(),然后调用validate()。
d.如果上面3步没有出现fieldError,则调用action的处理请求方法,否则跳到input视图.
3.struts2校验框架
校验配置文件的DTD在xword-core-2.2.3.jar中,系统自带的校验器的xml配置文件是
xword-core-2.2.3.jar里的com.opensymphony.xword2.vilidator.validators.default.xml文件
校验配置文件名称必须为
ActionClassName-validation.xml:Action类名-validation.xml
ActionClassName-ActoinAliasName-validation.xml:Action类名-类别名-validation.xml
类别名为在struts.xml中action的name属性名。
如果要输出国际化信息,则使用<message
key="资源文件键名">或<message>${getText("资源文件键名")</message>
以上是服务器校验,如果需要客户端校验,可以在提供了服务器校验的基础上,在<s:form>中添加validation="true"属
性,这样,客户端会根据服务端校验框架自动生产客户端的javascript语句,但不是所有的系统自带校验器都支持生成客户端校验脚本。
注:如果配置的自带的校验器不支持生成客户端脚本,而客户端form又设置了validation="true",那么将会报错:


- Method public java.util.List org.apache.struts2.components.Form.getValidators(java.lang.String) threw an exception when invoked on org.apache.struts2.components.Form@5810af
- The problematic instruction:
- ----------
- ==> list tag.getValidators(, column in template/xhtml/form-close-validate.ftl]
- in include , column in template/xhtml/form-close.ftl]
- ----------
- Java backtrace for programmers:
- ----------
- freemarker.template.TemplateModelException: Method public java.util.List org.apache.struts2.components.Form.getValidators(java.lang.String) threw an exception when invoked on org.apache.struts2.components.Form@5810af
- at freemarker.ext.beans.SimpleMethodModel.exec(SimpleMethodModel.java:)
- at freemarker.core.MethodCall._getAsTemplateModel(MethodCall.java:)
- at freemarker.core.Expression.getAsTemplateModel(Expression.java:)
- at freemarker.core.IteratorBlock.accept(IteratorBlock.java:)
- at freemarker.core.Environment.visit(Environment.java:)
- at freemarker.core.IteratorBlock$Context.runLoop(IteratorBlock.java:)
- at freemarker.core.Environment.visit(Environment.java:)
- at freemarker.core.IteratorBlock.accept(IteratorBlock.java:)
- at freemarker.core.Environment.visit(Environment.java:)
- at freemarker.core.MixedContent.accept(MixedContent.java:)
- at freemarker.core.Environment.visit(Environment.java:)
- at freemarker.core.ConditionalBlock.accept(ConditionalBlock.java:)
- at freemarker.core.Environment.visit(Environment.java:)
- at freemarker.core.MixedContent.accept(MixedContent.java:)
- at freemarker.core.Environment.visit(Environment.java:)
- at freemarker.core.Environment.include(Environment.java:)
- at freemarker.core.Include.accept(Include.java:)
- at freemarker.core.Environment.visit(Environment.java:)
- at freemarker.core.MixedContent.accept(MixedContent.java:)
- at freemarker.core.Environment.visit(Environment.java:)
- at freemarker.core.Environment.process(Environment.java:)
- at freemarker.template.Template.process(Template.java:)
- at org.apache.struts2.components.template.FreemarkerTemplateEngine.renderTemplate(FreemarkerTemplateEngine.java:)
- at org.apache.struts2.components.UIBean.mergeTemplate(UIBean.java:)
- at org.apache.struts2.components.UIBean.end(UIBean.java:)
- at org.apache.struts2.views.jsp.ComponentTagSupport.doEndTag(ComponentTagSupport.java:)
- at org.apache.jsp.index_jsp._jspx_meth_s_005fform_005f0(index_jsp.java:)
- at org.apache.jsp.index_jsp._jspService(index_jsp.java:)
- at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:)
- at javax.servlet.http.HttpServlet.service(HttpServlet.java:)
- at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:)
- at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:)
- at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:)
- at javax.servlet.http.HttpServlet.service(HttpServlet.java:)
- at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:)
- at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:)
- at org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:)
- at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:)
- at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:)
- at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:)
- at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:)
- at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:)
- at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:)
- at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:)
- at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:)
- at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:)
- at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:)
- at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:)
- at java.lang.Thread.run(Thread.java:)
- Caused by: java.lang.NullPointerException
- at com.opensymphony.xwork2.validator.AnnotationActionValidatorManager.buildValidatorKey(AnnotationActionValidatorManager.java:)
- at com.opensymphony.xwork2.validator.AnnotationActionValidatorManager.getValidators(AnnotationActionValidatorManager.java:)
- at com.opensymphony.xwork2.validator.AnnotationActionValidatorManager.getValidators(AnnotationActionValidatorManager.java:)
- at org.apache.struts2.components.Form.getValidators(Form.java:)
- at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
- at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:)
- at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:)
- at java.lang.reflect.Method.invoke(Method.java:)
- at freemarker.ext.beans.BeansWrapper.invokeMethod(BeansWrapper.java:)
- at freemarker.ext.beans.SimpleMethodModel.exec(SimpleMethodModel.java:)
- ... more
- -- :: org.apache.catalina.core.StandardWrapperValve invoke
- 严重: Servlet.service() for servlet jsp threw exception
- java.lang.NullPointerException
- at com.opensymphony.xwork2.validator.AnnotationActionValidatorManager.buildValidatorKey(AnnotationActionValidatorManager.java:)
- at com.opensymphony.xwork2.validator.AnnotationActionValidatorManager.getValidators(AnnotationActionValidatorManager.java:)
- at com.opensymphony.xwork2.validator.AnnotationActionValidatorManager.getValidators(AnnotationActionValidatorManager.java:)
- at org.apache.struts2.components.Form.getValidators(Form.java:)
- at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
- at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:)
- at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:)
- at java.lang.reflect.Method.invoke(Method.java:)
- at freemarker.ext.beans.BeansWrapper.invokeMethod(BeansWrapper.java:)
- at freemarker.ext.beans.SimpleMethodModel.exec(SimpleMethodModel.java:)
- at freemarker.core.MethodCall._getAsTemplateModel(MethodCall.java:)
- at freemarker.core.Expression.getAsTemplateModel(Expression.java:)
- at freemarker.core.IteratorBlock.accept(IteratorBlock.java:)
- at freemarker.core.Environment.visit(Environment.java:)
- at freemarker.core.IteratorBlock$Context.runLoop(IteratorBlock.java:)
- at freemarker.core.Environment.visit(Environment.java:)
- at freemarker.core.IteratorBlock.accept(IteratorBlock.java:)
- at freemarker.core.Environment.visit(Environment.java:)
- at freemarker.core.MixedContent.accept(MixedContent.java:)
- at freemarker.core.Environment.visit(Environment.java:)
- at freemarker.core.ConditionalBlock.accept(ConditionalBlock.java:)
- at freemarker.core.Environment.visit(Environment.java:)
- at freemarker.core.MixedContent.accept(MixedContent.java:)
- at freemarker.core.Environment.visit(Environment.java:)
- at freemarker.core.Environment.include(Environment.java:)
- at freemarker.core.Include.accept(Include.java:)
- at freemarker.core.Environment.visit(Environment.java:)
- at freemarker.core.MixedContent.accept(MixedContent.java:)
- at freemarker.core.Environment.visit(Environment.java:)
- at freemarker.core.Environment.process(Environment.java:)
- at freemarker.template.Template.process(Template.java:)
- at org.apache.struts2.components.template.FreemarkerTemplateEngine.renderTemplate(FreemarkerTemplateEngine.java:)
- at org.apache.struts2.components.UIBean.mergeTemplate(UIBean.java:)
- at org.apache.struts2.components.UIBean.end(UIBean.java:)
- at org.apache.struts2.views.jsp.ComponentTagSupport.doEndTag(ComponentTagSupport.java:)
- at org.apache.jsp.index_jsp._jspx_meth_s_005fform_005f0(index_jsp.java:)
- at org.apache.jsp.index_jsp._jspService(index_jsp.java:)
- at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:)
- at javax.servlet.http.HttpServlet.service(HttpServlet.java:)
- at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:)
- at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:)
- at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:)
- at javax.servlet.http.HttpServlet.service(HttpServlet.java:)
- at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:)
- at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:)
- at org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:)
- at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:)
- at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:)
- at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:)
- at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:)
- at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:)
- at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:)
- at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:)
- at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:)
- at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:)
- at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:)
- at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:)
- at java.lang.Thread.run(Thread.java:)
4.struts2校验文件的搜索顺序
如果定义了Test-validation.xml和Test-login-validation.xml两个文件,那么,系统对于login请求,会先
搜索Test-validation.xml文件,找到后并不停止搜索,而是继续找Test-login-validation.xml文件,如果两个都
找到的话,那么对login请求的验证为这两个文件的总和,而不是其中的一个,如果Test继承BaseTest的话,那么系统会先搜索BaseTest
类的两个校验文件,然后也不停止,继续找Test类的两个校验文件,然后将4个文件合并一起校验,如果其中有冲突,那么后找到的校验文件将覆盖先找到的校
验文件。
5.struts2校验文件的两种书写风格
a.字段风格


- <field name="">
- <validator type="" short-circuit="">
- ...
- </validator>
- </field>
b.非字段风格


- <validator type="" short-circuit="">
- <param name="fieldName">value</param>
- ...
- </validator>
其中short-circuit(短路)属性值为boolean,默认为false,即不支持短路
6.校验顺序玉短路原则
注:字段校验器指必须提供字段的校验器,而不是指字段校验风格,非字段同理。
校验顺序
a.所有非字校验器优先于字段校验器(所以,字段校验器永远不会影响非字段校验器)
b.所有字段与非字段风格按编写先后顺序执行
短路原则:
a.当非字段校验失败,则该字段的字段校验器不会获得校验机会,但不影响其他非字段校验
b.字段校验失败,则在此失败处代码以下的该字段的所有字段校验器不会获得校验机会
注:短路原则是为了不让一个字段同时出现多条验证失败的提示信息,如验证date不能为空且必须大于2000-01-01,那么如果输入的是空值且定义short-circuit="false"的话,页面将会显示这两种验证的message.
7.配置自定义的校验器
将default.xml文件复制到classes目录下,然后在里面添加自定义的校验器配置,因为如果定义了自己的校验器配置文件在classes目录下,那么系统将不再会加载default.xml文件里的内容。
8.错误处理:
服务器端验证其转换为客户端验证时,应该记住:jsp页面中<s:from action="login.action namespace="/" validate="true"/>
struts2类型转换+校验的更多相关文章
- Struts2数据校验
Struts2数据校验 1.常见数据校验方法 表单数据的校验方式: 表单中的数据必须被效验以后才能够被使用,常用的效验方式分为两种: 前台校验:也称之为客户端效验,主要是通过JS编程的方式进行表单数据 ...
- Struts2输入校验
1.编写校验规则文件 (<ActionName>-validation.xml),文件放在Action类文件相同的路径下校验失败返回input的result. <vali ...
- Struts2 更改校验配置文件位置
@(Java)[Struts|Interceptor] Struts2 更改校验配置文件位置 在Struts2中提供的拦截器校验ValidationInterceptor,该校验器中默认的配置文件位于 ...
- struts2 自定义校验规则
自定义校验规则:(了解) 在Struts2自定义校验规则: 1.实现一个Validator 接口. 2.一般开发中继承ValidatorSupport 或者 FieldValidatorSupport ...
- Struts2系列笔记(7)---Struts2类型转换
Struts2类型转换 struts2中内置了大量的类型转换器用来完成数据类型转换的问题,这篇随笔主要通过两个方面来写Struts类型转换 1:Struts2内置的类型转换器 2:如何自定义 ...
- struts2 之 struts2数据校验
1. 数据校验一般分为2类:前端的校验(js校验),后端的校验(java代码):实际开发中大部分情况下都是采用js校验.在对数据安全要求较高的情况下可能会采用后端验证. 2. Struts2提供了后 ...
- 14.怎样自学Struts2之Struts2类型转换[视频]
14.怎样自学Struts2之Struts2类型转换[视频] 之前写了一篇"打算做一个视频教程探讨怎样自学计算机相关的技术",优酷上传不了.仅仅好传到百度云上: http://pa ...
- struts2类型转换与校验总结
1.struts2的类型转换分为全部变量转变和局部变量转变. 2.struts2对8中常见的基本类型的属性变量,可以自动转换.如果是User对象,可以手动简历UserAction-coversion. ...
- 第六章、Struts2数据校验
一.三种实现方式 ① 用validate()方法实现数据校验 继承ActionSupport类,该类实现了Validateable接口,该接口中定义了一个validate()方法,在自定义的Actio ...
随机推荐
- 求解Catalan数,(大数相乘,大数相除,大数相加)
Catalan数 卡塔兰数是组合数学中一个常在各种计数问题中出现的数列.以比利时的数学家欧仁·查理·卡塔兰(1814–1894)命名.历史上,清代数学家明安图(1692年-1763年)在其<割圜 ...
- 【转】log4js在PM2的cluster模式下大坑
请直接查看原文:https://blog.yourtion.com/fix-log4js-with-pm2-not-work.html 之前一直使用 debug 还有 console.log 去打日志 ...
- 【bzoj2242】[SDOI2011]计算器 EXgcd+BSGS
题目描述 你被要求设计一个计算器完成以下三项任务: 1.给定y,z,p,计算Y^Z Mod P 的值: 2.给定y,z,p,计算满足xy≡ Z ( mod P )的最小非负整数: 3.给定y,z,p, ...
- nginx通过spawn-fcgi调用C++写的cgi程序
通过apt-get install 安装nginx和spawn-fcgi /usr/local/nginx/sbin/spawn-fcgi -a 127.0.0.1 -p 9002 -C 25 -f ...
- 3973: seq
3973: seq 题目描述 小y 的男朋友送给小y 一个数列{ai}{ai},并且刁难小y 要她维护这个序列. 具体而言,小y 的男朋友要求小y 完成两个操作: 1. 修改数列中的一个数 2. 设p ...
- P2647 最大收益 (动态规划)
题目链接 Solution 乍一看发现正着 DP,有明显的后效性,所以就反过来做. 但是同时发现很显然减去多的放后面明显更优,所以按 \(R\) 从大排序. 然后 \(f[i][j]\) 代表前 \( ...
- 分布式文件系统之Glusterfs
1.环境规划如下 centos7.4 三个节点一块 sdb 3G大小的测试硬盘 2.Glusterfs 卷的类型比较多,这里我们测试最常用的一种 Distributed Replicate ...
- jupyter的使用
shift+enter 运行程序 Tab 代码补全 shift+Tab 查看函数说明 shift+Tab+Tab 查看函数详细说明 https://www.dataquest.io/blog/jupy ...
- 【报错】IntelliJ IDEA中绿色注释扫描飘红报错解决
几天开机,突然发现自己昨天的项目可以运行,今天就因为绿色注释飘红而不能运行,很是尴尬: 解决办法如下: 1.在IDEA中的setting中搜索:"javadoc" 2.把Javad ...
- 【HugeChm】HugeChm制作chm帮助文档
1.下载软件:HugeChm.exe 2.开始打包: 3.选择开始打包即可