Duvida Servlet Filter

Boa tarde!

Gostaria de saber se tem como capturar atravez de um filter ou outra coisa o .class do servlet que está sendo chamado?

Abraços

Existe o método getServletName() da interface ServletConfig,que te retorna o nome do servlet.
Isso te basta?

Cara, .class não sei, mas tem como vc pegar o nome da classes utilizando um System.out.println(Classe.class); Com isso vc sabe a classe que está sendo invocada. Se seu sistema utiliza de apenas uma classe por .class então c ta tranquilo.

raf4ever O HttpServlet implementa essa interface. EU gostaria de pegar a classe antes de chegar no servlet. Pois estou usando um esquema de injeção de dependencia e quando passar pelo meu filtro ou algum tipo de interceptor eu faço a injeção atraves da classe que for chamada.

Como faço?

Abraços

Então jakefrog, Quando eu sei o nome da classe eu consigo sim dessa forma pegar o Class desse objeto. Mais minha duvida e como pegar o class da Classe que está sendo chamada.
Alguma ideia?

Obrigado pela força!

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { Class<? extends ServletRequest> classe = request.getClass(); }Assim resolve? Você quer saber a classe do Servlet mesmo?

Flw! :thumbup:

[quote=von.juliano]public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { Class<? extends ServletRequest> classe = request.getClass(); }Assim resolve? Você quer saber a classe do Servlet mesmo?

Flw! :thumbup: [/quote]

von.juliano blz?

Quando eu executo essa linha ele me retorna a classe:

class org.apache.catalina.connector.RequestFacade

Na realidade o que eu preciso e o seguinte:

Quando redireciono para um servlet ( ex: “LoginServlet” ) eu quero saber essa classe.

Ex:

Chamada do de um servlet qualquer.

[code]
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {

Class<?> classeQueEstaSendoChamada = algumaCoisa;

Injector.getInjector().getInstance(classeQueEstaSendoChamada);

}[/code]

Alguma outra ideia?
Obrigado pela ajuda!

Cara,

acho impossível. Você não tem como fazer a sua solução sem depender disso? Eu, particularmente, nunca vi injeção de dependência precisar saber a classe alvo do Servlet. Sem falar que, conhecer a classe que implementa determinada URL, aumenta o nível de acoplamento.

brucsantos, o que você pretende fazer se conseguir obter o nome do servlet?

[quote=Leonardo3001]Cara,

acho impossível. Você não tem como fazer a sua solução sem depender disso? Eu, particularmente, nunca vi injeção de dependência precisar saber a classe alvo do Servlet. Sem falar que, conhecer a classe que implementa determinada URL, aumenta o nível de acoplamento.[/quote]

Então… até tem como fazer so que eu achei melhor fazer assim. E mesmo eu não usando a injeção de dependencia dessa forma, gostaria de tirar essa duvida.
Só um duvida. Se você fosse fazer uma classe que faz injeção de dependencia, como você faria para saber a classe que você tem que efetuar a injeção sem ter o Class?
Tem como?

Alguem sabe como faz para capturar o Class do servlet ivocado?

Abraços

Então eu vou injetar uma instancia de um service que foi mapeado na configuração da minha aplicação no servlet que esta sendo chamdo.

[quote=brucsantos]Então… até tem como fazer so que eu achei melhor fazer assim. E mesmo eu não usando a injeção de dependencia dessa forma, gostaria de tirar essa duvida.
Só um duvida. Se você fosse fazer uma classe que faz injeção de dependencia, como você faria para saber a classe que você tem que efetuar a injeção sem ter o Class?
Tem como?

Alguem sabe como faz para capturar o Class do servlet ivocado?

Abraços[/quote]

Vamos lá. Como funciona em frameworks de injeção de dependência?

A classe a ser injetada possui atributos que são referências a interfaces. Um container pode injetar um objeto procurando qualquer um (de preferência apenas um) que implementa a interface da referência. Repare bem: existe uma tabela “de-para”, interna do framework, onde eu procuro as instâncias apropriadas. E existe um módulo de configuração, que deve existir além do seu código.

Então eu vou injetar uma instancia de um service que foi mapeado na configuração da minha aplicação no servlet que esta sendo chamdo.[/quote]

Ninguém nunca consegue injetar em Servlets. Nem mesmo com frameworks como Spring, Guice e o (blerg!) CDI. A razão é que é uma instância gerenciada por container e que já possui uma superclasse (HttpServlet).

Você só tem uma opção: fazer lookup, ou seja, uma função da sua biblioteca de DI que busque um objeto qualquer dado uma chave.


Você só tem uma opção: fazer lookup, ou seja, uma função da sua biblioteca de DI que busque um objeto qualquer dado uma chave.[/quote]
Talvez possa utilizar uma solução mais simples: colocar um atributo na requisição indicando que o serviço é necessário, no Filter verifica se o atributo está lá, e se estiver coloca o serviço no request, para ser usado no Servlet. Já que não é possível injetar nada no Servlet, talvez essa solução simples se torne viável.

Flw! :thumbup:

Então eu vou injetar uma instancia de um service que foi mapeado na configuração da minha aplicação no servlet que esta sendo chamdo.[/quote]

