2013-08-03 34 views
3

由於最新版本中提供的安全修復程序,我從2.1.6升級到2.3.15.1。但是,現在表單字段值不會發布到Action類。 基本上,當表單被提交時,我將來自JSP的HashMapprops填充到Action類中。當我將struts版本升級到2.3.15.1時,這不起作用。沒有代碼改變。當我調試代碼時,我注意到沒有調用setProps方法。這是不允許的了嗎?有什麼解決方法嗎?只要我恢復struts庫的變化,一切都很完美。請幫忙。升級到struts 2.3.15.1不會在操作類上設置HashMap值

這裏是我的代碼看起來像:

Action類

private Map<String, Wall> props; 

    public void prepare(){ 
      //fill up props map here. 
     } 
    public String view(){ 
     return INPUT; 
    } 

    public String save(){ 
     myService.setProps(props); 
     return INPUT; 
    } 

    public void setProps(Map<String, Wall> props) { 
     this.props = props; 
    } 

    public Map<String, Wall> getProps() { 
     return props; 
    } 

JSP

<s:iterator value="props.entrySet()" id="prop" status="propStatus"> 
    <s:textfield name="props['%{#prop.key}'].value" value="%{#prop.value.value}" /> 
</s:iterator> 

回答

1

由於Struts的2.1.6已經有巨大的變化。如果你沒有明確告訴它,Struts 2不會爲你創建對象。該prepare方法調用params攔截設置props的行動之前,你評論說你填充地圖

//填補道具映射在這裏。

毫不奇怪,Struts並沒有調用該設置器setProps,因爲它已經包含一個映射實例。所以,它簡單地稱爲getProps。然後它應該將索引屬性值設置爲地圖。但是它不知道要轉換爲集合的元素的對象的類型,以及它是否應爲元素創建新對象(如果它是null)。通過在props字段上添加註釋,它應該解決在提交時填充地圖的問題。

@Element(value = Wall.class) 
@CreateIfNull(value = true) 
private Map<String, Wall> props = new HashMap<>(); 

我猜它會自動確定的關鍵。如果您在Action-conversion.properties

Element_props=Wall 
CreateIfNull_props=true 

下一頁你的JSP可以更換,以

<s:iterator value="props"> 
    <s:textfield name="props['%{key}'].value" /> 
</s:iterator> 

指定它和最後你還沒有張貼Wall類同樣可以做,應該像

public class Wall { 
    String value; 
    //getter and setter here 
} 
+0

+1爲乾淨的迭代器建議。所以,如果提交的屬性名稱是props ['a.b.c']。value?我有類似的東西,我把屬性名稱變成道具['abc']。價值和一切工作正常。在我的情況下,在準備方法中設置地圖很重要,因爲許多操作都依賴於它。 – Nik

+0

@Nik你在地圖上保存哪個道具的鑰匙並不重要。您也可以使用準備來填充地圖,在這種情況下,我不瞭解您的問題,因爲您沒有說出需要發佈的值。國際海事組織我從來沒有使用準備來填充集合,因爲在這種情況下,我需要在'prepare'之前加入'params'攔截器。 –

+0

所以我從準備方法中刪除了地圖,添加了如上所述的註釋,仍然沒有看到被調用的set方法,並且地圖是空的。不知道我錯過了什麼。我的行爲是validationaware,它也有validate()方法。這可能是一個問題嗎? – Nik

1

解決了它。使用新的Struts版本參數名稱更具限制性。在我的情況下,我有參數名稱,如props['1.2.3'], props['a.b.c'] or props['a-b-c']。這些被新的支柱過濾掉了。這是解釋這個的鏈接:http://struts.apache.org/development/2.x/docs/s2-009.html。最後一部分解釋了爲什麼收藏可能會停止工作。

我將攔截器棧中的acceptParamNames更改爲<param name="acceptParamNames">\w+((\.\w+)|(\[\d+\])|(\['\w+(\-\w+)*'\]))*</param>並解決了問題。我擺脫了props['a.b.c']屬性名稱,所以上述正則表達式不包括它,但它確實覆蓋了props['a-b-c']

感謝@Roman C提出來幫助我。

+0

在將struts從2.0.11升級到2.3.16時,我遇到了同樣的問題。使用上面的實現來解決。謝謝! –