Criando um pool de conexão JEE/TomCat

olá Pessoal,

O post desta semana é sobre pool de conexão, veremos como usar em uma aplicação JEE. Apesar de ter o mesmo efeito de fecharmos de forma programatica uma conexão, mas nem sempre esta ultima é melhor, principalmente em produção uma conexão pode ficar aberta, outra vem a ser aberta e por ai vai até estourar o nosso BD. E para retornar o normal tem que ter dar um restart no tomcat. Imagine em dar um restart no servidor em produção por causa disso?

Até a implementação do pool de conexão é bem lógico e bem refatorado, basta ter o JNDI e pronto. Quando precisar alterar vamos em um local e aonde o JNDI é referenciado já está atualizado (obvio).

Lets go…

Posts recomendados:

MySql + Java

Criando dynamic web project

Pool de Conexão

O pool de conexão é usado do lado do servidor independente da IDE que você está usando, porém cada servidor e IDE tem suas config especiais para o uso do Pool, ou seja, no tomcat é de uma forma, no Jboss eh outra, no glassfish também. E na IDE Netbeans pode mudar, que ele organiza um projeto JEE levemente diferente da IDE eclipse. Mas, nada que o programador precise “comprar um livro” para esse fim.

Requisitos:

Tomcat 5.5/superior – Instalação

Eclipse
MySql – 5.x

Antes de colocar mão na massa certifique-se que você tem o conectar 5.x.jar MySql . Pois, vamos precisar dele em nosso projeto JEE.

  1. crie um novo dynamic web project
  2. Abra o arquivo web.xml e na aba Tree clique em Resources.
  3. Precisamos adicionar uma referência para isso clique em add e deixe conforme abaixo:

< resource-ref>
    < res-ref-name>jdbc/blog
    < res-type>javax.sql.DataSource
    < res-auth>Container
  < /resource-ref>
  1. O name pode ser qualquer um, como jdbc/nomequevcquer
  2. crie um package para conexão br.com.conexao

  3. Agora crie uma classe chamada Conexao com o método a seguir:

import java.sql.Connection;
import java.sql.SQLException;
import javax.naming.InitialContext;
import javax.sql.DataSource;

public class Conexao {

	public static Connection getConnection() throws Exception{

		InitialContext context = new InitialContext();
DataSource ds = (DataSource)context.lookup("java:comp/env/jdbc/blog");

		try {

			return ds.getConnection();
		} catch (SQLException e) {

			throw new Exception(e.getMessage());
		}}}
  1. o método lookup tem como objetivo buscar o jdni que criamos no web.xml

Configurando o config BD no TomCat

  1. crie um arquivo em META-INF chamado context.xml
  2. Aqui vamos passar as configurações do BD para o JNDI que criamos, ou seja, jdbc/blog. Vamos informar qual usuário/senha e schema do BD aquele JNDI deve conectar.

	
	

Então podemos ter vários JNDI em um mesmo context.xml com usuários/senha + schema diferentes. Isso ajuda quando precisar fazer alterações de teste para produção, basta mudar em um lugar. E pronto.

A JNDI é uma API para acesso a serviços de diretórios que permite aplicações cliente descobrir e obter dados ou objetos através de um nome. A API JNDI é utilizada em aplicações Java para acessar recursos externos, como banco de dados, filas ou tópicos JMS e componentes da plataforma Java EE. (Edson Gonçalves).”

Adicione ao projeto o driver do BD na pasta lib. Lembre-se de copia-lo fisicamente para o eclipse, ou seja, saia do eclipse e copie o .jar, pois o eclipse não faz isso automaticamente quando add via library da própria IDE.

Testando

Para testar vamos criar um simples servlet que vai estabelecer a conexão e se der tudo tudo certo, não veremos nenhuma exceção e será impresso uma mensagem.

Mas, antes disso criamos uma pagina .jsp que chama o servlet. Fizemos isso para ser mais rápido e e simples. Já que precisamos apenas saber se o nosso pool está funcionando corretamente.

Servlet.java

  1. crie um package br.com.servlet

  2. Crie um servlet TesteAPP conforme abaixo:

public class TesteAPP extends HttpServlet {
	private static final long serialVersionUID = 1L;

    public TesteAPP() {
        super();
        // TODO Auto-generated constructor stub
    }

	protected void doGet(HttpServletRequest request, HttpServletResponse response)
	throws ServletException, IOException {
		try {
			Conexao.getConnection();
			System.out.println("conexão estabelecida com sucesso");

		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();}}

note: Se usou o assistente do eclipse para criar um servlet, fique atento se não mudou o <url-pattern> . Caso não tenha feito este leva o mesmo nome da class Servlet.

Index.jsp

Apenas encaminha a solicitação para o servlet TesteAPP

Execute o projeto, e veja o resultado esperado.



Note: Não esqueça de verificar se o Banco de dados foi iniciado. Ou seja, deu start no BD? Senão vai receber uma exceção: Communication failure link

Simples não? Vou ficando por aqui e espero que tenham gostado do post.

Abraços, see you next post. :).

