许可优化
许可优化
产品
产品
解决方案
解决方案
服务支持
服务支持
关于
关于
软件库
当前位置:服务支持 >  软件文章 >  DynaActionForm是什么?优势与使用场景

DynaActionForm是什么?优势与使用场景

阅读数 16
点赞 0
article_banner

随着页面的增 多,ActionForm的数量也会急剧膨胀。对ActionForm类的维护会成为一件耗时、费力的工作。而且每个ActionForm都只是简单、重 复地收集、验证属性,然后再把它们传递给业务逻辑Bean。引入DynaActionForm类就是要试图解决这个问题。DynaActionForm使 你不必创建一个个具体的ActionForm类,为每个bean的属性编写get/set方法。你只需在Struts的配置文件中列出 DynaActionForm的属性、类型、缺省值,这样可以大大地减少工作量。

下面的struts-config.xml的XML片断会配置出一个带有givenName、familyName两个字段的UserForm bean

<form-bean     name="UserForm"     type="org.apache.struts.action.DynaActionForm">    <form-property         name="givenName"         type="java.lang.String"         initial="John"/>    <form-property         name="familyName"         type="java.lang.String"         initial="Smith"/></form-bean>

DynaActionForm支持以下数据类型:

  • java.lang.BigDecimal
  • java.lang.BigInteger
  • boolean and java.lang.Boolean
  • byte and java.lang.Byte
  • char and java.lang.Character
  • java.lang.Class
  • double and java.lang.Double
  • float and java.lang.Float
  • int and java.lang.Integer
  • long and java.lang.Long
  • short and java.lang.Short
  • java.lang.String
  • java.sql.Date
  • java.sql.Time
  • java.sql.Timestamp

DynaActionForm还支持由这些数据类型构成的数组(比如String)、Map接口的实 现类(比如java.util.HashMap)、 List接口的实现类(如 java.util.ArrayList)。如果你没有给属性设定初值,数字类属性会自动设定为0,对象类属性设定为null。如果使用基本的 Struts标志库访问DynaActionForm对象的属性,访问的方法和访问普通ActionForm对象的方法相同。你还可以用 bean:define来显示DynaActionForm的属性(当然用bean:define不会创建DynaActionForm实例,因为创建 DynaActionForm需要有恰当的动态属性(dyna-properties))。

如果你使用的是Struts JSTL EL标签库,JSTL访问ActionForm和DynaActionForm的语法是不同的。JSTL表达式语法只能直接访问普通的 ActionForm对象的属性。要访问DynaActionForm的属性必须稍加修改。Struts JSTL EL用类似以下的语法来访问ActionForm属性:
𝑓𝑜𝑟𝑚𝑏𝑒𝑎𝑛.𝑝𝑟𝑜𝑝访问𝐷𝑦𝑛𝑎𝐴𝑐𝑡𝑖𝑜𝑛𝐹𝑜𝑟𝑚属性的语法则需要修改为:   f o r m b e a n . p r o p  访  问 DynaActionForm 属  性  的  语  法  则  需  要  修  改  为  :   {formbean.prop} 访问DynaActionForm属性的语法则需要修改为: {dynabean.map.prop}
map是DynaActionForm的一个Hashmap属性,而且这个map包含了DynaActionForm的属性 (DynaActionForm将属性保存在一个HashMap类对象中)。如果你的ActionForm使用的是简单的属性和标准的验证,而且只需把这 些属性传递到另一个JavaBean(用BeanUtils.copyProperties(myBusinessBean,form))。完成这样的任 务DynaActionForm会是一个很好的解决方案。

DynaActionForm并不只是ActionForm的"丢进来" 替代品(drop-in replacement)。如果你要在Action中访问ActionForm的属性,你就会用到map-style的访问器,类似 myForm.get(“name”)。如果你要在Action中频繁地使用ActionForm对象,我建议你还是选择普通的ActionForm对 象。 DynaActionForm必须要由一个带参数的构造函数来初始化。为了模仿其他的属性,在他们的构造中包含了很多方法。对你而言,要生成一个 DynaActionForm,则必须由Struts通过ActionMapping来实现。

