簡體   English   中英

如何使用javascript調用Struts2 Action Class方法中的方法

[英]How to call a method in Struts2 Action Class method with javascript

當字段值之一發生變化時,我們目前使用以下 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 類NameActionexecute()方法,在那里我必須檢查表單是否是從 javascript 提交的。

我更喜歡直接從 javascript 調用NameAction中的NameAction findName()方法。 換句話說,我希望 javascript 像下面的 jsp 代碼一樣工作。

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

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

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 ;

您可以使用相同的操作類來映射使用method屬性的不同方法

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

默認情況下,如果省略method屬性,則使用execute方法。

這種方法需要更改操作名稱,因此需要更改 URL 來映射操作。 如果要為不同的操作保留相同的 URL,則應將方法名稱作為參數傳遞給操作。 然后在execute方法中解析這個參數為方法名並調用對應的方法。

當在以前的版本中啟用DMI來調用方法時,您可以使用s:submit標記的method屬性。 目前method: parameter name 被params攔截器阻止,即使它到達了動作映射器。

您還可以從如何從 struts2 中的參數列表中排除提交操作中閱讀其他可能性。

為了完整起見,我是如何實施 Andrea 和 Roman 的建議的。

當用戶在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 通過將“_NameSearch”添加到調用selectNameInfo()函數的表單的action中來形成一個 url。 在這種情況下,新操作是newRequest_NameSearch ,它轉到以下 xml,該 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>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM