struts2 - a compreensão da pilha de valores
-
05-07-2019 - |
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.
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