Solucionado ROLE_ Spring Security

Olá Pessoal,

O post de hoje vem com o objetivo de complementar dois posts do Edson Gonçalves referente Spring Security. Muitos desenvolvedores que pretende usar Spring Security (SS) em suas apps JEE para implementar a regra de segurança sofrem quando já temos dados cadastrado no BD e não queremos mudar as informações no BD para prefix o ROLE_ que é requerido pelo SS.

Neste post vou mostrar como resolver este problema, que você pode se deparar em sistema legado.

Lets go…

Recomendado:

Spring Security + BD

Spring Security Sem BD

Iniciando

Vou levar em conta que você ja tem implementado o SS conforme este post do Edson Gonçalves. Caso contrário leia o post do Gonçalves antes de continuar com o meu.

Mas, para refrescar sua mente lembre-se que o role deve ter ROLE_ prefixado para que as regras funcionem. Isso é default no SS. Há como alterar, porém pesquisei muitooo e não conseguir implementar, no forum SS há varias sugestoes, mas nenhuma delas foi mais eficiente que prefix o ROLE_ com os dados trazido do BD.

Desenvolvendo

A solução é mais simples que podemos imaginar, você vai precisar apenas prefix o ROLE_. Para quem usa MySQL temos a funcao concat(), no Oracle podemos usar | | etc. Em verifique na documentação do seu banco como concatenar.

A seguir mostramos com o MySQL. É simples demais, confira:

authorities-by-username-query="SELECT  username, concat('ROLE_',authority) FROM users where username = ? "

O código completo fica assim:

< jdbc-user-service data-source-ref="dataSource"  

users-by-username-query="SELECT username, password, 'true' as enable FROM users WHERE username=?"
authorities-by-username-query="SELECT  username, concat('ROLE_',authority) FROM users where username = ? "
/>

ou dessa forma:

 users-by-username-query="SELECT l.login as username, l.senha as password, 'true' as enable from funcionario l where l.login=?"	
authorities-by-username-query="SELECT lo.login as username, CONCAT('ROLE_',lo.cargo)as authority FROM funcionario lo where lo.login=?"	/>
 

Outra dica é se a coluna do usuario/password não for o que o Spring Security espera, basta você fazer conforme o código a seguir:

users-by-username-query="SELECT us.email as username, us.senha as password, 'true' as enable FROM	usuario as us WHERE email=?"
authorities-by-username-query="SELECT  us.email as username, us.tipo as authority FROM usuario us where email= ?"

Vou ficando por aqui, espero que tenham gostado do post.

Abracos e até o próximo post.

Criando Projeto Struts no Eclipse Jboss tools

 

Olá Pessoal,

Nesse post veremos como criar um projeto Struts no Eclipse, veja como é bem simples ter um Struts Project usando o Jboss Tools. Se não tem o Jboss tools configurado no eclipse veja o “post relacionado”. O objetivo deste post é para quem está querendo dar os primeiros passos com Struts, porem nao sabe por onde começar.

Lets go…

 

 

Não irei abordar alguns conceitos tais como: vantagens, quando usar?, por que usar?. Na verdade isso daria um novo post. Para quem tiver interesse em saber mais sobre Struts podem dar uma olhada no link a seguir e também nas vagas de emprego para Java, tenho 99% de certeza de 10 vagas para programador JEE minimo 8 vão pedir do candidato Struts como requisito.

O que é Struts?

Post Relacionado

 

  1. Uma vez com o JBoss configurado, clique em File ==> Project

  2. Localize o diretório Jboss Tools Web

  3. E agora dentro do diretório Struts escolha Struts Project

  4. Clique em next

  5. Dê um nome ao seu projeto e clique em next

  6. Agora escolha o servidor. Nesse caso vamos usar usar TomCat 6

  7. clique em Next

  8. Clique em finish

  9. A estrutura criada deve ser a semelhante a imagem a seguir.

  10. Agora vamos criar uma classe Java com Struts que vai imprimir apenas uma mensagem no browser confirmando a execução do Struts. Portanto crie um package br.com.camilo.struts

  11. Agora crie uma nova classe no package criado no passo anterior, com o nome de TesteStruts tendo como SuperClass a classe Action do Struts. Veja como deve ficar:

  12. Agora atualize sua classe com o código abaixo

 

