Struts 2 - Interceptador

Olá, estou acompanhando a apostila da Caelum e cheguei na parte dos interceptadores.

Eu não conseguir fazer, dei uma boa pesquisada aqui no forum e achei algumas coisas porém nada que desse certo.

Ele pede para que eu add o interceptador no struts-xml que está dentro da pasta src, porém esse strutsxml NÃO EXSTE.

Ai fica dificil né…

Minha classe de interceptador está assim:


package br.com.jdbc.interceptor;

import br.com.cfr.jdbc.modelo.Usuario;

import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.Interceptor;

	public class AutorizadorInterceptor implements Interceptor {
	
    @Override  
    public void destroy() {  
        // TODO Auto-generated method stub  
          
    }  
  
    @Override  
    public void init() {  
        // TODO Auto-generated method stub  
          
    }  
	
    
    @Override  
    public String intercept(ActionInvocation invocation) throws Exception {  
    	
    	Usuario usuarioLogado = (Usuario)invocation.getInvocationContext().
    			getSession().get("usuarioLogado");
    			if (usuarioLogado == null) {
    			return "naoLogado";
    			}
    			return invocation.invoke();
    			}

}

Muito obrigado!!

[quote=JoaoMarques]

Ele pede para que eu add o interceptador no struts-xml que está dentro da pasta src, porém esse strutsxml NÃO EXSTE.

Ai fica dificil né…[/quote]
#Euri.
Camarada, você precisa criar o arquivo struts.xml (veja bem o nome do arquivo, trata-se da versão 2 do Struts, ok?).
Existem vários exemplos na net e, também, nos exemplos do próprio Struts 2, quando você baixa o pacote full.

AHHHH, então é só cria-lo?

então beleza… vou dar uma testada aqui e qualquer coisa posto de novo, obrigado!

[quote=JoaoMarques]AHHHH, então é só cria-lo?

então beleza… vou dar uma testada aqui e qualquer coisa posto de novo, obrigado![/quote]
Exatamente.
Pesquise na web por struts.xml e veja exemplos para criar um com a versão xsd compatível com a que está utilizando.

Bom então fui dar aquela testada e o projeto nem chegou a carregar :confused:

Eu tento acessar um link qualquer e ele mostra o erro 404.

Pior que estou seguindo tudo que está escrito na apostila x.x.

Olha oque eu já cheguei a fazer:

Struts.xml

<?xml version="1.0" encoding="UTF-8"?>

<package>

<interceptors>

	<interceptor name="autorizador"
		class="br.com.jdbc.interceptor.AutorizadorInterceptor"/>
		
	<interceptor-stack name="seguranca">
		<interceptor-ref name="autorizador" />
		<interceptor-ref name="defaultStack" />
	</interceptor-stack>
	
</interceptors>

<global-results>
	<result name="naoLogado">/WEB-INF/content/home_visitante.jsp</result>
</global-results>

</package>

CLASSE PARA TESTAR A INTERCEPTOR

package br.com.cfr.action;

import java.util.List;

import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.InterceptorRef;
import org.apache.struts2.convention.annotation.Result;

import br.com.cfr.jdbc.dao.SugestaoDAO;
import br.com.cfr.jdbc.modelo.Sugestao;

public class ListaSugestoesAction {

		private List<Sugestao> sugestoes;	
		
		public void setSugestoes(List<Sugestao> sugestoes) {
			this.sugestoes = sugestoes;
		}		
		
		@Action(value="listaSugestoes", results = {
				@Result(name="ok", location="sugestoes_reclamacoes_admin.jsp")
				}, interceptorRefs={ @InterceptorRef("seguranca")})

		public String execute() throws ClassNotFoundException {
			sugestoes = new SugestaoDAO().lista();
		return "ok";
		}
		public List<Sugestao> getSugestoes() {
		return sugestoes;
		}

}

CLASSE INTERCEPTOR

package br.com.jdbc.interceptor;

import br.com.cfr.jdbc.modelo.Usuario;

import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.Interceptor;

	public class AutorizadorInterceptor implements Interceptor {
	
    @Override  
    public void destroy() {  
        // TODO Auto-generated method stub  
          
    }  
  
    @Override  
    public void init() {  
        // TODO Auto-generated method stub  
          
    }  
	
    
    @Override  
    public String intercept(ActionInvocation invocation) throws Exception {  
    	
    	Usuario usuarioLogado = (Usuario)invocation.getInvocationContext().
    			getSession().get("usuarioLogado");
    			if (usuarioLogado == null) {
    			return "naoLogado";
    			}
    			return invocation.invoke();
    			}

}