通过扩展DynaActionForm你可以实现自己的validate和reset方法。并在 struts-config.xml指定你的DynaActionForm子类。然而,我们不能混淆普通属性和动态属性 (DynaProperties)。Java类的反射机制无法在DynaActionForm中找到普通的getter和setter方法。如果要使用 Struts的验证器,你需要把form-bean类指定为 org.apache.struts.validator.ValidatorActionForm或是它的子类。


支持Map的ActionForm(Map-backed ActionForm)

DynaActionForm类可以根据我们在Struts配置文件中的列举出来的属性在初始化的时 候创建ActionForm。但在某些情况下HTML窗体需要动态生成的。这些ActionForm窗体的属性事先我们并不知道,那么我们要如何动态地创 建ActionForm属性呢?要解决这个问题我们必须要依靠一种新的解决方法。

Struts允许将属性保存在一个Map类对象中。你可以把窗体中动态字段的数据存储到Map中。下面是一个支持Map的ActionForm的例子:

public FooForm extends ActionForm {    private final Map values = new HashMap();    public void setValue(String key, Object value) {        values.put(key, value);    }    public Object getValue(String key) {        return values.get(key);    }}

在JSP页面中,你可以用mapname(keyname)这样的符号来访问存储在map中的值。用这样的语法访问属性意味着:

  • mapname属性多半支持map接口,而且是根据String建立索引的。
  • Struts根据通过get(String key)/set(String key ,Object value)方法找到正确的子属性(sub-property)值。Struts会从括弧中取出keyname的值,并在调用get/set方法的时候使用。

这是一个简单的例子: <html:text property="value(foo)"/> 这个标志会以”foo”为参数调用FooForm的getValue方法,最后这个方法会返回"foo"的属性值。如果你想要根据动态的属性名生成一个窗 体,你可以参考下面的代码:

<%   for (int i = 0; i < 10; i++) {       String name = "value(foo-" + i + ")";%>  <html:text property="<%= name %>"/>  <br/><%  }%>

你可能已经注意到了我们并没有指定name的值。map-backed属性名任由你定义,同一个bean中你甚至可以定义多个map-backed属性。

除了map-backed属性,你还可以生成list-backed(支持list接口)的属性。和map-backed属性一样,你也要在bean中创建如下的get/set方法。

public FooForm extends ActionForm {    private final List values = new ArrayList();    public void setValue(int key, Object value) {        values.set(key, value);    }    public Object getValue(int key) {        return values.get(key);    }}

在显示页面中你还可以通过使用特定的符号访问list-backed属性。方括弧中的属性名包含了以下的意思:

  • listname属性(多半支持list接口)是根据String建立索引的。
  • Struts应该根据带int类型key参数的get/set方法找到正确的子属性(sub-property)值。

虽然map-backed ActionForm向我们提供了更多的灵活性。但是一些常规ActionForm和 DynaActionForm能用的语法在map-backed ActionForm却得不到支持。


整理于:

http://hi.baidu.com/mychaoyue2011/blog/item/ee6840fb78847e5aa645720.html


二)


使用表单是网页里面经常遇到的事情.利用struts的标签可以很好的完成这一功能.在struts中表单分为两种.一种是ActionForm..另外一种是DynaActionForm.所谓动态是在使用表单时不需要创建对就的bean文件.ActionForm很简单,在此只说说DynaActionForm.因为在这个小项目中在很多的用户输入.数据验证部分我放到了Action中进行.于是在表示层Form中只是接收数据.用DynaActionForm实现是个很好的选择.

DynaActionForm提供了一种方便的机制,从根本上消除了编写ActionForm的需要。DynaActionForm可允许动态的表单属性。这意味着你能够在你的struts-config.xml文件中定义属性并且将表单类型设置为org.apache.struts.action.DynaActionForm。什么都不需要写。DynaActionForm使用Apache公共项目中的DynaBean完成这些操作。这一动态的行为是通过反射(reflection)与哈希图(Hashmaps)提供的。

index.jsp

<TABLE border="0" width="100%" height="40px">
               
<TR>
                   
<TD >
                       
<html:form action="/selectAction" method="POST">    
                                      选择文法:
                                   <html:select property="select_grammar" >
                                       
