网站风格: 红 | 蓝
搜索:  全站?
首页 |  Java开发 |  DOTNET开发 |  PHP开发 |  ASP技术 |  Web开发 |  数据库应用 |  网络文摘 |  作品集 |  下载 |  留言
文章聚合
  J2EE  |   框架技术  |   Javascript  |   AJAX  |   J2ee Server  |   J2ME  |
  WinForm开发  |   Asp.net  |   C#语言  |   服务器  |   第三方控件  |
  PHP笔记  |   Linux  |   第三方代码  |
  ASP教程  |   ASP实用代码  |   ASP笔记  |   服务器  |
  CSS样式表  |   Photoshop设计  |   Flash  |   HTML 小技巧  |   Dreamweaver  |   XML技术  |
  SQL Server  |   Oracle  |   MySQL  |
  散文  |   幽默  |   杂文  |
  Web 项目  |   杂七杂八  |
  第三方代码  |   实用工具  |   作品下载  |   帮助文档  |
奇点网 - Java开发 - 框架技术 - Struts框架学习笔记三
Struts框架学习笔记三
来源:http://www.7dit.com     作者:7dit     发布日期:2008-10-28 00:48:42   点击量:167
Struts扩展应用

在基础应用中,一般只是对Action作扩展

1. 再度扩展Action, 使用其中的DispatchAction, 看名字就知道该类用于分发请求。 当我们通过login.do?on传递请求时,当有大量的传参可选性时,可采用DispatchAction

该Action中不再需要excute()方法。取而代之的是与参数同名的方法 on() 其方法参数与返回值以及使用都与excute相同。 可以联想DispatchAction中应用的主要技术就是反射。

2. ActionServlet的扩展。 很多时候,我们可能需要对ActionServlet进行扩展,以处理一些无法或无需通过Action处理的请求。 思路很简单,即继承定义一个ActionServlet,并配置web.xml让容器加载该Servlet

重写相关的doGet/doPost/init方法。 super.doGet(); super.doPost(); super.init(); 而后进行自定义的编码

3. ActionForm的进一步应用。
观察ActionForm类,还有两个方法
 public ActionErrors validate(ActionMapping mapping,
  // TODO Auto-generated method stub
  return null;
 }
 public void reset(ActionMapping mapping, HttpServletRequest request) {
  // TODO Auto-generated method stub
 }
 
 即验证方法与重置方法。 reset很简单,即当重置表单时对请求的处理,运用的比较少。关注validate
 
 简单例子
 public ActionErrors validate(ActionMapping mapping,
   HttpServletRequest request) {
  ActionErrors ae = new ActionErrors();
  if(usr.getUname().equals(""))
  {
   ae.add("errUname", new ActionMessage("errUname"));
   //ae.add("errUname", new ActionError("errUname"));
  }
  if(usr.getUpwd().equals(""))
  {
   ae.add("errUpwd", new ActionMessage("errUpwd"));
   //ae.add("errUpwd", new ActionError("errUpwd"));
  }
  return ae;
 }
 
 ActionErrors存放的是一个哈希表,表中存放键值对应的错误提示。 提示内容以键的方式存放于资源文档中,通过new ActionMessage(...key...)可以实例一个消息。
 而ActionErrors中的key则对应界面表单中<html:errors property="errUname"/> property的值必需对应ActionErrors中的key, 在配置Struts的文档中配置input的值。则会自动跳转至该页。并在相应的标签处输出错误信息。
 
 PS: 配置文档与properties文档一样,对中文的支持是基于ASCII码,因此需要通过相关程序或插件进行转换。
 
4. DynaValidatorForm / DynaActionForm 动态ActionForm的使用
框架的目的在学习中会渐渐有些清晰, 框架要我们做的是将对象分离出程序, 通过xml对程序进行配置, 完成程序的功能。 而程序的编码中只关注控制注程与算法。

因此,象formbean这样的bean对象,自然也可能被分离到XML中,在XML配置表单对象以及相关属性,请容器完成对象的实例工作。


在Struts的配置文档中原先自定义的ActionForm被动态ActionForm取代

  <form-bean name="loginForm"
   type="org.apache.struts.action.DynaActionForm">
   <form-property name="user"
    type="com.p0703.strutstest.entity.User">
   </form-property>
  </form-bean>
  在这里就建立起formbean与jsp页中的form的映射关系
  
  在Action中获取到的ActionForm自然就变成了DynaActionForm,该类提供了get与set方法。通过键名,即在配置文档中的属性名,获取到相对应的bean对象或数据
  
  User user = (User)actionform.get("user");  actionform.set("user",user);
  
  
  
  
  
  
