2016-03-03 2 views
0

В настоящее время мы используем следующий javascript для отправки формы при изменении одного из значений поля.Как вызвать метод в методе класса Struts2 Action с 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() метод класса действий NameAction, где я должен проверить, если форма была отправлена ​​из JavaScript.

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

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

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

+0

Знаете ли вы, что такая подача не работает по умолчанию? –

+0

@ Roman Вы ссылаетесь на javascript submit или struts submit? – ponder275

+0

Если вы хотите, чтобы javascript выполнял действие как struts submit, вы должны знать, что struts submit не должен иметь атрибут метода, см. Мой ответ ниже. Вы должны уточнить, что вы подразумеваете под действием *. –

ответ

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

Вы также читаете другие возможности от How to exclude the submit action from a list of parameters in struts2.

+0

В настоящее время мы анализируем метод execute, как вы предлагали, но я хотел бы упростить метод execute, если мог. Мы используем атрибут метода тега s: submit все время, и он все еще указан в документации Struts2, поэтому я не должен понимать вашу точку о заблокированном имени параметра. – ponder275

+1

Если вы используете тег s: submit с атрибутом метода, вы должны включить DMI. Дело в том, что DMI по умолчанию отключен из соображений безопасности и изменений, повлиявших на функциональность тега s: submit, который не работает с атрибутом метода, если DMI отключен. Вы можете отправить 'struts.xml', чтобы увидеть свою конфигурацию. –

+0

У нас есть разрешение. – ponder275

0

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

Когда пользователь вводит данные в поля firstName и lastName, мы показываем им список имен на выбор, чтобы заполнить остальную часть формы.СПЯ является

   <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(); 
     }; 
    } 

The 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> 
Смежные вопросы