tutorial servlet metodo funciona etiquetas como java jsp struts2 ognl valuestack

servlet - struts java



Cómo usar múltiples formularios/acciones en una sola vista en Struts 2 (3)

Como encontré (corríjanme): se deben iniciar dos formularios en sus propias acciones antes de que se muestren al usuario, cuando solicita el formulario de registro, el formulario de búsqueda no se inicia, ya que su acción nunca se llama.

Este es un problema común que se puede manejar fácilmente con Ajax, NO CARGUE TODOS LOS DATOS DE SU PÁGINA. Por favor, eche un vistazo a http://struts.jgeppert.com/struts2-jquery-showcase/index.action . Hay un cuadro de selección de selección de tema, que se inició una vez. Cargar otra parte de la página se realizará a través de Ajax y, por lo tanto, no es necesario volver a ejecutar la selección del tema, acción que inicia el cuadro de selección. Puedes usar fácilmente el plugin jquery 2 de struts para lograrlo.

Si no puede usar Ajax (con cualquier razón), entonces no hay una manera simple. Debe iniciar manualmente los elementos del formulario de búsqueda, en CADA acción, para asegurarse de que su etiqueta struts pueda leer datos iniciados del formulario de búsqueda. ¡Puedes pensarlo como necesitas de alguna forma, cortar y pegar el cuerpo de tu acción de búsqueda en todas tus acciones!

Tengo un cuadro de búsqueda que se muestra en cada página. El código JSP para el cuadro de búsqueda se inserta en cada página mediante mosaicos.

El cuadro de búsqueda tiene un formulario y una clase de acción SearchAction que necesita precargar algunas propiedades para los cuadros desplegables. La clase SearchAction tiene un método de input() , que hace esta inicialización.

Algunas páginas también tienen su propia forma en el área principal. También con su propia clase de acción. También tienen un método de input() que realiza cierta precarga.

  1. ¿Es posible usar dos acciones en la misma vista?
  2. ¿Cómo puede cada formulario tener acceso a las propiedades de sus propias acciones?
  3. ¿Y cómo podría lograr que se llame al método de entrada de ambas clases de acción antes de que se represente el JSP?

Actualizar:

Estoy agregando un ejemplo recortado, ya que probablemente no esté claro lo que estoy tratando de hacer. Es una página de register.jsp con una RegisterAction . Y la página también contiene el formulario de búsqueda. (Por cierto: dejé el getter / setter y otras cosas en las clases de acción para mantenerlo corto) :

register.jsp:

<s:form action="executeSearch"> <s:textfield key="name" label="Name"/> <s:textfield key="age" label="Age"/> <s:submit/> </s:form> <s:form action="executeRegister"> <s:textfield key="firstName" label="First Name"/> <s:textfield key="lastName" label="Last Name"/> <s:textfield key="age" label="Age"/> <s:submit/> </s:form>

struts.xml:

<action name="*Search" class="action.SearchAction" method="{1}"> <result name="success">/searchresult.jsp</result> </action> <action name="*Register" class="action.RegisterAction" method="{1}"> <result name="input">/register.jsp</result> <result name="success">/registerOk.jsp</result> </action>

SearchAction.java:

