2016-03-03 103 views
0

我們當前使用以下JavaScript提交表單時,其中一個字段值更改。如何在Struts2中調用方法使用javascript的操作類方法

var url = "project/location/myAction.action?name="+ lname ; 
document.forms[0].action = url; 
document.forms[0].submit(); 

它調用下面Struts2的行動

<action name="myAction" class="project.location.NameAction"> 
    <result name="success" type="tiles">myAction</result> 
</action> 

,然後進入到Action類NameAction,我要檢查,看看是否形式與JavaScript提交的​​方法。

我寧願直接從javascript調用findName()方法NameAction。換句話說,我希望JavaScript像下面的jsp代碼一樣行事。

<s:submit method="findName" key="button.clear" cssClass="submit" > 

任何幫助將不勝感激!

+0

您是否知道這種提交在默認情況下不起作用? –

+0

@Roman你是指JavaScript提交還是struts提交? – ponder275

+0

如果你想javascript像struts提交一樣,你應該知道struts提交不應該有方法屬性,請參閱下面的答案。你應該詳細說明你的意思*像*一樣行事。 –

回答

2

有不同的方法來實現你想要的,但可能更簡單的是將不同的動作映射到相同動作類文件的不同方法,例如。與註釋:

public class NameAction { 

    @Action("myAction") 
    public String execute(){ ... } 

    @Action("myActionFindName") 
    public String findName(){ ... } 

} 

或XML:

<action name="myAction" class="project.location.NameAction"> 
    <result name="success" type="tiles">myAction</result> 
</action> 

<action name="myActionFindName" class="project.location.NameAction" method="findName"> 
    <result name="success" type="tiles">myAction</result> 
</action> 
在JavaScript

然後:

var url = "project/location/myActionFindName.action?name="+ lname ; 
+0

如果我使用不同的動作映射到相同的動作類,我是否會丟失任何已輸入的值?我需要JavaScript將我發送到同一頁面,這樣才能在執行其他操作來處理數據之前保存任何輸入的值。我想到了像你展示的那樣使用XML,但我不知道是否會丟失已經在頁面上輸入的數據。 – ponder275

+1

絕對不是,這是共享相同的Java文件的兩個動作的優點:你共享所有的屬性,獲取者和設置者。你會發現(在第二次登陸JSP時,在調用'findName()'之前執行'findName()')所有的屬性之後,唯一缺少的就是靜態數據,比如選擇框元素。但是,當驗證或轉換錯誤發生時,單個動作也會發生......這就是prepare()(以及其他替代方法)的用處。閱讀更多http://stackoverflow.com/a/25682007/1654265 –

+0

也不要使用DMI ...即使它仍然可以啓用它,避免它像瘟疫一樣。 –

1

您可以使用相同的動作類使用method屬性

<action name="myAction" class="project.location.NameAction" method="findName"> 

默認情況下,method屬性如果省略使用execute方法來映射不同的方法。

此方法需要更改操作名稱,因此需要更改URL以映射操作。如果您希望爲不同的操作保留相同的URL,那麼您應該將方法名稱作爲參數傳遞給操作。然後在execute方法中解析該方法名稱的參數並調用相應的方法。

當在以前版本中啓用DMI以調用該方法時,可以使用s:submit標記的method屬性。目前,method:參數名稱被攔截器攔截,即使它到達動作映射器。

您還可以閱讀How to exclude the submit action from a list of parameters in struts2的其他可能性。

+0

我們目前按照你的建議解析執行方法,但如果可能的話,我想簡化執行方法。我們一直使用s:submit標記的方法屬性,它仍然列在Struts2文檔中,所以我不能理解你關於參數名稱被阻止的觀點。 – ponder275

+1

如果您使用s:submit標籤和method屬性,那麼您應該啓用DMI。 DMI由於缺省安全原因和更改而被禁用的觀點和更改影響了s:submit標記的功能,如果禁用了DMI,則該標記不能與方法屬性一起使用。你可以發佈'struts.xml'來查看你的配置。 –

+0

我們確實啓用了它。 – ponder275

0

爲了完整這裏是我是如何從Andrea和羅馬的實施意見。

當用戶在firstNamelastName兩個字段中都輸入數據時,我們向他們顯示一個名稱列表,用於填寫表格的其餘部分。在jsp是

   <div class="row"> 
       <div class=" col-sm-2 col-xs-12 no-padding-right text-right"><span class="required">*</span><label class="pull-right" for="lastNameId"><s:text name="lastName"></s:text>:</label></div>    
       <div class=" col-sm-2 col-xs-12 no-padding-right "> 
        <s:textfield name="lastName" id="lastNameId" maxlength="50" onchange ="dirtyFlag();" onblur="selectNameInfo(\'newRequest\');" class="form-control"/> 
       </div> 
       <div class=" col-sm-2 col-xs-12 no-padding-right text-right " ><span class="required">*</span><label class="pull-right" for="firstNameId"><s:text name="firstName"></s:text>:</label></div>    
       <div class=" col-sm-2 col-xs-12 no-padding-right "> 
        <s:textfield name="firstName" id="firstNameId" maxlength="50" onchange ="dirtyFlag();" onblur="selectNameInfo(\'newRequest\');" class="form-control"/> 
       </div> 
      </div>  

的JavaScript是

 function selectNameInfo(formId) { 
     var lastName = document.forms[0].elements["lastNameId"].value; 
     var firstName = document.forms[0].elements["firstNameId"].value; 

     if(lastName != "" && firstName != ""){ 
     clearDirtyFlag(); 
     var oldAction = document.getElementById(formId).action; 
     var actionName = document.getElementById(formId).name; 
     var url = oldAction.replace(actionName,actionName+"_NameSearch"); 
      document.forms[0].action = url; 
      document.forms[0].submit(); 
     }; 
    } 

JavaScript的形式的URL通過添加 「_NameSearch」 到表單調用selectNameInfo()函數的action。在這種情況下,新動作是newRequest_NameSearch,它轉到以下xml,它調用動作類的generateNameList()方法,而不使用DMI,這是我的原始問題。

<action name="newRequest_NameSearch" class="gov.mo.dnr.egims.controller.evaluation.NewRequestAction" method = "generateNameList">   
     <result name="success" type="tiles">newRequest</result> 
     <result name="nameSearch" type="tiles">selectNameInfo</result> 
     <result name="error" type="tiles">error</result>    
    </action> 
相關問題