1

我们目前使用以下 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>

然后转到execute()Action 类的方法NameAction,我必须检查表单是否是从 javascript 提交的。

我宁愿直接从 javascript调用该findName()方法。NameAction换句话说,我希望 javascript 的行为类似于以下 jsp 代码。

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

3 回答 3

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 ;
于 2016-03-03T17:35:39.073 回答
1

您可以使用相同的操作类使用method属性映射不同的方法

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

默认情况下,method如果省略,则属性使用execute方法。

这种方法需要更改动作名称,因此需要更改 URL 来映射动作。如果您想为不同的操作保留相同的 URL,那么您应该将方法名称作为参数传递给操作。然后在execute方法中解析这个参数为方法名并调用对应的方法。

在以前的版本中启用DMI来调用方法时,您可以使用标签的method属性。s:submit目前,method:参数名称被params拦截器阻止,即使它到达了动作映射器。

您还从如何从 struts2 的参数列表中排除提交操作中阅读了其他可能性。

于 2016-03-03T17:13:45.473 回答
0

为了完整起见,这里是我如何实施 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”添加到action调用该selectNameInfo()函数的表单中来形成一个 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>
于 2016-03-08T21:58:37.503 回答