我使用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>>>();
有沒有人知道如何做到這一點?
我使用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>>>();
有沒有人知道如何做到這一點?
爲了保持簡短,我給出了一個解決方案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表單獲取數據,所以沒有列表和文件上傳在一起。