Pergunta

Eu tenho uma pergunta sobre a pilha de valores struts2. Digamos que eu tenha uma classe de ação chamado RegisterAction que tem um método de execução da seguinte forma:

public String execute() {
    ValueStack stack = ActionContext.getContext().getValueStack();
    stack.push(new String("test string"));
    return SUCCESS;
}

As minhas struts.xml esta aparência:

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

controle Então fluirão para a success.jsp após os executam executa o método em que a classe.

As minhas perguntas são:

1) como faço para obter esse valor eu empurrei na pilha no success.jsp?

2) Vamos dizer em success.jsp Eu tenho um <s:submit method="testMethod" /> que redireciona para uma classe de ação chamada TestAction. Em outras palavras, a partir da página Register, o usuário clica em enviar e, no método execute do RegisterAction que empurrar o "string test" na pilha. Então vamos para success.jsp. O success.jsp tem um botão que nos direciona para TestAction#testMethod enviar. Em TestAction#testMethod, é o valor que eu empurrado na pilha em RegisterAction#execute ainda está aí? Como posso conseguir? Dei um passo através do depurador eclipse, mas eu não ver o valor.

Graças.

Foi útil?

Solução

Ok, eu descobri isso.

1) A maneira que eu encontrei para obter objetos na pilha de valores para que possamos acessá-los a partir de um jsp é assim:

Map<String, Object> context = new HashMap<String, Object>();
context.put("key", "some object");
context.put("key2", "another object");
ActionContext.getContext().getValueStack().push(context);

Em outras palavras, podemos colocar um HashMap na pilha valor contendo os objetos que precisamos. Em seguida, no jsp, podemos acessar os valores reais como esta:

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

Ele vai olhar através da pilha de valores e encontrar os valores na HashMap que empurrou.

2) Uma instância da classe de ação está associada com apenas um pedido. Então, quando vamos para uma outra ação e depois acabam em outro jsp, o material que nós empurrado na pilha valor da primeira ação não vai estar lá desde a outra ação tem a sua própria pilha de valores. referência: http://www.manning-sandbox.com/thread.jspa?messageID = 93045

Vocês podem se sentir livre para me corrigir se nada disto é errado ou se existem maneiras mais inteligentes de fazer estas coisas:.)

Graças.

Outras dicas

Struts 2 adiciona a sua ação para o topo da pilha de valores quando executado. Então, a forma usual para colocar as coisas na pilha de valores é adicionar getters / setters para os valores para sua classe de ação. Você ainda usa os s:. Tag propriedade para acessar os valores

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

apenas definir uma propriedade como

String string1 = "test string";

em sua ação.

em jsp você pode acessar diretamente.

exemplo

 <s:property value="string1"/>

irá imprimir

"string test"

Normalmente, como diz Nate, você vai usar um campo em sua ação, uma vez que a ação é sempre na ValueStack. No entanto, isso não funciona se você estiver escrevendo código interceptor desde o interceptor será ido pelo tempo que o modelo (JSP / freemarker etc) é invocado. Lá você precisa colocar algum tipo de java feijão-como objeto na ValueStack, assim como você faz acima.

Hi apenas para informações

Estas é uma desvantagem de usar getValueStack().getContext(), por vezes, os dados não estava disponível em .ftl (dados não estava mostrando na linha 2, mas ele estava vindo em linha 1) Eu realmente não sei a razão para isso. Mas usando .getValueStack().set("resDTO",resDTO); o problema foi resolvido (dados estava sendo preenchidos para ambas as funções).

 ${resDTO.data} //line 1
var selonload='<@s.property value="resDTO.data" escape="false" />'; //line 2
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top