`

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("${tagName}") as validator [on line 46, column 9 in template/xhtml/form-close-validate.ftl]
 in include "/${parameters.templateDir}/xhtml/form-close-validate.ftl" [on line 25, column 1 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:130)
	at freemarker.core.MethodCall._getAsTemplateModel(MethodCall.java:93)
	at freemarker.core.Expression.getAsTemplateModel(Expression.java:89)
	at freemarker.core.IteratorBlock.accept(IteratorBlock.java:94)
	at freemarker.core.Environment.visit(Environment.java:210)
	at freemarker.core.IteratorBlock$Context.runLoop(IteratorBlock.java:167)
	at freemarker.core.Environment.visit(Environment.java:417)
	at freemarker.core.IteratorBlock.accept(IteratorBlock.java:102)
	at freemarker.core.Environment.visit(Environment.java:210)
	at freemarker.core.MixedContent.accept(MixedContent.java:92)
	at freemarker.core.Environment.visit(Environment.java:210)
	at freemarker.core.ConditionalBlock.accept(ConditionalBlock.java:79)
	at freemarker.core.Environment.visit(Environment.java:210)
	at freemarker.core.MixedContent.accept(MixedContent.java:92)
	at freemarker.core.Environment.visit(Environment.java:210)
	at freemarker.core.Environment.include(Environment.java:1483)
	at freemarker.core.Include.accept(Include.java:169)
	at freemarker.core.Environment.visit(Environment.java:210)
	at freemarker.core.MixedContent.accept(MixedContent.java:92)
	at freemarker.core.Environment.visit(Environment.java:210)
	at freemarker.core.Environment.process(Environment.java:190)
	at freemarker.template.Template.process(Template.java:237)
	at org.apache.struts2.components.template.FreemarkerTemplateEngine.renderTemplate(FreemarkerTemplateEngine.java:157)
	at org.apache.struts2.components.UIBean.mergeTemplate(UIBean.java:559)
	at org.apache.struts2.components.UIBean.end(UIBean.java:513)
	at org.apache.struts2.views.jsp.ComponentTagSupport.doEndTag(ComponentTagSupport.java:42)
	at org.apache.jsp.index_jsp._jspx_meth_s_005fform_005f0(index_jsp.java:226)
	at org.apache.jsp.index_jsp._jspService(index_jsp.java:103)
	at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
	at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:384)
	at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:320)
	at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:266)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:88)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:228)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:104)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:216)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:634)
	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:445)
	at java.lang.Thread.run(Thread.java:619)
Caused by: java.lang.NullPointerException
	at com.opensymphony.xwork2.validator.AnnotationActionValidatorManager.buildValidatorKey(AnnotationActionValidatorManager.java:219)
	at com.opensymphony.xwork2.validator.AnnotationActionValidatorManager.getValidators(AnnotationActionValidatorManager.java:76)
	at com.opensymphony.xwork2.validator.AnnotationActionValidatorManager.getValidators(AnnotationActionValidatorManager.java:72)
	at org.apache.struts2.components.Form.getValidators(Form.java:265)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at freemarker.ext.beans.BeansWrapper.invokeMethod(BeansWrapper.java:840)
	at freemarker.ext.beans.SimpleMethodModel.exec(SimpleMethodModel.java:106)
	... 48 more
2011-8-18 0:17:17 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:219)
	at com.opensymphony.xwork2.validator.AnnotationActionValidatorManager.getValidators(AnnotationActionValidatorManager.java:76)
	at com.opensymphony.xwork2.validator.AnnotationActionValidatorManager.getValidators(AnnotationActionValidatorManager.java:72)
	at org.apache.struts2.components.Form.getValidators(Form.java:265)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at freemarker.ext.beans.BeansWrapper.invokeMethod(BeansWrapper.java:840)
	at freemarker.ext.beans.SimpleMethodModel.exec(SimpleMethodModel.java:106)
	at freemarker.core.MethodCall._getAsTemplateModel(MethodCall.java:93)
	at freemarker.core.Expression.getAsTemplateModel(Expression.java:89)
	at freemarker.core.IteratorBlock.accept(IteratorBlock.java:94)
	at freemarker.core.Environment.visit(Environment.java:210)
	at freemarker.core.IteratorBlock$Context.runLoop(IteratorBlock.java:167)
	at freemarker.core.Environment.visit(Environment.java:417)
	at freemarker.core.IteratorBlock.accept(IteratorBlock.java:102)
	at freemarker.core.Environment.visit(Environment.java:210)
	at freemarker.core.MixedContent.accept(MixedContent.java:92)
	at freemarker.core.Environment.visit(Environment.java:210)
	at freemarker.core.ConditionalBlock.accept(ConditionalBlock.java:79)
	at freemarker.core.Environment.visit(Environment.java:210)
	at freemarker.core.MixedContent.accept(MixedContent.java:92)
	at freemarker.core.Environment.visit(Environment.java:210)
	at freemarker.core.Environment.include(Environment.java:1483)
	at freemarker.core.Include.accept(Include.java:169)
	at freemarker.core.Environment.visit(Environment.java:210)
	at freemarker.core.MixedContent.accept(MixedContent.java:92)
	at freemarker.core.Environment.visit(Environment.java:210)
	at freemarker.core.Environment.process(Environment.java:190)
	at freemarker.template.Template.process(Template.java:237)
	at org.apache.struts2.components.template.FreemarkerTemplateEngine.renderTemplate(FreemarkerTemplateEngine.java:157)
	at org.apache.struts2.components.UIBean.mergeTemplate(UIBean.java:559)
	at org.apache.struts2.components.UIBean.end(UIBean.java:513)
	at org.apache.struts2.views.jsp.ComponentTagSupport.doEndTag(ComponentTagSupport.java:42)
	at org.apache.jsp.index_jsp._jspx_meth_s_005fform_005f0(index_jsp.java:226)
	at org.apache.jsp.index_jsp._jspService(index_jsp.java:103)
	at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
	at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:384)
	at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:320)
	at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:266)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:88)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:228)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:104)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:216)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:634)
	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:445)
	at java.lang.Thread.run(Thread.java:619)



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文件里的内容。


转载请注明出处:http://383984216-qq-com.iteye.com/admin/blogs/1151938
1
4
分享到:
评论

相关推荐

    struts2 类型转换 数据校验

    在Struts2中,类型转换和数据校验是两个关键的特性,它们确保了用户输入的数据能够准确无误地被处理和验证,从而提高了应用的安全性和可靠性。 **类型转换(Type Conversion)** 在Struts2中,类型转换是自动进行...

    struts2标签+校验+SSH

    与Struts1相比,Struts2具有显著的优势,包括更少的侵入性设计、支持AOP编程的拦截器、类型转换器、多样的表现层技术以及更灵活的数据校验机制。 首先,Struts2的无侵入式设计使得应用程序不再紧密依赖Servlet API...

    Struts2类型转换与输入校验 .zip

     熟悉和掌握Struts2自定义类型转换。  熟悉和掌握Struts2内建校验的操作方法  实验环境与设备:  已经接入局域网的网络实验室,机器上装有IE浏览器等;  strtus2.5.8  实验内容: (1) 编写一个...

    struts2类型转换 拦截器 校验的例子

    Struts2是一个强大的Java web框架,它为开发者提供了丰富的功能,包括类型转换、拦截器和校验机制。本文将深入探讨这些关键知识点,并通过实际例子来帮助你理解它们的工作原理和应用。 首先,我们来看看**类型转换...

    Struts2+Hibernate+Spring项目小结――Struts2部分总结

    Struts2作为MVC框架,提供了丰富的功能和灵活性来处理表单验证、错误处理和服务端校验等问题。理解并熟练运用上述知识点,能够帮助开发者构建出更加健壮、用户体验良好的Web应用。在实际项目中,还需要结合Hibernate...

    struts2+spring+hibernate配置

    Struts2提供了丰富的内置拦截器,如异常处理、参数校验等,同时支持多种结果类型,如JSP、FreeMarker、Velocity等视图技术。它还支持Action与Result之间的类型转换,以及OGNL(Object-Graph Navigation Language)...

    struts2学习笔记三(第3讲.Struts2的类型转换)

    Struts2是一个强大的Java web框架,它为开发者提供了丰富的功能,包括MVC设计模式的实现、类型转换、国际化、拦截器等。在本篇“Struts2学习笔记三”中,我们将聚焦于Struts2的类型转换这一核心特性。类型转换在处理...

    struts2的输入校验

    struts2的输入校验有两种方式: 一.重写validate()方式 二.采用配置文件的方式 先我们就以一个简单的登录的例子来讲解这个吧. 重点讲解下,第二个采用配置文件的方式: 1.添加一个xml的校验文件,保存在...

    Struts2的输入校验

    1. 类型转换器:Struts2将接收到的字符串参数转换为相应的数据类型,并将这些值赋给Action的属性。如果在此过程中发生异常,异常信息会被保存并由`conversionError`拦截器处理。 2. 客户端校验:Struts2支持在...

    struts2.1+json+jquery用户名校验

    在Struts2中,我们可以使用JSON插件来方便地将Java对象转换为JSON格式的字符串,然后通过HTTP响应发送到前端。在这个案例中,后端可能会有一个Action,该Action获取用户名并检查其是否已存在,如果存在,返回一个...

    Struts2输入校验总结

    5. **内置校验器**:Struts2提供了丰富的内置校验器,覆盖了从简单的类型检查到复杂的数据验证。例如`required`用于检查字段是否为空,`int`和`double`用于数值类型检查,`email`用于电子邮件地址验证等。 综上所述...

    spring+struts1+hibernate+jbpm实例

    Struts1提供了ActionForm、Controller和Tiles等组件,用于处理用户请求、校验数据和呈现视图。在这个实例中,Struts1可能作为前端控制器,负责接收HTTP请求并调用后端服务。 **Hibernate ORM**:Hibernate是一个...

    struts2+spring+hibernate分页显示

    6. **Struts2响应**:Action将结果转换为JSON或其它格式,通过ActionResult返回给前端,前端根据返回的分页信息更新UI。 7. **前端渲染**:前端拿到数据后,使用JavaScript或前端框架(如Vue、React)动态渲染分页...

    struts2+spring+bibernate

    此外,Struts2还提供了强大的拦截器机制,可以方便地实现如权限控制、数据校验等功能。Struts2的配置文件通常为struts.xml,用于定义Action及其跳转路径。 **Spring** 是一个全面的Java应用框架,核心特性包括依赖...

    java Struts2+hibernate+Spring整合的通讯录

    (3) 用户注册,需要通过Struts2字段校验判断用户注册页面中的用户名、密码、年龄、出生日期、邮箱等是否符合校验规则。设置用户名,密码的非空判断和最小及最大长度,两次密码输入是否一致,设置年龄范围,设置出生...

    struts2校验器类型详解

    ### Struts2校验器类型详解 #### 一、Struts2内建校验器 在探讨Struts2校验器之前,我们首先需要了解这些校验器是如何被定义和集成到框架中的。如文中所述,Struts2的内建校验器主要位于`xwork-2.0.4.jar`压缩包中...

    struts2+json+ext+tree

    在Struts2中,我们可以使用JSON插件来实现服务器端数据到JSON的转换,使得前端可以方便地获取并显示这些数据。例如,我们可能会有一个Action类,其execute方法返回一个包含树形结构数据的JSON对象。 EXT是一个基于...

    struts2-处理类型转换

    在处理用户输入和业务逻辑交互时,Struts2提供了强大的类型转换和校验机制,以确保数据的有效性和安全性。以下是对给定内容的详细解释: **类型转换** 在Struts2中,当用户通过表单提交数据时,所有参数默认都以...

    struts2+spring +hibernater 整合

    Struts2、Spring和Hibernate是Java企业级开发中三大核心框架,它们的整合通常被称为SSH2(Struts2、Spring、Hibernate)。这个整合的主要目的是为了实现MVC(Model-View-Controller)架构,提高代码的可维护性、可...

Global site tag (gtag.js) - Google Analytics