Pregunta

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>

Por lo tanto, el control fluirá a success.jsp después de que el método execute se ejecute en esa clase.

Mis preguntas son:

1) ¿cómo obtengo el valor que introduje en la pila en el success.jsp?

2) Digamos que en <s:submit method="testMethod" /> tengo un TestAction que redirige a una clase de acción llamada TestAction#testMethod. En otras palabras, desde la página de Registro, el usuario hace clic en enviar, y en el método de ejecución de RegisterAction#execute presionamos & Quot; cadena de prueba & Quot; en la pila Luego vamos a <=>. El <=> tiene un botón de envío que nos dirige a <=>. En <=>, ¿el valor que introduje en la pila en <=> todavía está allí? ¿Cómo puedo obtenerlo? Pasé por el depurador de eclipse pero no veo el valor.

Gracias.

¿Fue útil?

Solución

Ok, descubrí esto.

1) La forma en que encontré para obtener objetos en la pila de valores para poder 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 el jsp, podemos acceder a los valores reales como este:

<s:property value="key" />
<s:property value="key2" />

Examinará la pila de valores y encontrará esos valores en el HashMap que empujamos.

2) Una instancia de la clase de acción está asociada con una sola solicitud. Entonces, cuando vamos a otra acción y luego terminamos en otro jsp, las cosas que empujamos 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 sentirse libres de corregirme si algo de esto está mal o si hay formas más inteligentes de hacer estas cosas :).

Gracias.

Otros consejos

Struts 2 agrega su acción a la parte superior de la pila de valores cuando se ejecuta. Entonces, la forma habitual de poner cosas en la pila de valores es agregar captadores / establecedores para los valores a su clase de acción. Todavía usa la etiqueta s: propiedad para acceder a los valores.

Un tutorial CRUD: http: //struts.apache .org / 2.1.6 / docs / crud-demo-i.html

solo define una propiedad como

String string1 = "test string";

en tu acción.

en jsp puede acceder directamente.

por ejemplo

 <s:property value="string1"/>

se imprimirá

  

" cadena de prueba "

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 código de interceptor, ya que el interceptor habrá desaparecido cuando se invoque la plantilla (JSP / freemarker, etc.). Allí debe colocar algún tipo de objeto similar a un bean Java en ValueStack, tal como lo hizo anteriormente.

Hola, solo para información

Esto es una desventaja de usar getValueStack().getContext() a veces los datos no estaban disponibles en .ftl (los datos no se mostraban en la línea 2, pero estaban llegando en la línea 1) Realmente no sé la razón de esto. Pero usando .getValueStack().set("resDTO",resDTO); se resolvió el problema (los datos se estaban completando para ambas funciones).

 ${resDTO.data} //line 1
var selonload='<@s.property value="resDTO.data" escape="false" />'; //line 2
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top