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",那么将会报错:

Java代码  
  1. 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
  2. The problematic instruction:
  3. ----------
  4. ==> list tag.getValidators(, column  in template/xhtml/form-close-validate.ftl]
  5. in include , column  in template/xhtml/form-close.ftl]
  6. ----------
  7. Java backtrace for programmers:
  8. ----------
  9. 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
  10. at freemarker.ext.beans.SimpleMethodModel.exec(SimpleMethodModel.java:)
  11. at freemarker.core.MethodCall._getAsTemplateModel(MethodCall.java:)
  12. at freemarker.core.Expression.getAsTemplateModel(Expression.java:)
  13. at freemarker.core.IteratorBlock.accept(IteratorBlock.java:)
  14. at freemarker.core.Environment.visit(Environment.java:)
  15. at freemarker.core.IteratorBlock$Context.runLoop(IteratorBlock.java:)
  16. at freemarker.core.Environment.visit(Environment.java:)
  17. at freemarker.core.IteratorBlock.accept(IteratorBlock.java:)
  18. at freemarker.core.Environment.visit(Environment.java:)
  19. at freemarker.core.MixedContent.accept(MixedContent.java:)
  20. at freemarker.core.Environment.visit(Environment.java:)
  21. at freemarker.core.ConditionalBlock.accept(ConditionalBlock.java:)
  22. at freemarker.core.Environment.visit(Environment.java:)
  23. at freemarker.core.MixedContent.accept(MixedContent.java:)
  24. at freemarker.core.Environment.visit(Environment.java:)
  25. at freemarker.core.Environment.include(Environment.java:)
  26. at freemarker.core.Include.accept(Include.java:)
  27. at freemarker.core.Environment.visit(Environment.java:)
  28. at freemarker.core.MixedContent.accept(MixedContent.java:)
  29. at freemarker.core.Environment.visit(Environment.java:)
  30. at freemarker.core.Environment.process(Environment.java:)
  31. at freemarker.template.Template.process(Template.java:)
  32. at org.apache.struts2.components.template.FreemarkerTemplateEngine.renderTemplate(FreemarkerTemplateEngine.java:)
  33. at org.apache.struts2.components.UIBean.mergeTemplate(UIBean.java:)
  34. at org.apache.struts2.components.UIBean.end(UIBean.java:)
  35. at org.apache.struts2.views.jsp.ComponentTagSupport.doEndTag(ComponentTagSupport.java:)
  36. at org.apache.jsp.index_jsp._jspx_meth_s_005fform_005f0(index_jsp.java:)
  37. at org.apache.jsp.index_jsp._jspService(index_jsp.java:)
  38. at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:)
  39. at javax.servlet.http.HttpServlet.service(HttpServlet.java:)
  40. at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:)
  41. at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:)
  42. at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:)
  43. at javax.servlet.http.HttpServlet.service(HttpServlet.java:)
  44. at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:)
  45. at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:)
  46. at org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:)
  47. at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:)
  48. at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:)
  49. at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:)
  50. at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:)
  51. at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:)
  52. at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:)
  53. at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:)
  54. at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:)
  55. at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:)
  56. at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:)
  57. at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:)
  58. at java.lang.Thread.run(Thread.java:)
  59. Caused by: java.lang.NullPointerException
  60. at com.opensymphony.xwork2.validator.AnnotationActionValidatorManager.buildValidatorKey(AnnotationActionValidatorManager.java:)
  61. at com.opensymphony.xwork2.validator.AnnotationActionValidatorManager.getValidators(AnnotationActionValidatorManager.java:)
  62. at com.opensymphony.xwork2.validator.AnnotationActionValidatorManager.getValidators(AnnotationActionValidatorManager.java:)
  63. at org.apache.struts2.components.Form.getValidators(Form.java:)
  64. at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  65. at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:)
  66. at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:)
  67. at java.lang.reflect.Method.invoke(Method.java:)
  68. at freemarker.ext.beans.BeansWrapper.invokeMethod(BeansWrapper.java:)
  69. at freemarker.ext.beans.SimpleMethodModel.exec(SimpleMethodModel.java:)
  70. ...  more
  71. -- :: org.apache.catalina.core.StandardWrapperValve invoke
  72. 严重: Servlet.service() for servlet jsp threw exception
  73. java.lang.NullPointerException
  74. at com.opensymphony.xwork2.validator.AnnotationActionValidatorManager.buildValidatorKey(AnnotationActionValidatorManager.java:)
  75. at com.opensymphony.xwork2.validator.AnnotationActionValidatorManager.getValidators(AnnotationActionValidatorManager.java:)
  76. at com.opensymphony.xwork2.validator.AnnotationActionValidatorManager.getValidators(AnnotationActionValidatorManager.java:)
  77. at org.apache.struts2.components.Form.getValidators(Form.java:)
  78. at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  79. at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:)
  80. at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:)
  81. at java.lang.reflect.Method.invoke(Method.java:)
  82. at freemarker.ext.beans.BeansWrapper.invokeMethod(BeansWrapper.java:)
  83. at freemarker.ext.beans.SimpleMethodModel.exec(SimpleMethodModel.java:)
  84. at freemarker.core.MethodCall._getAsTemplateModel(MethodCall.java:)
  85. at freemarker.core.Expression.getAsTemplateModel(Expression.java:)
  86. at freemarker.core.IteratorBlock.accept(IteratorBlock.java:)
  87. at freemarker.core.Environment.visit(Environment.java:)
  88. at freemarker.core.IteratorBlock$Context.runLoop(IteratorBlock.java:)
  89. at freemarker.core.Environment.visit(Environment.java:)
  90. at freemarker.core.IteratorBlock.accept(IteratorBlock.java:)
  91. at freemarker.core.Environment.visit(Environment.java:)
  92. at freemarker.core.MixedContent.accept(MixedContent.java:)
  93. at freemarker.core.Environment.visit(Environment.java:)
  94. at freemarker.core.ConditionalBlock.accept(ConditionalBlock.java:)
  95. at freemarker.core.Environment.visit(Environment.java:)
  96. at freemarker.core.MixedContent.accept(MixedContent.java:)
  97. at freemarker.core.Environment.visit(Environment.java:)
  98. at freemarker.core.Environment.include(Environment.java:)
  99. at freemarker.core.Include.accept(Include.java:)
  100. at freemarker.core.Environment.visit(Environment.java:)
  101. at freemarker.core.MixedContent.accept(MixedContent.java:)
  102. at freemarker.core.Environment.visit(Environment.java:)
  103. at freemarker.core.Environment.process(Environment.java:)
  104. at freemarker.template.Template.process(Template.java:)
  105. at org.apache.struts2.components.template.FreemarkerTemplateEngine.renderTemplate(FreemarkerTemplateEngine.java:)
  106. at org.apache.struts2.components.UIBean.mergeTemplate(UIBean.java:)
  107. at org.apache.struts2.components.UIBean.end(UIBean.java:)
  108. at org.apache.struts2.views.jsp.ComponentTagSupport.doEndTag(ComponentTagSupport.java:)
  109. at org.apache.jsp.index_jsp._jspx_meth_s_005fform_005f0(index_jsp.java:)
  110. at org.apache.jsp.index_jsp._jspService(index_jsp.java:)
  111. at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:)
  112. at javax.servlet.http.HttpServlet.service(HttpServlet.java:)
  113. at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:)
  114. at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:)
  115. at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:)
  116. at javax.servlet.http.HttpServlet.service(HttpServlet.java:)
  117. at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:)
  118. at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:)
  119. at org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:)
  120. at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:)
  121. at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:)
  122. at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:)
  123. at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:)
  124. at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:)
  125. at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:)
  126. at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:)
  127. at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:)
  128. at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:)
  129. at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:)
  130. at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:)
  131. 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.字段风格

