Struts 2

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 :slight_smile:
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 :wink: ), 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 :slight_smile:

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