Uma última pergunta. Pelo o que eu li parece que ele só irá interceptar actions seria isso ?
Porque eu gostaria que interceptasse jsp’s tbm …

Muito obrigado!

E o web.xml?

Bom, Struts 2 é action based, ou seja, toda requisição à uma jsp é uma ação.
Desta forma, você só consegue interceptar as actions, porém, como todo o controle das jsps está em cada action, é quase a mesma coisa.

Hm, mais então eu tenho que passar esta logica para o web.xml é isso?

Andou pulando algumas páginas da apostila?

Você precisa avisar o Struts 2 que existe uma requisição para algo que ele controla, no caso, as actions e os interceptors.
Caso contrário, o erro 404 - página/arquivo não encontrada(o) será exibido.

Deve haver, na apostila, alguma referência de como configurar o web.xml para usar o Struts 2.

Então eu tenho configurado o web.xml porém na apostila na parte de interceptor não fala nada sobre ele apenas o struts.xml… onde que estaria exatamente meu erro?

Para os interceptors, realmente, apenas struts.xml.
Mas, para que o engine do Struts 2 funcione, precisa sim, aliás, sempre configurar o web.xml com os dados do Struts 2.

É um requisito, afinal, dentro do ciclo de processamento de aplicativos java para a web, o container ou servidor somente irá ler o web.xml. Se não houver menção ao Struts 2, como ele será acionado?

Hm então eu tenho que add algo no web.xml para que ele possar ler o struts algo assim?

E como seria isso?

Pelo visto pulou várias páginas da apostila ou elas se perderam.
Certeza que tem essa configuração aí nas mãos e não procurou ainda.

Então eu estou procurando porém eu acho muito estranho o fato de na parte de interceptor ele não falar nada do web.xml…

Mais tudo bem vou continuar tentando me virar aqui vlw

[quote=JoaoMarques]Então eu estou procurando porém eu acho muito estranho o fato de na parte de interceptor ele não falar nada do web.xml…

Mais tudo bem vou continuar tentando me virar aqui vlw[/quote]
Camarada, sem a configuração do web.xml o Struts 2 não funciona.
É o mesmo que você querer que seu carro ande, sem dar a partida.

É no web.xml que o Struts 2 ficará sabendo que precisa intervir, tomar conta do processo.
Isso independe do que você terá, tags, actions ou interceptors, tudo depende do aviso que o web.xml dará ao Struts 2, da partida para o carro andar.

Isto eu entendi :).

O problema mesmo é fazer o web.xml pegar essa interceptor estou procurando aqui na apostila mais sem sucesso . :confused:

[quote=JoaoMarques]Isto eu entendi :).

O problema mesmo é fazer o web.xml pegar essa interceptor estou procurando aqui na apostila mais sem sucesso . :/[/quote]
Infelizmente o guj não tem nenhuma maneira de se desenhar a resposta…

Você não vai por a p**** do interceptor no web.xml. Ele será utilizado quando a ação correspondente for acionada. Por isso é preciso criar o arquivo struts.xml dentro da pasta raiz do projeto (src).

Vamos tentar explicar passo a passo
1 - Requisição feita pelo cliente para a url http://localhost:8080/struts2interceptor
2 - O tomcat, que está habilitado para ouvir a porta 8080 do localhost recebe a requisição, procura algum projeto com o nome struts2interceptor.
Caso não encontre, devolve o erro 404.
Caso encontre, lê o web.xml e procede conforme o que está ali.
Caso o web.xml possua uma configuração de servlet ao Struts 2 é ele que irá dar o próximo passo, verificar na pasta src se existe o arquivo struts.xml.
Caso exista, ele irá assimilar as configurações ali presentes, dentre elas, as actions, results (location ou redirect), types e interceptors.
Não existindo o struts.xml, o framework assume o seu próprio como default e vai caçar anotações nas classes.
Se ele encontrar uma anotação @Action cujo atributo value corresponda à action em questão, ele irá executar o método correspondente e proceder com os passos normalmente.
Senão, devolve o erro 404, também.

Como você criou e inseriu no arquivo struts.xml a configuração do interceptor, é quando o tomcat “deixa” a cargo do Struts 2 que ele será identificado e os métodos dele serão executados quando a ação relacionada for chamada, seja no início ou ao fim da mesma.

Ficou mais claro?