`

应用Map作为ActionForm的属性,动态增加ActionForm的“属性”

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

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

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

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

首先创建ActionForm类:TestForm
写道
package form;

import org.apache.struts.action.ActionForm;
import java.util.HashMap;

public class TestForm extends ActionForm {
private HashMap<String,Object> map = new HashMap<String,Object>();

public Object getValue(String key) {
return map.get(key);
}

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

}

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

然后创建Action类:TestAction

写道
package action;

import org.apache.struts.action.Action;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import java.util.HashMap;
import javax.servlet.http.*;

public class TestAction extends Action {
public ActionForward execute(ActionMapping mapping,ActionForm form,HttpServletRequest request,HttpServletResponse response) throws Exception {
return mapping.findForward("success");
}
}

 

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

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

写道
<%@ taglib uri="/tags/struts-html" prefix="html" %>

<html:form action="/Test.do" method="post">
<html:text property="value(a)"/>
<html:text property="value(b)"/>
<html:submit>Submit</html:submit>
</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转发到的页面

写道
<%@ taglib uri="/tags/struts-bean" prefix="bean" %>

<bean:write name="test" property="value(a)"/>
<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》第五章第四节

<script type="text/javascript"></script>

分享到:
评论

相关推荐

    Struts_学习笔记之ActionForm

    ActionForm的property必须声明然后才可以使用,不过在查询时我们常常需要输入一些查询条件,这些查询条件(property)其实不需要在formbean中声明,可以使用Map对象来封装整个查询表单提交的数据。 4. ActionForm的...

    struts课堂资料\第五章(动态ActionForm与控制器)2

    动态ActionForm通过实现org.apache.struts.action.DynaActionForm接口实现,它的属性可以通过Map对象动态添加和访问。 **ActionForm中的reset()方法**:在用户提交表单前,如果在ActionForm中有预设值,reset()方法...

    Struts中List里嵌套Map

    在Java Web开发中,Struts框架是一个非常流行的MVC(模型-视图-控制器)架构,用于构建可维护性高、结构清晰的Web应用程序。在处理复杂数据结构时,Struts框架提供了灵活的数据绑定能力,其中包括在List中嵌套Map的...

    webwork 中table动态增加行列

    在"webwork 中table动态增加行列"这个场景下,我们通常会创建一个名为`JzqdAction.java`的Action类,它将承载表格操作的逻辑。这个类可能包含以下几个关键方法: 1. `addRow()`: 这个方法会在表格中添加新的行。它...

    struts1.x html标签 radio,checkbox,multibox,select的使用

    通过`list`属性,可以将选项数据源绑定到ActionForm的属性,从而动态生成选项列表。 在实际应用中,`StrutsMapActionForm`可能是ActionForm的一个实例,它包含了一个或者多个Map对象来存储这些HTML标签的值。例如,...

    Struts 之旅 - 动态表单

    可以通过在ActionForm中使用ArrayList或Map来存储这些动态字段。当表单提交时,Struts框架会自动将表单数据填充到ActionForm中。 3. **表单验证**:Struts提供了强大的验证机制,可以在ActionForm类中定义校验规则...

    Struts1 控制器组件和动态表单详解

    Struts1是一个经典的Java Web开发框架,它...动态ActionForm提供了对表单数据处理的灵活性,适应了Web应用中多样化的用户输入需求。通过深入理解这些组件和机制,开发者可以更好地构建和维护基于Struts1的应用程序。

    BeanUtils的应用

    2. **描述对象**:`describe()`方法可以返回一个表示Java Bean属性及其当前值的Map,这对于调试或信息展示非常有用。 3. **属性操作**:`setProperty()`和`getProperty()`方法分别用于设置和获取Java Bean的属性值...

    struts html标签例子

    `&lt;html:select&gt;`定义了选择框,`&lt;html:option&gt;`用于添加单个选项,而`&lt;html:optionsCollection&gt;`则可以从集合或Map中动态生成选项。 8. `&lt;html:hidden&gt;`:用于创建隐藏字段,这些字段不会显示在用户界面上,但会在...

    Struts之进阶篇.pdf

    这种设计允许开发者在ActionForm中混合使用Map和常规JavaBean属性,从而提高了灵活性。通过Map,开发者可以在不预先定义特定属性的情况下捕获HTTP请求参数。这意味着,如果客户端发送了一个未预期的请求参数,该参数...

    beanutils高手学习笔记,重要的学习笔记,想提高的看

    它通过反射机制,能够动态地操作对象的属性,无论是简单的数据类型,还是数组、列表或映射类型。通过`getProperty()`和`setProperty()`这两个方法,开发者可以轻松地访问和修改JavaBean的各种属性。 2. **属性类型*...

    Struts +json

    Struts是一种基于MVC(Model-View-Controller)设计模式的Java Web框架,它简化了构建动态、数据驱动的Web应用的过程。而JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也...

    struts_dynForm用例

    在传统的Struts应用中,表单字段通常与ActionForm类中的属性一一对应,但在某些情况下,如数据库记录的增删改查或者用户自定义配置等场景,表单字段的数量可能会变化,这时StrutsDynForm就能派上用场。 Struts ...

    struts-logic iterate标签学习指南

    总之,Struts-Logic Iterate标签提供了强大的功能,使得在JSP页面上处理集合数据变得简单易行,是构建动态Web应用的重要工具。了解和熟练掌握其用法,能够提高开发效率,使页面呈现更加灵活和高效。

    java的映射机制

    在Struts框架中,映射机制的应用主要体现在Action和ActionForm之间的映射关系上。Action是处理用户请求的控制器,而ActionForm则是用于封装表单数据的对象。通过配置文件(通常是struts-config.xml),开发者可以...

    struts 完整例子

    - DynaBeans是JavaBean的动态版本,它像Map一样操作属性,无需预定义的getter和setter,更灵活地处理简单的数据存取。 7. **Properties Files和ResourceBundles** - 通过Properties Files和ResourceBundles,...

    DispatchAction、LookupDispatchAction、SwitchAction的应用

    例如,可以在一个 Action 中使用 Java 的 `switch` 语句或 Map 来实现动态地调用不同的处理方法: ```java public class CustomSwitchAction extends Action { private Map, Method&gt; methodMap = new HashMap(); ...

    struts标签学习与应用(手册)

    - `&lt;html:text&gt;`:创建一个文本输入框,与ActionForm中的属性绑定。 - `&lt;html:password&gt;`:创建一个密码输入框。 - `&lt;html:submit&gt;`:提交表单。 - `&lt;html:reset&gt;`:重置表单。 - `&lt;html:errors&gt;`:显示所有...

Global site tag (gtag.js) - Google Analytics