将Jsp中的java.util.Map提交给Struts 1 Action类

时间:2015-07-21 08:12:15

标签: jsp servlets struts1

我正在使用Struts 1,

我想使用

将我的JSP页面中的数据提交到Struts 1 Action Class

FormBean中的字段如下所示

Map<String, Map<String,List<Object>>> data = new HashMap<String, Map<String,List<Object>>>();

有人知道如何实现这个目标吗?

1 个答案:

答案 0 :(得分:1)

为了简短说明,我为Map<String,List<MyBean>>提供了解决方案。只需很少的努力,就可以扩展以下内容作为问题的答案:

Struts 1.x要求您在填充原始值之前在ActionForm.reset()中创建所有对象。如果您的表单中有一个带有子项的对象,则必须为这些子项分配适当的值,即如果您有 <html:text property="parent.child" />然后您必须在重置()中执行parent.setChild(new Child())

同样,如果你有一个基于列表的表单元素,那么表单元素的每个引用索引都必须初始化,即<html:text property="myBeanList[12].beanMember"/>需要myBeanList.add(12, new MyBean())中等同于reset()的内容。方法。地图也有类似的要求; <html:text property="myBeanMap('key').beanMember"/>需要myBeanMap.put('key',new MyBean())

借助一些额外的隐藏表单字段或-better-解析器来检测所需的索引,您可以检测必须创建新对象的索引位置。

如果我们采用简单的方法并使用HTTP GET / POST参数发送所需的索引信息,我们的映射键驻留在mapKeys中,例如。

<input type="hidden" name="mapKeys" value="key1,key2,key3"/>

并且每个关键位置的列表长度都位于key1_length

等变量中
<input type="hidden" name="key1_length" value="10"/>

在这种情况下,reset()方法将是这样的:

public void reset(ActionMapping mapping, HttpServletRequest request) {
   this.data = new HashMap<String,List<MyBean>>();
   String requiredKeys=request.getParameter("mapKeys");
   for (String key: requiredKeys.split(",")) {
     List<MyBean> lst = new ArrayList<MyBean>();
     int listLength = Integer.parseInt(request.getParameter(key+"_length"));
     for (int i = 0; i < listLength; i++)
        lst.add(new MyBean());
     this.data.put(key, lst);
   }

}

以便它可以获得

<html:text property="data('key1')[3].beanMember"/>
填写表单时

。如果索引信息与其他表单元素不一致,您可能会遇到有关BeanUtils.setProperty()的例外情况。

顺便说一句,我告诉所有人都可以从不是multipart/form-data的HTML表单中获取数据,因此没有列表和文件一起上传。

相关问题