`
zc4530
  • 浏览: 85594 次
  • 性别: Icon_minigender_1
  • 来自: 长春
社区版块
存档分类
最新评论

Struts原理与实践(6)

阅读更多

本文我们来讨论一下Struts中的输入校验问题。我们知道,信息系统有垃圾进垃圾出的特点,为了避免垃圾数据的输入,对输入进行校验是任何信息系 统都要面对的问题。在传统的编程实践中,我们往往在需要进行校验的地方分别对它们进行校验,而实际上需要校验的东西大多都很类似,如必需的字段、日期、范 围等等。因此,应用程序中往往到处充斥着这样一些显得冗余的代码。而与此形成鲜明对照的是Struts采用Validator框架(Validator框 架现在是Jakarta Commons项目的一部分)来解决校验问题,它将校验规则代码集中到外部的且对具体的应用程序中立的.xml文件中,这样,就将那些到处出现的校验逻辑 从应用程序中分离出来,任何一个Struts应用都可以使用这个文件,同时还为校验规则的扩展提供了便利。更难能可贵的是由于Validator框架将校 验中要用到的一些消息等信息与资源绑定有机结合在一起,使得校验部分的国际化编程变得十分的便捷和自然。

    Validator框架大致有如下几个主要组件:

    Validators:是Validator框架调用的一个Java类,它处理那些基本的通用的校验,包括required、mask(匹配正则表达式)、最小长度、最大长度、范围、日期等

    .xml配置文件:主要包括两个配置文件,一个是validator-rules.xml,另一个是validation.xml。前者的内容主要包含一些校验规则,后者则包含需要校验的一些form及其组件的集合。

    资源绑定:提供(本地化)标签和消息,缺省地共享struts的资源绑定。即校验所用到的一些标签与消息都写在ApplicationResources.properity文件中。

    Jsp tag:为给定的form或者action path生成JavaScript validations。

    ValidatorForm:它是ActionForm的一个子类。

    为了对Validator框架有一个比较直观的认识,我们还是以前面的登陆例子的输入来示范一下Validator框架的使用过程:

    首先,找一个validator-rules.xml文件放在mystruts\WEB-INF目录下,下面是该文件中涉及到的required验证部分代码的清单:

 

  1. <validator name="required"  
  2. <!--①-->  
  3.             classname="org.apache.struts.validator.FieldChecks"  
  4.                method="validateRequired"  
  5.          methodParams="java.lang.Object,   
  6.                        org.apache.commons.validator.ValidatorAction,   
  7.                        org.apache.commons.validator.Field,   
  8.                        org.apache.struts.action.ActionErrors,   
  9. javax.servlet.http.HttpServletRequest"   
  10. <!--②-->  
  11.                   msg="errors.required">  
  12. <!--③-->  
  13.          <javascript><![CDATA[ </span> </li> <li class=""><span><span class="cdata">            function validateRequired(form) { </span> </span></li> <li class="alt"><span><span class="cdata">                var isValid = true; </span> </span></li> <li class=""><span><span class="cdata">                var focusField = null; </span> </span></li> <li class="alt"><span><span class="cdata">                var i = 0; </span> </span></li> <li class=""><span><span class="cdata">                var fields = new Array(); </span> </span></li> <li class="alt"><span><span class="cdata">                oRequired = new required(); </span> </span></li> <li class=""><span><span class="cdata">                for (x in oRequired) { </span> </span></li> <li class="alt"><span><span class="cdata">                    var field = form[oRequired[x][0]]; </span> </span></li> <li class=""><span><span class="cdata">                     </span> </span></li> <li class="alt"><span><span class="cdata">                    if (field.type == 'text' || </span> </span></li> <li class=""><span><span class="cdata">                        field.type == 'textarea' || </span> </span></li> <li class="alt"><span><span class="cdata">                        field.type == 'file' || </span> </span></li> <li class=""><span><span class="cdata">                        field.type == 'select-one' || </span> </span></li> <li class="alt"><span><span class="cdata">                        field.type == 'radio' || </span> </span></li> <li class=""><span><span class="cdata">                        field.type == 'password') { </span> </span></li> <li class="alt"><span><span class="cdata">                         </span> </span></li> <li class=""><span><span class="cdata">                        var value = ''; </span> </span></li> <li class="alt"><span><span class="cdata">                // get field's value </span> </span></li> <li class=""><span><span class="cdata">                if (field.type == "select-one") { </span> </span></li> <li class="alt"><span><span class="cdata">                var si = field.selectedIndex; </span> </span></li> <li class=""><span><span class="cdata">                if (si >= 0) { </span> </span></li> <li class="alt"><span><span class="cdata">                value = field.options[si].value; </span> </span></li> <li class=""><span><span class="cdata">                            } </span> </span></li> <li class="alt"><span><span class="cdata">                        } else { </span> </span></li> <li class=""><span><span class="cdata">                            value = field.value; </span> </span></li> <li class="alt"><span><span class="cdata">                        } </span> </span></li> <li class=""><span><span class="cdata">                         </span> </span></li> <li class="alt"><span><span class="cdata">                        if (trim(value).length == 0) { </span> </span></li> <li class=""><span><span class="cdata">                         </span> </span></li> <li class="alt"><span><span class="cdata">                            if (i == 0) { </span> </span></li> <li class=""><span><span class="cdata">                                focusField = field; </span> </span></li> <li class="alt"><span><span class="cdata">                            } </span> </span></li> <li class=""><span><span class="cdata">                            fields[i++] = oRequired[x][1]; </span> </span></li> <li class="alt"><span><span class="cdata">                            isValid = false; </span> </span></li> <li class=""><span><span class="cdata">                        } </span> </span></li> <li class="alt"><span><span class="cdata">                    } </span> </span></li> <li class=""><span><span class="cdata">                } </span> </span></li> <li class="alt"><span><span class="cdata">                if (fields.length > 0) { </span> </span></li> <li class=""><span><span class="cdata">                   focusField.focus(); </span> </span></li> <li class="alt"><span><span class="cdata">                   alert(fields.join('\n')); </span> </span></li> <li class=""><span><span class="cdata">                } </span> </span></li> <li class="alt"><span><span class="cdata">                return isValid; </span> </span></li> <li class=""><span><span class="cdata">            } </span> </span></li> <li class="alt"><span><span class="cdata">             </span> </span></li> <li class=""><span><span class="cdata">            // Trim whitespace from left and right sides of s. </span> </span></li> <li class="alt"><span><span class="cdata">            function trim(s) { </span> </span></li> <li class=""><span><span class="cdata">                return s.replace( /^\s*/, "" ).replace( /\s*$/, "" ); </span> </span></li> <li class="alt"><span><span class="cdata">            } </span> </span></li> <li class=""><span><span class="cdata">             </span> </span></li> <li class="alt"><span><span class="cdata">            ]>  
  14.          </javascript>  
  15.   
  16. </validator>  



    ① 节的代码是引用一个服务器边的验证器,其对应的代码清单如下: 

 

  1. public static boolean validateRequired(Object bean,   
  2.                                            ValidatorAction va, Field field,   
  3.                                            ActionErrors errors,   
  4.                                            HttpServletRequest request) {   
  5.   
  6.         String value = null;   
  7.         if (isString(bean)) {   
  8.             value = (String) bean;   
  9.         } else {   
  10.             value = ValidatorUtil.getValueAsString(bean, field.getProperty());   
  11.         }   
  12.            
  13.         if (GenericValidator.isBlankOrNull(value)) {   
  14.             errors.add(field.getKey(), Resources.getActionError(request, va, field));   
  15.             return false;   
  16.         } else {   
  17.             return true;   
  18.         }   
  19. }  



    ② 节是验证失败后的出错信息,要将对应这些键值的信息写入到ApplicationResources.properity文件中,常见的错误信息如下: 

 

  1. # Standard error messages for validator framework checks   
  2. errors.required={0} is required.   
  3. errors.minlength={0} can not be less than {1} characters.   
  4. errors.maxlength={0} can not be greater than {1} characters.   
  5. errors.invalid={0} is invalid.   
  6. errors.byte={0} must be a byte.   
  7. errors.short={0} must be a short.   
  8. errors.integer={0} must be an integer.   
  9. errors.long={0} must be a long.   
  10. errors.float={0} must be a float.   
  11. errors.double={0} must be a double.   
  12. errors.date={0} is not a date.   
  13. errors.range={0} is not in the range {1} through {2}.   
  14. errors.creditcard={0} is an invalid credit card number.   
  15. errors.email={0} is an invalid e-mail address.  



    ③ 节的代码用于客户边的JavaScript验证

其次,在validation.xml文件中配置要验证的form极其相应的字段,下面是该文件中的代码: 

 

  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <!DOCTYPE form-validation PUBLIC "-//Apache Software Foundation   </span></li> <li class="alt"><span>//DTD Commons Validator Rules Configuration 1.0//EN"    
  3. "http://jakarta.apache.org/commons/dtds/validator_1_0.dtd">  
  4. <form-validation>  
  5. <formset>  
  6. <form name="userInfoForm">  
  7. <field property="username"  
  8. depends="required,mask,minlength,maxlength">  
  9. <arg0 key="logon.jsp.prompt.username" resource="true"/>  
  10. <arg1 name="minlength" key="${var:minlength}" resource="false"/>  
  11. <arg1 name="maxlength" key="${var:maxlength}" resource="false"/>  
  12. <var>  
  13. <var-name>mask</var-name>  
  14. <var-value>^\w</var-value>  
  15. </var>  
  16. <var>  
  17. <var-name>minlength</var-name>  
  18. <var-value>2</var-value>  
  19. </var>  
  20. <var>  
  21. <var-name>maxlength</var-name>  
  22. <var-value>16</var-value>  
  23. </var>  
  24. </field>  
  25. <field property="password"  
  26. depends="required,minlength,maxlength">  
  27. <arg0 key="logon.jsp.prompt.password" resource="true"/>  
  28. <arg1 name="minlength" key="${var:minlength}" resource="false"/>  
  29. <arg1 name="maxlength" key="${var:maxlength}" resource="false"/>  
  30. <var>  
  31. <var-name>minlength</var-name>  
  32. <var-value>2</var-value>  
  33. </var>  
  34. <var>  
  35. <var-name>maxlength</var-name>  
  36. <var-value>16</var-value>  
  37. </var>  
  38. </field>  
  39. </form>  
  40. </formset>  
  41. </form-validation>  



    这里要注意的是:该文中的<arg0 key="logon.jsp.prompt.username" resource="true"></arg0>和<arg0 key="logon.jsp.prompt.password" resource="true"></arg0>中的键值都是取自资源绑定中的。前面还讲到了出错信息也是写入ApplicationResources.properity文件中,因此,这就为国际化提供了一个很好的基础。

    再次,为了使服务器边的验证能够进行,将用到的formBean从ActionForm的子类改为ValidatorForm的子类,即:
    将public class UserInfoForm extends ActionForm改为:public class UserInfoForm extends ValidatorForm

    到此,进行服务器边的验证工作已经一切准备得差不多了,此时,只要完成最后步骤就可以实验服务器边的验证了。但大多数情况下,人们总希望把这些基本的简单验证放在客户边进行。

    为了能进行客户边的验证,我们还要对logon.jsp文件做适当的修改。

    将<ccid_nobr></ccid_nobr>

  1. <html:form action="/logonAction.do" focus="username">  

改为

 

  1. <html:form action="/logonAction.do" focus="username" 
  2.                    onsubmit="return validateUserInfoForm(this)">  



    在标签后加上:

  1. <html:javascript dynamicJavascript="true" staticJavascript="true" 
  2.                                                   formName="userInfoForm"/>  



    最后,对struts的配置文件struts-config.xml作适当的修改:
    1、将<ccid_nobr></ccid_nobr>

  1. <action input="/logon.jsp" name="userInfoForm"  
  2.  path="/logonAction" scope="session" type="action.LogonAction" validate="false" >  

改为

  1. <action input="/logon.jsp" name="userInfoForm"    
  2. path="/logonAction" scope="session" type="action.LogonAction" validate="true" >  

其作用是要求进行校验

    2、将下列代码放在struts-config.xml文件中的标签前。其作用是将用于校验的各个组件结合在一起。 

  1. <plug-in className="org.apache.struts.validator.ValidatorPlugIn">  
  2.     <set-property property="pathnames"  
  3.     value="/WEB-INF/validator-rules.xml,/WEB-INF/validation.xml" />  
  4. </plug-in>  


    到此为止,我们的一切工作准备就绪,您可以享受自己的劳动成果了,试着输入各种组合的用户名和口令,看看它们的验证效果。仔细体会你会发现,服务器边的验证要更全面一些,比如对password的字符长度的验证。
分享到:
评论

相关推荐

    Struts原理与实践.mht

    Struts原理与实践(1) - Java - New - JavaEye论坛.mht

    Struts原理与实践

    ### Struts原理与实践 #### 一、Struts框架概览 **Struts**框架,作为Java Web开发领域内的一款成熟且广泛应用的框架,自问世以来便受到开发者们的青睐。Struts框架的核心设计理念在于实现MVC(Model-View-...

    Struts原理与实践(罗会波)

    罗会波的《Struts原理与实践》这本书深入浅出地解析了Struts的核心概念和技术,帮助开发者全面理解和掌握这一框架。 1. **MVC设计模式**:Struts将Web应用的业务逻辑、数据模型和用户界面分离,使得开发者可以独立...

    Struts原理与实践(五).rar

    在本资料"Struts原理与实践(五)"中,我们将深入探讨Struts的核心概念、工作流程以及实际应用中的关键点。 首先,Struts框架的基础是MVC模式。Model代表业务逻辑,View负责显示,Controller则协调这两者。在Struts...

    Struts原理与实践(一) .rar

    Struts是Java Web开发中的一个开源框架,由Apache软件基金会维护。它主要基于Model-View-Controller(MVC)设计模式,旨在简化企业...通过阅读《Struts原理与实践(一)》PDF文档,可以更深入地了解和掌握Struts框架。

    struts原理与实践(三)

    本文主要讨论Struts中JDBC的工作原理以及在实践中的基本配置。 一、JDBC工作原理 JDBC是Java平台提供的一个标准API,它允许Java应用程序与各种类型的数据库进行通信。JDBC的核心包括两个包:java.sql和javax.sql。...

    struts原理与实践+指导JAVA学习阶段需研究的开源项目

    提供的文档可能涵盖了这些主题,从"struts原理与实践(1).doc"到"struts原理与实践(7).doc"逐步深入,"Java学习阶段需研究的开源项目.doc"则可能介绍了一些相关的Java学习资源。阅读这些文档将有助于全面理解和掌握...

    初探Struts原理与实践.doc

    6. ActionServlet与RequestDispatcher:Struts的ActionServlet接收请求后,通过RequestDispatcher将请求转发给相应的Action,Action执行完毕后,再通过Dispatcher返回响应到合适的视图。 通过Struts,开发者可以...

    Struts原理与实践(二).rar

    在"Struts原理与实践(二)"这个主题中,我们将深入探讨Struts框架的核心概念、工作原理以及实际应用。 **1. Struts框架的核心组件** - **ActionServlet**: Struts框架的核心控制器,负责接收HTTP请求,解析请求...

    struts原理与实践二)

    在本文中,我们将深入理解Struts的基本原理,并通过一个简单的登录示例来演示其工作流程。 首先,我们需要了解MVC模式。在MVC架构中,Model负责处理数据和业务逻辑,View负责展示用户界面,而Controller则作为两者...

    struts原理与实践(一)

    Struts 是一个开源的Java Web应用程序框架,专为构建企业级Web应用而设计。它遵循Model-View-Controller (MVC)设计模式,旨在...通过学习和实践Struts,开发者可以更好地理解和掌握Web应用的架构设计,提升自身技能。

    struts原理与实践(七)

    Struts 是一个基于MVC(Model-View-Controller)设计模式的Java Web应用程序框架,它主要负责处理用户请求,管理业务逻辑,以及与视图层的交互。在本篇文章中,我们将深入探讨如何利用Struts 实现一个文章发布系统,...

    Struts原理与实践(三).rar

    Struts 2继续发展,提供了与现代开发工具和实践的集成,如RESTful API支持、AJAX集成等。 通过深入理解Struts的工作原理,开发者可以更好地利用其特性,提高开发效率,同时也能为将来学习其他MVC框架打下坚实的基础...

    struts原理与实践(六)

    此外,由于校验规则与具体应用分离,它们可以被多个不同的表单重用,降低了代码重复。客户端的JavaScript验证还可以提供即时反馈,提高用户体验。总的来说,Struts的Validator框架是处理Web应用输入校验的一种强大而...

    struts原理与实践(四)

    Struts 是一个流行的Java Web开发框架,主要用于...在实践中,开发者需要关注字符集的转换,确保在客户端和服务器之间传输数据时不会丢失或混淆信息。同时,合理地组织和管理资源文件,可以使代码更整洁,更容易维护。

    struts原理与实践(五)

    Struts 是一个经典的Java Web开发框架,主要用于构建MVC(模型-视图-控制器)架构的应用程序。在国际化(i18n)编程方面,Struts 提供了强大的支持,使得应用能够根据用户所在地区和语言环境显示相应的内容。本文将...

    struts2 原理与实践

    在本文中,我们将深入探讨Struts2的原理和实践,以一个简单的登录示例来阐述其关键组件和工作流程。 首先,我们来看一下开发Struts2应用的基本步骤: 1. **定义视图(Views)**:视图通常由JSP页面组成,负责展示...

    Struts+spring+hibernate学习笔记! - Struts原理与实践 - JavaEye知识库.files

    下面将详细介绍这三个框架的基本概念、工作原理以及它们如何协同工作。 首先,Struts 是 Apache 软件基金会的一个项目,它的主要目的是提供一种结构化的、可扩展的方式来构建基于 Java 的 Web 应用。Struts 通过 ...

Global site tag (gtag.js) - Google Analytics