package br.com.camilo.struts;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
public class TesteStruts extends Action {
	public ActionForward execute(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response) throws Exception{
		/* esse metodo retorna uma mensagem para o struts-config.xml
		 * ao chegar no arquivo struts-config.xml e encontrar o nome done
		 * a pagina eh encaminhada para um arquivo .jsp
		 */
		return mapping.findForward("done");}}

    Mas por que fazer o forward via arquivo .xml do Struts se posso fazer direto do arquivo .java colocando o xx.jsp ??

    A resposta é bem simples se o nome do arquivo mudar, e vc tem 10 classes que faz esse forward para aquele arquivo o que fazer? Atualizar manualmente arquivo por arquivo e se vc esquecer de 1 ou 2 ou mais. Se for 100 arquivos ? Então percebeu o problema? Com o .xml vc somente vai precisar alterar em um local o novo nome do arquivo. Claro que vc pode cair na mesma situação se inventar de alterar o nome de retorno para aquele tipo de redirecionamento, mas ai é outra situação.

     

    1. crie agora um arquivo .jsp chamado de teste.jsp (clique com o botão direito no projeto ==> New File ==> JSP )

    2. Dentro da tag <body> digite a mensagem que deseja visualizar para testar a funcionalidade do Struts.

    3. Agora abra o arquivo struts-config.xml no modo Source.(veja no rodapé do eclipse esta opção)

      Precisamos configurar agora o nosso arquivo .xml do Struts para fazer o redirecionamento é bem simples. Deixe conforme a seguir. Um

      Erro comum a ser cometido é o esquecimento de colocar / no path e o nome class em type.

      1. Para testar nossa aplicação vamos digitar http://localhost:8080/app/testando.do

      2. Esse .do vem la da configurado do arquivo web.xml, abra o arquivo e veja pq nesse caso devemos ter o .do. Não existe nenhum arquivo físico com esta extensão é apenas um nome lógico utilizado e uma recomendação.

      3. Antes de testar aplicação precisamos reiniciar o TomCat então clique no botão do meio.

        Se não encontra-lo, veja em que perspectiva vc está usando. Deveria ser Java EE

      4. Agora abra o webbrowser dentro do próprio eclipse

      5. E digite o endereço abaixo, caso seguiu o mesmo nome usado nesse post

        http://localhost:8080/BlogStruts/testando.do

      6. O resultado deve ser o seguinte:

         

      Bom vou ficando por aqui e espero que tenham gostado dessa pequena introdução com Struts. Foi na verdade mais uma motivação para quem colocou o framework na lista de estudos. Abraco a todos e até o próximo post.

       

      Criando Projeto Struts no Eclipse usando Jboss tools

       

      Olá Pessoal,

       

      Nesse post veremos como criar um projeto Struts no Eclipse, veja como é bem simples ter um Struts Project usando o Jboss Tools. Se não tem o Jboss tools configurado no eclipse veja o “post relacionado”. O objetivo deste post é para quem está querendo dar os primeiros passos com Struts, porem nao sabe por onde começar.

       

      Lets go…

       

      Não irei abordar alguns conceitos tais como: vantagens, quando usar?, por que usar?. Na verdade isso daria um novo post. Para quem tiver interesse em saber mais sobre Struts podem dar uma olhada no link a seguir e também nas vagas de emprego para Java, tenho 99% de certeza de 10 vagas para programador JEE minimo 8 vão pedir do candidato Struts como requisito.

       

      O que é Struts?

       

      Post Relacionado

       

       

      1. Uma vez com o JBoss configurado, clique em File ==> Project

      2. Localize o diretório Jboss Tools Web

      3. E agora dentro do diretório Struts escolha Struts Project

        <struts1>

      4. Clique em next

      5. Dê um nome ao seu projeto e clique em next

        <struts2>

      6. Agora escolha o servidor. Nesse caso vamos usar usar TomCat 6

        <struts3>

      7. clique em Next

        <struts4>

      8. Clique em finish

      9. A estrutura criada deve ser a semelhante a imagem a seguir.

        <struts5>

      10. Agora vamos criar uma classe Java com Struts que vai imprimir apenas uma mensagem no browser confirmando a execução do Struts. Portanto crie um package br.com.camilo.struts

      11. Agora crie uma nova classe no package criado no passo anterior, com o nome de TesteStruts tendo como SuperClass a classe Action do Struts. Veja como deve ficar:

        <struts6>

      12. Agora atualize sua classe com o código abaixo

        package br.com.camilo.struts;

        import javax.servlet.http.HttpServletRequest;
        import javax.servlet.http.HttpServletResponse;

        import org.apache.struts.action.Action;
        import org.apache.struts.action.ActionForm;
        import org.apache.struts.action.ActionForward;
        import org.apache.struts.action.ActionMapping;

        public class TesteStruts extends Action {

        public ActionForward execute(ActionMapping mapping, ActionForm form,
        HttpServletRequest request, HttpServletResponse response) throws Exception{
        /* esse metodo retorna uma mensagem para o struts-config.xml
        * ao chegar no arquivo struts-config.xml e encontrar o nome done
        * a pagina eh encaminhada para um arquivo .jsp
        */

        return mapping.findForward(“done”);
        }
        }

       

      Mas por que fazer o forward via arquivo .xml do Struts se posso fazer direto do arquivo .java colocando o xx.jsp ??

      A resposta é bem simples se o nome do arquivo mudar, e vc tem 10 classes que faz esse forward para aquele arquivo o que fazer? Atualizar manualmente arquivo por arquivo e se vc esquecer de 1 ou 2 ou mais. Se for 100 arquivos ? Então percebeu o problema? Com o .xml vc somente vai precisar alterar em um local o novo nome do arquivo. Claro que vc pode cair na mesma situação se inventar de alterar o nome de retorno para aquele tipo de redirecionamento, mas ai é outra situação.

       

      1. crie agora um arquivo .jsp chamado de teste.jsp (clique com o botão direito no projeto ==> New File ==> JSP )

      2. Dentro da tag <body> digite a mensagem que deseja visualizar para testar a funcionalidade do Struts.

         

        Executando minha pagina com Struts
      3. Agora abra o arquivo struts-config.xml no modo Source.(veja no rodapé do eclipse esta opção)

        Precisamos configurar agora o nosso arquivo .xml do Struts para fazer o redirecionamento é bem simples. Deixe conforme abaixo:

        <code>

       

      Erro comum a ser cometido é o esquecimento de colocar / no path e o nome class em type.

       

      1. Para testar nossa aplicação vamos digitar http://localhost:8080/app/testando.do

      2. Esse .do vem la da configurado do arquivo web.xml, abra o arquivo e veja pq nesse caso devemos ter o .do. Não existe nenhum arquivo físico com esta extensão é apenas um nome lógico utilizado e uma recomendação.

      3. Antes de testar aplicação precisamos reiniciar o TomCat então clique no botão do meio.

        <struts7>

        Se não encontra-lo, veja em que perspectiva vc está usando. Deveria ser Java EE

      4. Agora abra o webbrowser dentro do próprio eclipse

        <struts8>

      5. E digite o endereço abaixo, caso seguiu o mesmo nome usado nesse post

        http://localhost:8080/BlogStruts/testando.do

      6. O resultado deve ser o seguinte:

        <struts9>

         

      Bom vou ficando por aqui e espero que tenham gostado dessa pequena introdução com Struts. Foi na verdade mais uma motivação para quem colocou o framework na lista de estudos. Abraco a todos e até o próximo post.

    Undeploy e Deploy Tomcat Eclipse

    Olá Pessoal,

    Neste post veremos um video cedido pelo autor Edson Gonçalves mostrando como fazer um undeploy/deploy no TomCat dentro da IDE Eclipse, vejam é que bem simples e fácil. Confiram abaixo o video.

    Se nao conseguir visualizar o video clique aqui.

    Simples não?! abracos e até o próximo post!

    Problema Tomcat 8080 no Eclipse – Solução

    Ae! Pessoal, hoje o post é mais uma dica de como resolver um pequeno impasse que dar as vezes quando estamos usando o TomCat Server dentro do Eclipse.

    Lets go…

    Quem usa com bastante frequência TomCat dentro do Eclipse é comum receber o erro abaixo, e ter que reiniciar a maquina para tudo voltar o normal.

    Se vc for tentar matar o processo, não vai encontrar nada relacionado ao tomcat. E vc tenta parar o server clicando no botão “stop” no Eclipse e acha que tudo deu certo, porém ao tentar executar um nova aplicação  vc é informado que o servidor está executando na porta 8080, sendo que vc está certo que não há nada rodando nessa porta, pois você já deu um Stop no TomCat. Então o que fazer?

    1. A pior solução eh reiniciar o computador.

    2. E a melhor é matar um processo com o nome de javaw.exe. Conforme a imagem abaixo: (poderiamos achar que seria algo como “tomcat”, mas não é).

    Quero chamar atenção que há outros processos com o nome java, mas o que roda o tomcat é um tal de javaw que não consome quase nada de memoria a media é 20-45 K. “Mate” este processo e teste novamente sua aplicação no Eclipse. Concerteza, a felicidade vai estar estampada em seu rosto de ver aplicação rodando sem precisar reiniciar o computador.

    Resumindo o nome do processo não tinha nada ver com o que poderiamos esperar. Na primeira vez que fui tentar fazer isso, esperava encontrar um processo com um nome “tomcat” ou algo próximo, mas nunca passou pela minha cabeça que seria  um “javaw”. Independente do nome, nao precisamos mais reiniciar o computador quando quando estivermos em uma situação como descrita acima.

    Valeu pessoal, espero que a dica possa ajudar quem está passando por isso. Abraços e até o próximo post.