public class SearchAction extends ActionSupport { private String name; private int age; @Override public String input() throws Exception { // preload the search form with some demo data name = "test"; age = 20; return INPUT; } @Override public String execute() throws Exception { return SUCCESS; } ... }

RegisterAction.java:

public class RegisterAction extends ActionSupport { private String firstName; private String lastName; private int age; @Override public String input() throws Exception { // preload the register form with some demo data firstName = "John"; lastName = "Rambo"; age = 10; return INPUT; } @Override public String execute() throws Exception { return SUCCESS; } ... }

Digamos que llamo a la acción inputRegister.action . Entonces se llama a RegisterAction.input() . Las propiedades están establecidas. Y el resultado SUCCESS hace que register.jsp sea renderizado.

Pero, ¿qué pasa con mi formulario de búsqueda? ¿Cómo obtengo acceso a la acción de búsqueda y su modelo? Ninguno de los dos está en la ValueStack por supuesto. Y tampoco veo una forma de llamar a ningún método de SearchAction para inicializar su modelo. Deliberadamente elijo la age para estar en ambas clases de acción. En la página representada, puede ver que el formulario de búsqueda también accede a las propiedades de RegisterAction (porque están en la parte superior de ValueStack). Pero necesita acceder a SearchAction . Debe mostrar 20 y no 10.

Claramente lo estoy haciendo mal. Pero incluso después de mucho googlear, todavía no encontré la manera correcta de hacerlo.


El concepto de vista se usa para realizar cualquier cantidad de acciones, y cualquier acción puede tener cualquier cantidad de resultados. Un resultado se usa para devolver una vista. La acción que devuelve una vista se coloca encima de ValueStack para que se pueda acceder fácilmente a través de la evaluación de expresiones OGNL. La vista de resultados se puede asignar a cualquier acción en cualquier clase de acción. No sabe nada acerca de la acción que lo llama, pero puede determinarlo, nuevamente usando OGNL. Puede asignar acciones a diferentes métodos de la misma clase de acción, por lo que no necesita tener muchos métodos de input() .

EDITAR:

Tu problema es que los campos del formulario están equivocados. Cada formulario debe tener un almacenamiento por separado para mostrarlo correctamente. Los campos están delimitados por su nombre, y será mejor que tenga un form bean para las variables de condición de búsqueda y lo coloque en algún lugar del contexto de acción.

<s:form action="executeSearch"> <s:textfield key="searchBean.name" label="Name"/> <s:textfield key="searchbean.age" label="Age"/> <s:submit/> </s:form> <s:form action="executeRegister"> <s:textfield key="firstName" label="First Name"/> <s:textfield key="lastName" label="Last Name"/> <s:textfield key="age" label="Age"/> <s:submit/> </s:form>

Nota: el atributo key genera name , label y value .

Cada acción necesita inicializar un searchBean , a menos que tenga un alcance de sesión. Si coloca un frijol en una sesión, debe usar #session. prefijo. Obtenga más información acerca de OGNL en la página de documentos.


De acuerdo. Estoy dando una respuesta a mi propia pregunta. Después de mucho más tiempo de Google, descubrí que la inicialización de la acción secundaria con <s:action /> dentro de JSP hace lo que necesito. Esta etiqueta también puede devolver el objeto de acción en una variable, que podemos presionar en ValueStack para el formulario. Un ejemplo se ve así:

<!-- Initializes search model (preloading and stuff). --> <s:action var="searchAction" name="inputSearch" > <s:param name="origin" value="inputRegister"/> </s:action> <!-- Pushing search action on ValueStack for the search form. --> <s:push value="#searchAction"> <s:form action="executeSearch"> <s:hidden name="origin"/> <s:textfield key="name" label="Name"/> <s:textfield key="age" label="Age"/> <s:submit/> </s:form> </s:push> <!-- This is the main form. It knows nothing about the search action. --> <s:form action="executeRegister"> <s:textfield key="firstName" label="First Name"/> <s:textfield key="lastName" label="Last Name"/> <s:textfield key="age" label="Age"/> <s:submit/> </s:form>

Esto funciona bien. Sin embargo, hay dos cuestiones que deben tenerse en cuenta:

  • La acción de búsqueda se usa en muchas páginas. Si la validación del formulario de búsqueda falla, tenemos que volver a la página original. Lo resolví teniendo un parámetro de "origen". Esto se establece en el nombre de la acción de entrada principal. La acción de búsqueda encadena a esta acción si la validación falla.
  • La acción de búsqueda se inicializa muy tarde, cuando la representación del JSP ya está en pleno progreso. Las excepciones en este punto pueden ser problemáticas. Tuve que cuidarme de atrapar todas las excepciones yo mismo.