<html:options collection="grammarCollection"
                                                           property
="label"
                                                           labelProperty
="label"/>
                                   
</html:select>
                                   
<p>
                                      输入文法:                  
                                   
<logic:present name="SELECTED_GRAMMAR" scope="request">
                                   
<span id="thegrammar">        
                                       <html:textarea   cols="40"value="${SELECTED_GRAMMAR}">
                                       
</html:textarea>*    
                                   </span>      
                                   </logic:present>
                                   
<p>
                               
<html:checkbox property="first" value="true" />:求first集合 <br>
                               
<html:checkbox property="follow" value="true" />:求follow集合<br>
                               
<html:checkbox property="select" value="true" />:求select集合 <br>
                               
<html:submit/>
                               
<html:reset/>
                               
</html:form>                    
                   </TD>
               
</TR>
</TABLE>

这个页面中和使用静态表单没什么区别,只是在struts-config.xm配置稍微有些不同.

<form-bean name="selectForm" type="org.apache.struts.action.DynaActionForm">
     
<form-property name="select_grammar" type="java.lang.String" />
     
<form-property name="selected_grammar" type="java.lang.String" />
     
<form-property name="first" type="java.lang.Boolean" />
     
<form-property name="select" type="java.lang.Boolean"/>  
     <form-property name="follow" type="java.lang.Boolean"/>      
</form-bean>

对应此表单的Action的配置:

<action path="/selectAction"
                   type
="ysu.cs.icai.action.selectAction" //定义的处理提交的类
                   input
="/index.jsp"
                   name
="selectForm"
                   validate
="false"
                   scope
="request">
               
<forward name="SUCCESS_PATH" path="/selectindex.do"/>
</action>

和ActionForm的不同之处还在于在Action中获取提交的参数时要将ActionForm强制转换为DynaActionForm:

DynaActionForm analyzeForm = (DynaActionForm) form;

如何获取各参数如下:

import org.apache.struts.action.DynaActionForm;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
/** *//**
       * Method execute
       *
@param mapping
       * @param form
       * @param request
       * @param response
       * @return ActionForward
    */
public class selectAction extends Action ...{

public ActionForward execute(
          ActionMapping mapping,
          ActionForm form,
          HttpServletRequest request,
      HttpServletResponse response) ...{
          DynaActionForm analyzeForm = (DynaActionForm) form;//强制
          String grammar=(String)analyzeForm.get("selected_grammar");    
          Boolean first=(Boolean)analyzeForm.get("first");//
          Boolean follow=(Boolean)analyzeForm.get("follow");//
          Boolean select=(Boolean)analyzeForm.get("select");//获取提交的各个参数.
//......something about what     you what todo.........
   return mapping.findForward("SUCCESS_PATH");
}
}

动态表单有很多优点.比如可以实现跨页的表单提交.还过也有缺点比如此时它就不能将validate框架集成到里面.有个方法就是可心自己继承DynaActionForm类在其中添加validate方法.再将实际的应用中的Form继承此类.不过此时的将失去使用DynaActionForm的灵活性


收集于:

http://hi.baidu.com/fei112/blog/item/173cd5c402b833a88326ac41.html


免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删



相关文章
技术文档
QR Code
微信扫一扫,欢迎咨询~
customer

online

联系我们
武汉格发信息技术有限公司
湖北省武汉市经开区科技园西路6号103孵化器
电话:155-2731-8020 座机:027-59821821
邮件:tanzw@gofarlic.com
Copyright © 2023 Gofarsoft Co.,Ltd. 保留所有权利
遇到许可问题?该如何解决!?
评估许可证实际采购量? 
不清楚软件许可证使用数据? 
收到软件厂商律师函!?  
想要少购买点许可证,节省费用? 
收到软件厂商侵权通告!?  
有正版license,但许可证不够用,需要新购? 
联系方式 board-phone 155-2731-8020
close1
预留信息,一起解决您的问题
* 姓名:
* 手机:

* 公司名称:

姓名不为空

姓名不为空

姓名不为空
手机不正确

手机不正确

手机不正确
公司不为空

公司不为空

公司不为空