Olá, pessoal !
Estou iniciando os estudos no struts 2, e to penando um bocado… primeiramente penei pra configura-lo juntamente com o tiles, mas finalmente consegui e agora tah daorinha… estou usando o struts 2.0.9 e tiles 2.0.4, antes q alguem me pergunte
Bom, agora tava fazendo uma aplicacaozinha, quando me deparei com o fato de uma acao naum ter nenhum contato com o ServletRequest, ServletResponse, etc… no inicio (pois tinha dado uma olhada no struts 1.x ano passado…coisa rápida ), estranhei, mas tudo bem, pois realmente, se quisesse reutilizar a classe em outro ambiente não teria tais variáveis…
Imaginei que haveria outro lugar, e, pesquisando na documentacao (javadoc), encontrei a classe ActionContext, e descobri que ActionContext.getContext().getSession()
obteria os dados de sessao atraves de um Map. Esperava que ActionContext.getContext().setSession(dados)
pudesse gravar dados de forma que pudesse acessá-los de qualquer jsp, mas não foi esse o resultado obtido.
Agora ficam duas questões… como gravar dados de forma a recuperá-los em outras partes do programa ( como numa sessão ), e quais a formas mais práticas pra realizar este tipo de operação no Struts2 - é claro, sempre visando a possível reutilização dos actions em ambientes diversos - como swing, ou em midlets
Grato !!!
para colocar objetos na sessão, simplesmente faça:
Map session = ActionContext.getContext().getSession();
session.put(key, value);
Para recuperar, faça:
Map session = ActionContext.getContext().getSession();
Object value = session.get(key);
Veja: http://struts.apache.org/2.x/docs/how-do-we-get-access-to-the-session.html
Aqui vc verá que o jeito mais elegante de recuperar a session é implementando SessionAware
Na verdade, isso que vc fez eu jah tinha tentato, mas sem sucesso… sempre que tento recuperar esse valor, seu encontro o resultadonull
O que tentei realizar foi o seguinte:
Dentro de uma action:
logger.trace("Leitura da Sessão");
Map vsessao = actionContext.getSession();
logger.debug("Gravando dados em Sessao");
vsessao.put("ora", "Luiz");
Esse logger eh um Logger do log4j, apenas pra ter certeza que tava gravando…
Dentro de um jsp:
Map sesszon = ActionContext.getContext().getSession();
String value = (String) sesszon.get("ora");
out.println(value);
e o resultado eh null !!!
Ah, outro problema eh que muitas vezes o action context do primeiro código retorna null !!! O que será ocorre? Meu package extende o tiles-default ( que por sua vez extende o struts-default, pelo que eu li )… Está faltando alguma coisa???
Opa e ai beleza ?
Olha seu problema é muito simples, para você obter o objeto HttpSession, HttpServletRequest ou HttpServletResponse, basta fazer o seguinte:
Quando vc cria sua action, vc herda a classe ActionSupport .
Para pegar ter os objetos basta fazer
ServletActionContext.getResponse() para o objeto Response
ServletActionContext.getRequest() para p objeto Request
ServletActionContext.getRequest() .getSession() para o objeto sessão
Abraços
E ae, MauNunes, tudo Beleza ???
poxa, cara, valeu msm, funcionou legal, passei a ter acesso ao session… meu action já era extendia a classe ActionSupport, portanto soh precisei usar a classe ServletActionContext para conseguir o acesso direto a action…
Mas agora vem outra duvida… a Classe ActionSuport e a estrutura atual do Struts 2 foi criada para permitir maior portabilidade, de forma que possamos reutilizar o Controler ( o action ) em outras plataformas alem da web, ou estou errado? Se for o caso, se utilizar essa classe, estarei acabando com a reutilização dela… como fazer para passar entao as informações para a view, sem, entretanto, acabar com a reutilizacao da action ?
Valeu novamente !!!