通常情况下,我们要在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>
分享到:
相关推荐
ActionForm的property必须声明然后才可以使用,不过在查询时我们常常需要输入一些查询条件,这些查询条件(property)其实不需要在formbean中声明,可以使用Map对象来封装整个查询表单提交的数据。 4. ActionForm的...
动态ActionForm通过实现org.apache.struts.action.DynaActionForm接口实现,它的属性可以通过Map对象动态添加和访问。 **ActionForm中的reset()方法**:在用户提交表单前,如果在ActionForm中有预设值,reset()方法...
在Java Web开发中,Struts框架是一个非常流行的MVC(模型-视图-控制器)架构,用于构建可维护性高、结构清晰的Web应用程序。在处理复杂数据结构时,Struts框架提供了灵活的数据绑定能力,其中包括在List中嵌套Map的...
在"webwork 中table动态增加行列"这个场景下,我们通常会创建一个名为`JzqdAction.java`的Action类,它将承载表格操作的逻辑。这个类可能包含以下几个关键方法: 1. `addRow()`: 这个方法会在表格中添加新的行。它...
通过`list`属性,可以将选项数据源绑定到ActionForm的属性,从而动态生成选项列表。 在实际应用中,`StrutsMapActionForm`可能是ActionForm的一个实例,它包含了一个或者多个Map对象来存储这些HTML标签的值。例如,...
可以通过在ActionForm中使用ArrayList或Map来存储这些动态字段。当表单提交时,Struts框架会自动将表单数据填充到ActionForm中。 3. **表单验证**:Struts提供了强大的验证机制,可以在ActionForm类中定义校验规则...
Struts1是一个经典的Java Web开发框架,它...动态ActionForm提供了对表单数据处理的灵活性,适应了Web应用中多样化的用户输入需求。通过深入理解这些组件和机制,开发者可以更好地构建和维护基于Struts1的应用程序。
2. **描述对象**:`describe()`方法可以返回一个表示Java Bean属性及其当前值的Map,这对于调试或信息展示非常有用。 3. **属性操作**:`setProperty()`和`getProperty()`方法分别用于设置和获取Java Bean的属性值...
`<html:select>`定义了选择框,`<html:option>`用于添加单个选项,而`<html:optionsCollection>`则可以从集合或Map中动态生成选项。 8. `<html:hidden>`:用于创建隐藏字段,这些字段不会显示在用户界面上,但会在...
这种设计允许开发者在ActionForm中混合使用Map和常规JavaBean属性,从而提高了灵活性。通过Map,开发者可以在不预先定义特定属性的情况下捕获HTTP请求参数。这意味着,如果客户端发送了一个未预期的请求参数,该参数...
它通过反射机制,能够动态地操作对象的属性,无论是简单的数据类型,还是数组、列表或映射类型。通过`getProperty()`和`setProperty()`这两个方法,开发者可以轻松地访问和修改JavaBean的各种属性。 2. **属性类型*...
Struts是一种基于MVC(Model-View-Controller)设计模式的Java Web框架,它简化了构建动态、数据驱动的Web应用的过程。而JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也...
在传统的Struts应用中,表单字段通常与ActionForm类中的属性一一对应,但在某些情况下,如数据库记录的增删改查或者用户自定义配置等场景,表单字段的数量可能会变化,这时StrutsDynForm就能派上用场。 Struts ...
总之,Struts-Logic Iterate标签提供了强大的功能,使得在JSP页面上处理集合数据变得简单易行,是构建动态Web应用的重要工具。了解和熟练掌握其用法,能够提高开发效率,使页面呈现更加灵活和高效。
在Struts框架中,映射机制的应用主要体现在Action和ActionForm之间的映射关系上。Action是处理用户请求的控制器,而ActionForm则是用于封装表单数据的对象。通过配置文件(通常是struts-config.xml),开发者可以...
- DynaBeans是JavaBean的动态版本,它像Map一样操作属性,无需预定义的getter和setter,更灵活地处理简单的数据存取。 7. **Properties Files和ResourceBundles** - 通过Properties Files和ResourceBundles,...
例如,可以在一个 Action 中使用 Java 的 `switch` 语句或 Map 来实现动态地调用不同的处理方法: ```java public class CustomSwitchAction extends Action { private Map, Method> methodMap = new HashMap(); ...
- `<html:text>`:创建一个文本输入框,与ActionForm中的属性绑定。 - `<html:password>`:创建一个密码输入框。 - `<html:submit>`:提交表单。 - `<html:reset>`:重置表单。 - `<html:errors>`:显示所有...