java - struts2 file
struts2-entendiendo la pila de valores (5)
Hola solo por información
Esta es una desventaja de usar getValueStack().getContext()
veces los datos no estaban disponibles en .ftl (los datos no se mostraban en la línea 2, pero venían en línea1) realmente no sé la razón para esto. Pero usando .getValueStack().set("resDTO",resDTO);
el problema fue resuelto (los datos se estaban poblando para ambas funciones).
${resDTO.data} //line 1
var selonload=''<@s.property value="resDTO.data" escape="false" />''; //line 2
Tengo una pregunta sobre la pila de valores struts2. Digamos que tengo una clase de acción llamada RegisterAction
que tiene un método de ejecución de la siguiente manera:
public String execute() {
ValueStack stack = ActionContext.getContext().getValueStack();
stack.push(new String("test string"));
return SUCCESS;
}
Mi struts.xml se ve así:
<struts>
<package name="default" extends="struts-default">
<action name="*Register" method="{1}" class="vaannila.RegisterAction">
<result name="populate">/register.jsp</result>
<result name="input">/register.jsp</result>
<result name="success">/success.jsp</result>
</action>
<action name="*Test" method="{1}" class="vaannila.TestAction">
<result name="test">/test.jsp</result>
<result name="success">/success2.jsp</result>
</action>
</package>
</struts>
Entonces, el control fluirá al archivo success.jsp luego de que el método de ejecución se ejecute en esa clase.
Mis preguntas son:
1) ¿Cómo obtengo ese valor que empujé en la pila en el success.jsp
?
2) Digamos en success.jsp
Tengo un <s:submit method="testMethod" />
que redirige a una clase de acción llamada TestAction
. En otras palabras, desde la página Registrar, el usuario hace clic en enviar, y en el método de ejecución de RegisterAction
pulsamos la "cadena de prueba" en la pila. Luego vamos a success.jsp
. El success.jsp
tiene un botón de enviar que nos dirige a TestAction#testMethod
. En TestAction#testMethod
, ¿el valor que TestAction#testMethod
en la pila en RegisterAction#execute
todavía está allí? ¿Cómo puedo obtenerlo? Pasé por el depurador de eclipse pero no veo el valor.
Gracias.
Normalmente, como dice Nate, utilizará un campo en su acción, ya que la acción siempre está en ValueStack. Sin embargo, esto no funciona si está escribiendo un código de interceptor ya que el interceptor desaparecerá cuando se invoque la plantilla (JSP / freemarker, etc.). Allí debe colocar algún tipo de objeto tipo java en ValueStack, tal como lo hace arriba.
Ok, me di cuenta de esto.
1) La forma en que encontré para obtener objetos en la pila de valores para que podamos acceder a ellos desde un jsp es así:
Map<String, Object> context = new HashMap<String, Object>();
context.put("key", "some object");
context.put("key2", "another object");
ActionContext.getContext().getValueStack().push(context);
En otras palabras, podemos poner un HashMap en la pila de valores que contiene los objetos que necesitamos. Luego, en jsp, podemos acceder a los valores reales de esta manera:
<s:property value="key" />
<s:property value="key2" />
Mirará a través de la pila de valores y encontrará esos valores en el HashMap que presionamos.
2) Una instancia de la clase de acción está asociada con solo una solicitud. Entonces, cuando vamos a otra acción y luego terminamos en otra jsp, las cosas que presionamos en la pila de valores de la primera acción no estarán allí ya que la otra acción tiene su propia pila de valores. referencia: http://www.manning-sandbox.com/thread.jspa?messageID=93045
Ustedes pueden tener la libertad de corregirme si algo de esto está mal o si hay formas más inteligentes de hacer estas cosas :).
Gracias.
Struts 2 agrega tu acción a la parte superior de la pila de valores cuando se ejecuta. Entonces, la forma habitual de poner cosas en Value Stack es agregar getters / setters para los valores a su clase Action. Aún usa la etiqueta s: property para acceder a los valores.
Un tutorial de CRUD: http://struts.apache.org/2.1.6/docs/crud-demo-i.html
solo defina una propiedad como
String string1 = "test string";
en tu acción
en jsp puede acceder directamente.
p.ej
<s:property value="string1"/>
se imprimirá
"cadena de prueba"