2015-07-21 60 views
1

我使用Struts 1,从jsp中提交java.util.Map和Struts 1 Action类

我想从我的JSP页面中使用到的Struts 1 Action类提交数据,

场的FormBean是像下面的东西

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

有没有人知道如何做到这一点?

回答

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"/>需要与reset()方法中的myBeanList.add(12, new MyBean())等效的内容。地图也有类似的要求; <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"/> 

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

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表单获取数据,所以没有列表和文件上传在一起。