5. 继续扩展ActionForm, 简单的配置DynaActionForm似乎忽略了原来ActionForm中的validate方法, 要进行验证表单数据,struts提供了第三个FormBean类: DynaValidatorForm

同样也是在配置文档中进行描述,不同的是多了一个对验证规则的配置。 要进行验证, 还需要一个插件类, 在资源配置的下方作如下编写

 <message-resources
  parameter="com.p0703.strutstest.web.ApplicationResources_zh_cn" />
 <plug-in className="org.apache.struts.validator.ValidatorPlugIn"> <!-- 这就是验证的插件类 -->
  <set-property property="pathnames"
   value="/WEB-INF/validator-rules.xml,/WEB-INF/validation.xml" /> <!-- 该类对两个xml配置文档进行读取配置,并实例后进行工作 -->
 </plug-in>
 
validator-rules.xml  :  看名字就知道是定义了验证规则的配置文档 , 在myeclips中能自动生成该文档的基本内容。如下

 


<!DOCTYPE form-validation PUBLIC
          "-//Apache Software Foundation//DTD Commons Validator Rules Configuration 1.1.3//EN"
          "http://jakarta.apache.org/commons/dtds/validator_1_1_3.dtd">
<!--
  $Id: validator-rules.xml,v 1.1.2.1 2006/07/01 20:50:46 eugene-proddev Exp $

   This file contains the default Struts Validator pluggable validator
   definitions.  It should be placed somewhere under /WEB-INF and
   referenced in the struts-config.xml under the plug-in element
   for the ValidatorPlugIn.

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

   These are the default error messages associated with
   each validator defined in this file.  They should be
   added to your projects ApplicationResources.properties
   file or you can associate new ones by modifying the
   pluggable validators msg attributes in this file.

   # Struts Validator Error Messages
   errors.required={0} is required.
   errors.minlength={0} can not be less than {1} characters.
   errors.maxlength={0} can not be greater than {1} characters.
   errors.invalid={0} is invalid.

   errors.byte={0} must be a byte.
   errors.short={0} must be a short.
   errors.integer={0} must be an integer.
   errors.long={0} must be a long.
   errors.float={0} must be a float.
   errors.double={0} must be a double.

   errors.date={0} is not a date.
   errors.range={0} is not in the range {1} through {2}.
   errors.creditcard={0} is an invalid credit card number.
   errors.email={0} is an invalid e-mail address.

   Note: Starting in Struts 1.2.0 the default javascript definitions have
         been consolidated to commons-validator. The default can be overridden
         by supplying a <javascript> element with a CDATA section, just as
         in struts 1.1.

-->

