2017-05-09 43 views
1

我想以相同的形式調用不同的動作。在我開發的以前的應用程序中,它工作的很好,(請參閱下面的代碼),但現在我已經將Struts 2.1.6的版本切換到2.5.8,並且它不工作。Struts2 2.5 - 多個相同形式的動作

this question的回答中,不鼓勵使用同一形式的不同動作。相反,作者建議在同一個動作中調用不同的方法。這很好,但在我的應用程序中,我需要從幾個地方調用這些動作/方法,而不僅僅是這種形式,所以我寧願將struts.xml文件中的動作調用分開。

注:我從struts.xml的角度調用「action」。每個動作調用來自同一個類的不同方法* Action.java。這個類的.java所有的行動都在同一個包的struts.xml

形式的分組中的List.jsp:

<s:form name="changeStatusForm" theme="simple" id="formList"> 
    <s:hidden id="idSelectedRow" name="idSelectedRow"/> 
    <s:submit key="global.showMore" action="showMore" /> 
    <s:submit key="global.edit" action="edit"/> 
    <s:submit key="global.delete" action="delete"/> 
</s:form> 

的JSP是對象的列表。當我點擊一行時,會出現一個包含幾個選項的菜單(表單的)。所需對象的ID被收集在變量idSelectedRow中。

struts.xml的

<package name="object" namespace="/object" extends="authenticate-default"> 
    <result-types> 
     <result-type name="tiles" class="org.apache.struts2.views.tiles.TilesResult"/> 
    </result-types> 
    <global-results> 
     <result name="error" type="tiles">error</result> 
     <result name="errorLogin" type="tiles">errorLogin</result> 
    </global-results> 

    <action name="list" method="list" class="actions.ObjectAction"> 
     <result name="success" type="tiles">listObject</result> 
     <result name="input" type="redirect">list</result> 
     <result name="error" type="tiles">listObject</result> 
    </action> 
    <action name="showMore" method="showMore" class="actions.ObjectAction"> 
     <result name="success" type="tiles">showMore</result> 
    </action> 
    <action name="edit" method="edit" class="actions.ObjectAction"> 
     <result name="success" type="tiles">edit</result> 
    </action> 
    <action name="delete" method="delete" class="actions.ObjectAction"> 
     <result name="success" type="tiles">list</result> 
    </action> 

    . 
    . 
    . 

</package> 

Object.java:

public class ObjectAction extends BaseActionCRUD implements ModelDriven<ObjectDTO> { 
    ... 
    public String showMore() { 
     ... 
     return SUCCESS; 
    } 
    public String edit() { 
     ... 
     return SUCCESS; 
    } 
    public String delete() { 
     ... 
     return SUCCESS; 
    } 
    public String list() { 
     ... 
     return SUCCESS; 
    } 
    ... 
} 

所以,我該怎麼辦在Struts的2.5.8同樣的事情?

現在,在ObjectAction.java中執行的方法始終是list()而不是選定的方法。這是因爲重定向到list.jsp的操作是列表。

謝謝!

回答

1
  1. 極其重要:遷移到2.5.10.1,而不是2.5.8。
    2.5.10.1之前的任何2.5版本(以及任何最近的2.3版本,在2.3.32之前)都容易出現嚴重安全問題S2-045

  2. 由於2.3.15.3,你需要明確啓用action:前綴(即由<s:submit>標籤action=""屬性生成)在struts.xml中有:

    <constant name="struts.mapper.action.prefix.enabled" value="true"/> 
    
  3. method=""前綴,稱爲DMI(動態方法調用),這個用法在你已經鏈接的2011年答案中提出,現在已經被棄用,並且完全不鼓勵。

另外,action:前綴的方法是不鼓勵對更強大的解決方案(如使用JavaScript根據該<submit>按鈕被按下改變<form>target),但是,如果你願意,你還可以啓用和使用它,沒有什麼大問題。

+0

+1並同意@Andrea Ligios。即使如此,僅僅因爲Struts允許你將多個動作映射到同一個類,這並不意味着你應該這樣做。相反,考慮重構你的行爲,這樣每個人都有一個責任。這將減少耦合,改善動作類的凝聚力,簡化配置和單元測試,並減少缺陷。 –

+0

我在struts.xml中添加了常量,並且工作正常。我已經想過Javascript解決方案,但我不想讓事情複雜化。但是,我會考慮它。 感謝版本警告。你是我的英雄! – mardo

+0

不客氣mardo :) @MichaelPeacock相關:http://stackoverflow.com/a/35689796/1654265(和http://stackoverflow.com/a/13530194/1654265) –