Как вызвать метод в методе класса действий Struts2 с помощью 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>

который затем идет к execute() метод класса Action NameAction где я должен проверить, была ли форма отправлена ​​из javascript.

Я бы предпочел позвонить findName() метод в NameAction прямо из JavaScript. Другими словами, я хочу, чтобы javascript действовал как следующий код jsp.

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

Любая помощь будет оценена!

3 ответа

Решение

Существуют разные способы достижения того, чего вы хотите, но, вероятно, более простым является сопоставление разных действий с разными методами одного и того же файла класса действий, например. с аннотациями:

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 был включен в предыдущих версиях для вызова метода, вы могли использовать method атрибут s:submit тег. В настоящее время method: Имя параметра заблокировано params перехватчик, даже если он попадает в маппер действий.

Вы также прочитали другие возможности из Как исключить действие отправки из списка параметров в Struts2.

Для полноты вот как я реализовал совет Андреа и Романа.

Когда пользователь вводит данные в оба firstName а также lastName В полях мы показываем им список имен на выбор, чтобы заполнить оставшуюся часть формы. 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>      

Яваскрипт

        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" к action формы вызова selectNameInfo() функция. В этом случае новое действие 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>
Другие вопросы по тегам