<form-validation>

   <global>

      <validator name="required"
            classname="org.apache.struts.validator.FieldChecks"
               method="validateRequired"
         methodParams="java.lang.Object,
                       org.apache.commons.validator.ValidatorAction,
                       org.apache.commons.validator.Field,
                       org.apache.struts.action.ActionMessages,
                       org.apache.commons.validator.Validator,
                       javax.servlet.http.HttpServletRequest"
                  msg="errors.required"/>

      <validator name="requiredif"
                 classname="org.apache.struts.validator.FieldChecks"
                 method="validateRequiredIf"
                 methodParams="java.lang.Object,
                               org.apache.commons.validator.ValidatorAction,
                               org.apache.commons.validator.Field,
                               org.apache.struts.action.ActionMessages,
                               org.apache.commons.validator.Validator,
                               javax.servlet.http.HttpServletRequest"
                 msg="errors.required"/>

      <validator name="validwhen"
          msg="errors.required"
                 classname="org.apache.struts.validator.validwhen.ValidWhen"
                 method="validateValidWhen"
                 methodParams="java.lang.Object,
                       org.apache.commons.validator.ValidatorAction,
                       org.apache.commons.validator.Field,
                       org.apache.struts.action.ActionMessages,
                       org.apache.commons.validator.Validator,
                       javax.servlet.http.HttpServletRequest"/>


      <validator name="minlength"
            classname="org.apache.struts.validator.FieldChecks"
               method="validateMinLength"
         methodParams="java.lang.Object,
                       org.apache.commons.validator.ValidatorAction,
                       org.apache.commons.validator.Field,
                       org.apache.struts.action.ActionMessages,
                       org.apache.commons.validator.Validator,
                       javax.servlet.http.HttpServletRequest"
              depends=""
                  msg="errors.minlength"
           jsFunction="org.apache.commons.validator.javascript.validateMinLength"/>


      <validator name="maxlength"
            classname="org.apache.struts.validator.FieldChecks"
               method="validateMaxLength"
         methodParams="java.lang.Object,
                       org.apache.commons.validator.ValidatorAction,
                       org.apache.commons.validator.Field,
                       org.apache.struts.action.ActionMessages,
                       org.apache.commons.validator.Validator,
                       javax.servlet.http.HttpServletRequest"
              depends=""
                  msg="errors.maxlength"
           jsFunction="org.apache.commons.validator.javascript.validateMaxLength"/>

 

      <validator name="mask"
            classname="org.apache.struts.validator.FieldChecks"
               method="validateMask"
         methodParams="java.lang.Object,
                       org.apache.commons.validator.ValidatorAction,
                       org.apache.commons.validator.Field,
                       org.apache.struts.action.ActionMessages,
                       org.apache.commons.validator.Validator,
                       javax.servlet.http.HttpServletRequest"
              depends=""
                  msg="errors.invalid"/>


      <validator name="byte"
            classname="org.apache.struts.validator.FieldChecks"
               method="validateByte"
         methodParams="java.lang.Object,
                       org.apache.commons.validator.ValidatorAction,
                       org.apache.commons.validator.Field,
                       org.apache.struts.action.ActionMessages,
                       org.apache.commons.validator.Validator,
                       javax.servlet.http.HttpServletRequest"
              depends=""
                  msg="errors.byte"
       jsFunctionName="ByteValidations"/>


      <validator name="short"
            classname="org.apache.struts.validator.FieldChecks"
               method="validateShort"
         methodParams="java.lang.Object,
                       org.apache.commons.validator.ValidatorAction,
                       org.apache.commons.validator.Field,
                       org.apache.struts.action.ActionMessages,
                       org.apache.commons.validator.Validator,
                       javax.servlet.http.HttpServletRequest"
              depends=""
                  msg="errors.short"
       jsFunctionName="ShortValidations"/>


      <validator name="integer"
            classname="org.apache.struts.validator.FieldChecks"
               method="validateInteger"
         methodParams="java.lang.Object,
                       org.apache.commons.validator.ValidatorAction,
                       org.apache.commons.validator.Field,
                       org.apache.struts.action.ActionMessages,
                       org.apache.commons.validator.Validator,
                       javax.servlet.http.HttpServletRequest"
              depends=""
                  msg="errors.integer"
       jsFunctionName="IntegerValidations"/>

 

      <validator name="long"
            classname="org.apache.struts.validator.FieldChecks"
               method="validateLong"
         methodParams="java.lang.Object,
                       org.apache.commons.validator.ValidatorAction,
                       org.apache.commons.validator.Field,
                       org.apache.struts.action.ActionMessages,
                       org.apache.commons.validator.Validator,
                       javax.servlet.http.HttpServletRequest"
              depends=""
                  msg="errors.long"/>


      <validator name="float"
            classname="org.apache.struts.validator.FieldChecks"
               method="validateFloat"
         methodParams="java.lang.Object,
                       org.apache.commons.validator.ValidatorAction,
                       org.apache.commons.validator.Field,
                       org.apache.struts.action.ActionMessages,
                       org.apache.commons.validator.Validator,
                       javax.servlet.http.HttpServletRequest"
              depends=""
                  msg="errors.float"
       jsFunctionName="FloatValidations"/>

      <validator name="double"
            classname="org.apache.struts.validator.FieldChecks"
               method="validateDouble"
         methodParams="java.lang.Object,
                       org.apache.commons.validator.ValidatorAction,
                       org.apache.commons.validator.Field,
                       org.apache.struts.action.ActionMessages,
                       org.apache.commons.validator.Validator,
                       javax.servlet.http.HttpServletRequest"
              depends=""
                  msg="errors.double"/>


      <validator name="date"
            classname="org.apache.struts.validator.FieldChecks"
               method="validateDate"
         methodParams="java.lang.Object,
                       org.apache.commons.validator.ValidatorAction,
                       org.apache.commons.validator.Field,
                       org.apache.struts.action.ActionMessages,
                       org.apache.commons.validator.Validator,
                       javax.servlet.http.HttpServletRequest"
              depends=""
                  msg="errors.date"
       jsFunctionName="DateValidations"/>


      <validator name="intRange"
            classname="org.apache.struts.validator.FieldChecks"
               method="validateIntRange"
         methodParams="java.lang.Object,
                       org.apache.commons.validator.ValidatorAction,
                       org.apache.commons.validator.Field,
                       org.apache.struts.action.ActionMessages,
                       org.apache.commons.validator.Validator,
                       javax.servlet.http.HttpServletRequest"
              depends="integer"
                  msg="errors.range"/>


      <validator name="floatRange"
            classname="org.apache.struts.validator.FieldChecks"
               method="validateFloatRange"
         methodParams="java.lang.Object,
                       org.apache.commons.validator.ValidatorAction,
                       org.apache.commons.validator.Field,
                       org.apache.struts.action.ActionMessages,
                       org.apache.commons.validator.Validator,
                       javax.servlet.http.HttpServletRequest"
              depends="float"
                  msg="errors.range"/>

      <validator name="doubleRange"
            classname="org.apache.struts.validator.FieldChecks"
               method="validateDoubleRange"
         methodParams="java.lang.Object,
                       org.apache.commons.validator.ValidatorAction,
                       org.apache.commons.validator.Field,
                       org.apache.struts.action.ActionMessages,
                       org.apache.commons.validator.Validator,
                       javax.servlet.http.HttpServletRequest"
              depends="double"
                  msg="errors.range"/>


      <validator name="creditCard"
            classname="org.apache.struts.validator.FieldChecks"
               method="validateCreditCard"
         methodParams="java.lang.Object,
                       org.apache.commons.validator.ValidatorAction,
                       org.apache.commons.validator.Field,
                       org.apache.struts.action.ActionMessages,
                       org.apache.commons.validator.Validator,
                       javax.servlet.http.HttpServletRequest"
              depends=""
                  msg="errors.creditcard"/>


      <validator name="email"
            classname="org.apache.struts.validator.FieldChecks"
               method="validateEmail"
         methodParams="java.lang.Object,
                       org.apache.commons.validator.ValidatorAction,
                       org.apache.commons.validator.Field,
                       org.apache.struts.action.ActionMessages,
                       org.apache.commons.validator.Validator,
                       javax.servlet.http.HttpServletRequest"
              depends=""
                  msg="errors.email"/>

      <validator name="url"
            classname="org.apache.struts.validator.FieldChecks"
               method="validateUrl"
         methodParams="java.lang.Object,
                       org.apache.commons.validator.ValidatorAction,
                       org.apache.commons.validator.Field,
                       org.apache.struts.action.ActionMessages,
                       org.apache.commons.validator.Validator,
                       javax.servlet.http.HttpServletRequest"
              depends=""
                  msg="errors.url"/>

     <!--
       This simply allows struts to include the validateUtilities into a page, it should
       not be used as a validation rule.
     -->
     <validator name="includeJavaScriptUtilities"
            classname=""
               method=""
         methodParams=""
              depends=""
                  msg=""
           jsFunction="org.apache.commons.validator.javascript.validateUtilities"/>

   </global>
