zoukankan      html  css  js  c++  java
  • 应用Map作为ActionForm的属性,动态增加ActionForm的“属性”

    通常情况下,我们要在ActionForm中为相应表单定义对应的私有属性,再通过Getter和Setter设置和获得表单的数据。

    但如果表单数据域比较多,那么就需要在ActionForm中为每个表单域定义一个私有属性并定义相应的Getter、Setter方法。

    解决方法有两种,一种是在ActionForm中定义一个Map私有属性,动态产生表单提交的数据域;另一种是使用DynaActionForm。

    这里,我想以一个例子介绍一下第一种方法。

    首先创建ActionForm类:TestForm
     1package form;
     2
     3import org.apache.struts.action.ActionForm;
     4import java.util.HashMap;
     5
     6public class TestForm extends ActionForm {
     7  private HashMap<String,Object> map = new HashMap<String,Object>();
     8
     9  public Object getValue(String key) {
    10    return map.get(key);
    11  }

    12
    13  public void setValue(String key,Object value) {
    14    map.put(key,value);
    15  }

    16
    17}

    请注意第7行,这里定义了一个私有变量,该变量是一个Map类。
    第9、13行分别定义了Getter和Setter方法,这里,Getter方法需要一个参数,用于传递表单域(即动态属性)的名称,Setter方法需要两个参数,分别是表单域名称和对应的值,这和传统的ActionForm的Getter和Setter有很大分别。

    然后创建Action类:TestAction

     1package action;
     2
     3import org.apache.struts.action.Action;
     4import org.apache.struts.action.ActionMapping;
     5import org.apache.struts.action.ActionForm;
     6import org.apache.struts.action.ActionForward;
     7import java.util.HashMap;
     8import javax.servlet.http.*;
     9
    10public class TestAction extends Action {
    11  public ActionForward execute(ActionMapping mapping,ActionForm form,HttpServletRequest request,HttpServletResponse response) throws Exception {
    12    return mapping.findForward("success");
    13  }

    14}

    第8行,鉴于这是一个例子为了简便起见使用了“*”代替了具体的类,编写程序时还是需要培养良好的习惯引入相应的类,避免出现冲突。
    这个类很简单,只是把请求传递到一个在Struts中命名为“success”的forward对应的页面,具体请看下面列出的struts-config.xml当中的配置。

    然后是输入表单的JSP页面:input.jsp

    1<%@ taglib uri="/tags/struts-html" prefix="html" %>
    2
    3<html:form action="/Test.do" method="post">
    4   <html:text property="value(a)"/>
    5   <html:text property="value(b)"/>
    6   <html:submit>Submit</html:submit>
    7</html:form>


    第1行引入了Struts的html标签库
    请注意第4、5行,如果使用传统的ActionForm,property的值应该与ActionForm里面的一个私有属性的名称对应,但在这里,请回忆上述ActionForm中的Getter和Setter方法,分别带有一个参数和两个参数,这里的property会通过反射机制自动调用Setter方法,“value(a)”中的“value”就是ActionForm中Map的名称,而括号当中的“a”,就是我们动态产生的表单域的名称,它对应Getter方法中的第一个参数“key”,而用户在表单输入的值就对应Setter方法中的第二个参数“value”。

    这里,我们分别动态创建了两个名为“a”和“b”的表单域,存放到Map中。

    然后,我们看看success.jsp即Action转发到的页面

    1<%@ taglib uri="/tags/struts-bean" prefix="bean" %>
    2
    3<bean:write name="test" property="value(a)"/>
    4<bean:write name="test" property="value(b)"/>


    第1行引入了Struts的bean标签库。
    请注意第2行,引用了名为“test”的ActionForm(详细设置请看struts-config.xml)。这标签的作用是显示输出ActionForm的指定属性值。请注意property,“value”就是ActionForm中Map的名称,它通过反射机制自动调用ActionForm的Getter方法,请回忆上述ActionForm中的Getter方法,带有一个参数“key”,这里的“a”,“b”实际上是对应刚才输入页面动态产生的两个表单域属性名。这里实际是要显示名为“test”的ActionForm的名为“value”的Map类属性中的“key”分别为“a”和“b”的对应的“value”。

    通过这样的设计,我们就完成了动态产生表单域属性的功能,这个设计的好处是你并不需要修改ActionForm,就能随意设计你的表单域属性,也大大减少了ActionForm的编码量。

    最后,让我们来看看struts-config.xml中的相应配置(只列出相关配置片断):

     1<struts-config>
     2  
     3  <form-beans>
     4    <form-bean name="test" type="form.TestForm"/>
     5  </form-beans>
     6  
     7  <action-mappings>
     8     <action name="test" path="/Test" type="action.TestAction">
     9        <forward name="success" path="/pages/success.jsp"/>
    10      </action>
    11   </action-mappings>
    12   
    13</struts-config>

    参考:《Struts In Action》第五章第四节

  • 相关阅读:
    68
    56
    Django manager 命令笔记
    Django 执行 manage 命令方式
    Django 连接 Mysql (8.0.16) 失败
    Python django 安装 mysqlclient 失败
    H.264 SODB RBSP EBSP的区别
    FFmpeg—— Bitstream Filters 作用
    MySQL 远程连接问题 (Windows Server)
    MySQL 笔记
  • 原文地址:https://www.cnblogs.com/johnny/p/170150.html
Copyright © 2011-2022 走看看