Ninguém nunca consegue injetar em Servlets. Nem mesmo com frameworks como Spring, Guice e o (blerg!) CDI. A razão é que é uma instância gerenciada por container e que já possui uma superclasse (HttpServlet).

Você só tem uma opção: fazer lookup, ou seja, uma função da sua biblioteca de DI que busque um objeto qualquer dado uma chave.

[/quote]

Na realidade a outra forma que falei seria fazer a injeção fora do servlet, na minha classe de configuração do sistema.

So uma duvida:

Então se eu fizer isso não funcionaria? É isso mesmo que você quiz dizer Leonardo3001?


public class CaptureCasesServlet extends HttpServlet {

	private static final long serialVersionUID = 1L;
	
	static CatchInformationService service;	

	public CaptureCasesServlet() {
		super();			
	}
	
	@Inject
	public CaptureCasesServlet(@Service CatchInformationService instance) {
		super();
		if(service == null) {
			service = instance;
		}
	}

Abraços

[quote=brucsantos]Na realidade a outra forma que falei seria fazer a injeção fora do servlet, na minha classe de configuração do sistema.

So uma duvida:

Então se eu fizer isso não funcionaria? É isso mesmo que você quiz dizer Leonardo3001?


public class CaptureCasesServlet extends HttpServlet {

	private static final long serialVersionUID = 1L;
	
	static CatchInformationService service;	

	public CaptureCasesServlet() {
		super();			
	}
	
	@Inject
	public CaptureCasesServlet(@Service CatchInformationService instance) {
		super();
		if(service == null) {
			service = instance;
		}
	}

Abraços
[/quote]

Exato, não funcionaria! O container Web chama sempre o construtor vazio, e a injeção nunca ocorreria.

O jeito correto seria assim (assumindo que você use o Spring):

public void doGet(HttpServletRequest req, HttpServletResponse resp) throws Exception {
     final WebApplicationContext context = 
        WebApplicationContextUtils.getWebApplicationContext(
            config.getServletContext());

    CatchInformationService service = (CatchInformationService) context.getBean("catchInformationService");

    // faz qualquer coisa com a instancia "service"
}

Um outro framework DI teria uma função similar pra buscar objetos gerenciados.

P.S.: Não ponha nada em variáveis estáticas quando usar Servlet! Lembre-se que vários usuários irão manipular o objeto ao mesmo tempo, podendo haver problemas de concorrência!

[quote=Leonardo3001][quote=brucsantos]Na realidade a outra forma que falei seria fazer a injeção fora do servlet, na minha classe de configuração do sistema.

So uma duvida:

Então se eu fizer isso não funcionaria? É isso mesmo que você quiz dizer Leonardo3001?


public class CaptureCasesServlet extends HttpServlet {

	private static final long serialVersionUID = 1L;
	
	static CatchInformationService service;	

	public CaptureCasesServlet() {
		super();			
	}
	
	@Inject
	public CaptureCasesServlet(@Service CatchInformationService instance) {
		super();
		if(service == null) {
			service = instance;
		}
	}

Abraços
[/quote]

Exato, não funcionaria! O container Web chama sempre o construtor vazio, e a injeção nunca ocorreria.

O jeito correto seria assim (assumindo que você use o Spring):

public void doGet(HttpServletRequest req, HttpServletResponse resp) throws Exception {
     final WebApplicationContext context = 
        WebApplicationContextUtils.getWebApplicationContext(
            config.getServletContext());

    CatchInformationService service = (CatchInformationService) context.getBean("catchInformationService");

    // faz qualquer coisa com a instancia "service"
}

Um outro framework DI teria uma função similar pra buscar objetos gerenciados.

P.S.: Não ponha nada em variáveis estáticas quando usar Servlet! Lembre-se que vários usuários irão manipular o objeto ao mesmo tempo, podendo haver problemas de concorrência!
[/quote]

Então… eu não uso spring mais esse codigo que te mostrei funciona sim!

Eu estou usando assim e não tenho problemas. O unico problema e que eu queria mudar a forma de injetar o atributo atraves de um filter ou algum tipo de interceptor

E quanto ao static os metos são sincronizados


Cara, estava pensando aqui.

Pq vc não da o nome da sua action como nome do seu servlet e adota isso como padrão?

Se vc chamar LoginAction seria a classe LoginAction. Seria mais fácil inclusive de dar manutenção. Vc poderia depois aplicar algum verificador de código para validar se alguem criou uma action com nome diferente da classe. [=

[quote=jakefrog]Cara, estava pensando aqui.

Pq vc não da o nome da sua action como nome do seu servlet e adota isso como padrão?

Se vc chamar LoginAction seria a classe LoginAction. Seria mais fácil inclusive de dar manutenção. Vc poderia depois aplicar algum verificador de código para validar se alguem criou uma action com nome diferente da classe. [=[/quote]

Boa noite jakefrog!

Eu sempre uso isso como padão Ex:

LoginServlet -> Action: login.srv ou login.action como preferir…

Mais minha duvida não é essa! srs

Valew pela força!

Abraços

Bom dia!

Alguem tem ideia de como eu posso pegar a classe do servlet invocado???

Abraços