</form-validation>

- -!!  好长。 每一个<validator /> 中者是一个验证规则, name就是该规则的键名, classname则是该验证所使用到的类, method为验证所要用到的方法 , methodParams为该验证方法的参数列表类型 , 而比较重要的一个是msg,表示通过struts的消息机制存放于资源文档中的验证完所需的提示消息,这一点在普通的ActionForm的validate方法中就使用到了。

要再细作说明的是msg中的关键字对应的是第一个以此关键字为键名的资源文件中的值。 而这个值的冗余部份依然可以再作封装。 在规则文档的注释部份已有说明。如
error.required = {0} is required

当然这只是说明, 真正对该键值定义应当在资源文档中. {0} 就是一个可变的占位符

规则定义完毕后

开始配置验证真正要工作的配置文件  /WEB-INF/validation.xml

例: (短多啦)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE form-validation PUBLIC "-//Apache Software Foundation//DTD Commons Validator Rules Configuration 1.0//EN" "http://jakarta.apache.org/commons/dtds/validator_1_0.dtd">
<form-validation>
 <formset>
  <form name="loginForm">   -- 指定要进行验证的ActionForm, 这里就是指前面定义的DynaValidatorForm的实例名,即对象名
   <field property="user.loginName" depends="required"> 指定具体属性字段的验证方法 required是规则中的具体的规则的name
    <arg0 key="display.loginName"/> arg0 /arg1....这就是要显示相关信息的占位符的键值  ,即在required的验证规则中我们定义了 error.required消息
    为{0} is required。 而在0位要显示的文字也定义在资源文件中, 并以display.loginName为键名
   </field>
   <field property="user.password" depends="required,minlength,maxlength">
    <arg0 key="display.password"/>
    <arg1 key="display.password.min"/>
   </field>
  </form>
 </formset>
</form-validation>

完成所有定义与配置后,struts就会进行表单的验证了, 要如何输出呢? 即定义页面<html:errors property="user.loginName" /> 这个键来源于 <field property="user.loginName" />  实际上,这是定义了一个以此属性名为键名的输出区,因此不仅是<html:errors />标签,所有的可示的表单元都可以定义该键名以显示信息。


PS:  好像很复杂。 不过与JS相比虽然繁索,却很强大,而且相当安全。


 
标签:   框架  |  struts  |  Java  |
留言 | 链接 | 标签 | 风格: 红 蓝   
Copyright © 2005 奇点中文网--7dit.com
闽ICP备05001292号