Xml代码  
  1. <field name="">
  2. <validator type="" short-circuit="">
  3. ...
  4. </validator>
  5. </field>

b.非字段风格

Xml代码  
  1. <validator type="" short-circuit="">
  2. <param name="fieldName">value</param>
  3. ...
  4. </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"/>

最新文章

  1. 关于Window Server2008 服务器上无法播放音频文件的解决方案
  2. 可惜Java中没有yield return
  3. jquery easyui-datagrid/treegrid 清空数据参考
  4. Oracle在中文环境下出现乱码解决办法
  5. Beta版本——项目测试
  6. 软件工程——sprint 1回顾总结
  7. Memcached 笔记与总结(2)编译 php-memcache 扩展
  8. java中Date的getTime() 方法奇葩问题
  9. 简短总结一下C#里跨线程更新UI
  10. MVC_学习笔记_2_Authorize
  11. .net调用java webservice基于JBOSS服务器 学习笔记(一)
  12. css文件都写在一个里面还是每个页面都引用单独的css样式好?
  13. 启动APEX
  14. MySQL &#183; 引擎特性 &#183; InnoDB Buffer Pool
  15. win10添加右键打开命令窗口
  16. idea使用的小技巧总结
  17. [转]如何将mysql表结构导出成Excel格式的(并带备注)
  18. C++ 函数模板重载
  19. bzoj3637(lct)
  20. mxnet自定义dataloader加载自己的数据

热门文章

  1. puppet实战之master-agent
  2. Log4j官方文档翻译(四、如何在java中输出日志消息)
  3. 【bzoj1146】[CTSC2008]网络管理Network 倍增LCA+dfs序+树状数组+主席树
  4. 【Luogu】P3750分手是祝愿(期望DP)
  5. POJ1848 Tree 【树形dp】
  6. php合并图片
  7. 【22】Vue 之 Vue Devtools
  8. iOS飘雪的动画小demo
  9. 使用 swagger组件给asp.net webapi文档生成
  10. Spring Boot学习——数据库操作及事务管理