O ciclo de vida do ValueStack em todo o aplicativo está no struts2?
-
15-11-2019 - |
Pergunta
Posso definir uma propriedade ValueStack
em várias formas.
ValueStack stack = ActionContext.getContext().getValueStack();
stack.getContext().put("resultDTO",resultDTO); //1. creates a different branch
//parallel to root
stack.set("resultDTO", resultDTO); //2. pushes on root as a Map?
stack.push(resultDTO); //3. pushes on root
myActionClass.setProperty(); //4. normal action accessor
Eu preciso conseguir todos esses valores de volta em JSP, freemarker e java como
stack.findValue() or stack.findString().
Quero saber sobre o ciclo de vida de cada um desses 4 métodos de configuração.É em todos os aplicativos.É o ValueStack criou todas as solicitações e os valores do aplicativo e da sessão são definidos para cada solicitação?
Eu sei que o quarto método é a abordagem mais comum, mas posso não usá-lo em todos os lugares onde a classe de ação não é facilmente acessível.
Estou com outra dúvida sobre acesso em JSP
<s:push value="resultDTO" ><s:property value="data.form1[0]" /></s:push>
<!--5.works for context.put() & stack.set() both-->
<s:property value="#resultDTO.data.form1[0].countryofissue" /> <!--6.context.put()-->
<s:property value="resultDTO.data.form1[0].countryofissue" /> <!--7.stack.set()-->
<s:property value="data.form1[0].countryofissue" /> <!--8.stack.push()-->
Eu também quero saber como funciona o 5º ponto em ambos stack.getContex().put()
e stack.set()
?Eu entendo que na 6ª resultadoDTO Estou acessando, é uma raiz diferente e na 7ª é filho da raiz padrão, que é o ValueStack.No 8º ele começa a pesquisar na raiz padrão.
Eu atravessei http://struts.apache.org/2.0.11.1/docs/ognl.html, http://struts.apache.org/2.1.2/struts2-core/apidocs/com/opensymphony/xwork2/util/ValueStack.html e bastante confuso este link http://www.opensymphony.com/ognl/html/DeveloperGuide/introduction.html#embeddingOGNL
Tendo dito tudo isso, estou pouco inclinado a usar stack.getContext().put()
método, pois posso ver claramente os valores definindo o URL como ?debug=navegador.Avise-me se eu estiver errado.
Solução
O ValueStack
é por solicitação.Se você colocar valores na pilha, eles estarão acessíveis posteriormente na solicitação (ou seja, na camada de visualização), mas não sobreviveriam a um redirecionamento, que seria uma nova solicitação HTTP e teria seu próprio ValueStack
.
Em condições normais, os parâmetros na URL ou em uma postagem de formulário seriam definidos na ação usando os métodos setter da ação.Em um interceptor, você pode adicionar valores diretamente à pilha.Por exemplo, o ExceptionMappingInterceptor
usa o stack.push(Object)
método para publicar exceções para uso em páginas de erro.
stack.getContext().put(String, Object)
- Coloca a chave/valor em um mapa que fica na pilha.O mapa representa o contexto da pilha.stack.set(String, Object)
-- Coloca a chave/valor em um mapa que fica na pilha.Não tenho certeza de como isso se relaciona com o método anterior, exceto que é um mapa diferente.stack.push(Object)
-- Isso coloca o objeto na raiz da pilha.
Você não deve precisar colocar nada na pilha dentro da camada de visualização, então estou curioso para saber o que você está tentando fazer que exige isso.