javascript jsp configuration struts2 struts-action

Cómo llamar a un método en el método Struts2 Action Class con javascript



jsp configuration (3)

Hay diferentes maneras de lograr lo que desea, pero probablemente el más simple sea asignar diferentes acciones a diferentes métodos del mismo archivo de clase de acción, por ej. con anotaciones:

public class NameAction { @Action("myAction") public String execute(){ ... } @Action("myActionFindName") public String findName(){ ... } }

o con 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>

Luego en javascript:

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

Actualmente usamos el siguiente javascript para enviar el formulario cuando cambia uno de los valores del campo.

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

que llama a la siguiente acción de Struts2

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

que luego va al método execute() de Action Action NameAction donde debo verificar si el formulario fue enviado desde el javascript.

Preferiría llamar al método findName() en NameAction directamente desde javascript. En otras palabras, quiero que el javascript actúe como el siguiente código jsp.

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

¡Cualquier ayuda sería apreciada!


Para completarlo aquí, es cómo implementé el consejo de Andrea y Roman.

Cuando el usuario ingresa datos en los campos firstName y lastName , les mostramos una lista de nombres para elegir y completar el resto del formulario. El jsp es

<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>

El javascript es

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

El javascript forma una url al agregar "_NameSearch" a la action del formulario que llama a la función selectNameInfo() . En este caso, la nueva acción es newRequest_NameSearch que va al siguiente xml que llama al método generateNameList() de la clase de acción sin usar DMI, que era mi pregunta original.

<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>


Puede usar la misma clase de acción para asignar diferentes métodos utilizando el atributo de method

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

Por defecto, el atributo del method si se omite utiliza el método de execute .

Este enfoque requiere cambiar el nombre de la acción y, por lo tanto, la URL para mapear la acción. Si desea mantener la misma URL para diferentes acciones, debe pasar un nombre de método como parámetro a la acción. Luego, en el método de ejecución, analiza este parámetro para el nombre del método y llama al método correspondiente.

Cuando DMI se habilitó en las versiones anteriores para llamar al método, puede usar un atributo de method de la etiqueta s:submit . Actualmente, el method: nombre del parámetro está bloqueado por el interceptor params , incluso si llega al mapeador de acciones.

También lee otras posibilidades de Cómo excluir la acción de envío de una lista de parámetros en struts2 .