Projeto JEE com jetty + maven

Olá Pessoal,

O post de hoje saiu após muito sofrimento de tentar criar um maven Project rodando com Jetty, mas que eu não precisasse ter o jetty na máquina local e que desse suporte JSF. Parece algo simples e fácil, concorda? Mas me deu uma dor de cabeça e consumiu praticamente 2 dias de tentativas. Vamos entender o motivo.

Lets go …

Contexto

Bem, eu precisava criar um projeto para ter tudo gerenciado pelo maven. Primeiro eu decidi sair do TomCat e ir para o Jetty, pois a performance do tomcat e outros problemas que estava tendo com o servidor estavam sendo criticos, mas eu não queria ter o jetty na máquina local para poder rodar minha app, queria fazer isso de maneira simples pelo maven, daí veio as alternativas:

  • Criar um projeto webapps usando o archetype do maven;
  • Criar um dynamic web Project e adicionar o maven ;
  • Criar um projeto maven usando archetype JSF disponíveis;
  • Criar um projeto JSF e depois adicionar maven + jetty
  • Plugin jetty Eclipse via Eclipse Market

Nenhuma dessas alternativas funcionou como eu queria. Muitos dos archetype disponíveis lá no maven estão “bugados” e simplesmente não iniciam aplicação. A opção 2 só funcionava sem JSF, ao adicionar “JSF capacibilities” pelo eclipse simplesmente exigia ter o jetty local para apontar. O mesmo para a opção 4. A opção 3 simplesmente nenhum dos archtype que tentei subia app. Tentei até arrumar, mas era muita mão e tempo que seria gasto. A opção 5 ainda está a desejar, os plugins que testei disponíveis no eclipse market simplesmente estavam cheio de bugs, fora quando não travava a IDE.

E a solução?

Mais simples do que imaginei. Apenas criei um simple maven Project.

 

 

Clique em next

 

Clique em finish. E terá um projeto com a estrutura a seguir:

 

Vamos criar nosso web.xml, WEB-INF e lib.

 

 

Para os arquivos web.xml e face-config.xml, é simples.  Apenas crie um JSF Project e copie o web.xml e face-config.xml gerado. Não recomendo querer criar os arquivos na mão, pois você pode ter erros por digitar algo errado e acabar perdendo tempo fixar algo que não agrega muito valor.

Adicione as libs que você precisa:

 

 

Novamente copiei do projeto jsf. E adicionei as do JSF 2.0 : jsf-api-2.0.9.jar e jsf-impl.jar

Agora vamos  configurar o arquivo  pom do maven:

Feito isso crie um arquivo index.jsp em webapp e dentro de body coloque o que achar necessário para testar.

 

 

Observe que criei um arquivo xhtml para poder testar o JSF 2.0.  Nele  apenas uso uma tag <h:outputLabel value=”Lopes Neto” /> assim verifico se realmente o projeto está dando suporte ao JSF.

Rodando aplicação

Para rodar aplicação é bem simples, clique com o botão direito no projeto e siga os passos a seguir:

 

Clique em maven build e vamos adicionar um build para iniciar o maven

<img mavenrunconfigjettyrun>

Apenas selecione o projeto em base directory e em goals coloque jetty:run que é para iniciar o servidor.

E agora basta acessar e ver sua aplicação rodando sem o jetty local, apenas através do maven:

Enfim, foi a forma que consegui fazer o maven rodar para projetos JEE com JSF sem ter o jetty local na máquina. Não posso dizer que fiquei satisfeito com essa solução, mas foi a que me deu menos dor de cabeça.

Vou ficando por aqui. See ya!!

Abraços!

ThroubleShooting: Resolvendo .OutputLabelRenderer.encodeEnd PrimeFaces

Olá Pessoal,

O throubleshooting de hoje, é algo muito bobo,mas chato que acontece ao usarmos o <p:outputLabel />do Primefaces. Se vc faz isso:

<p:outputLabel value=”Tipo da Conta” />

Simplesmente verá algo assim:

The error is the following:

java.lang.NullPointerException     at org.primefaces.component.outputlabel.OutputLabelRenderer.encodeEnd(OutputLabelRenderer.java:38)

Mas, por que isso acontece?

Simplesmente, pq esse componente requer  que o atributo for esteja associado a um id no input. E dai para resolver basta fazer isso:

<p:outputLabel for=”accountType” value=”Tipo da Conta” />

<h:inputText id=”accountType” value=”#{accountBean.account.type}”/>

Ou seja, nós temos um for para o id.

Simples assim. Não? Mas, muito chato de resolver. :).

abracos vou ficando por aqui.

See ya!!

ThroubleShooting:Adicionando AutoComplete XHTML PrimeFaces projeto Maven

Olá Pessoal,

No post de hoe veremos um troubleshooting  quando criamos um projeto Maven e precisamos do auto-complete  nos XHTML.

Lets go…

Starting…

Ao criar um projeto maven para uma aplicação web, por default ele não fornece o autocomplete para arquivo xhtml, e evidente que para componentes externos como PrimeFaces também não terá por default .

E como resolver?

A solução não é das melhores, mas é o que tem que ser feito, vamos ver os passos:

1. Se vc usar tomcat/jetty baixe a versão  no caso do exemplo estou usando Jetty 8.x

2. Garante que você tem o .jar do primefaces adicionar ao pom do projeto

3. clique com o botão direito no projeto >> configure >> add...

 

Na tela que abrir clique em next, observe o arquivo web.xml vai sofrer alteração, pois vamos adicionar suporte ao JSF.

Depois clique em Finish.

Se você não tem um servidor de aplicação configurado no seu eclipse, vá em Windows >> preferences >> Server >> Runtime Environment e adicione.

** Você deve apontar para a pasta onde tá o servidor instalado, no caso do jetty ele não é instalado, após descompactar o arquivo .zip, apenas aponta para a raiz da pasta descompactada. Assim o Eclipse encontrará o .jar que ele precisa.

Vou ficando por aqui, espero que tenham curtindo o post.

Abraços,  see ya!!

Throubleshooting:Hibernate Maven Javassist

Olá Pessoal,

Mais um post throubleshoot e novamente entre o hibernate e o maven.

Lets go...

O Problema

Ao adicionar o hibernate no pom.xml, se reparar não vem o javassist. Pelo menos até a versão 3.6 ele não veio no pom.xml. Daí, ao rodar a aplicação veremos algumas exceções do HibernateException.

Solução

Basta adicionarmos no pom.xml o javassist conforme abaixo e pronto.

<groupId>javassist</groupId>

                               <artifactId>javassist</artifactId>

                               <version>3.12.1.GA</version>

Em seguida, rode mvn clean e mvn eclipse:eclipse (caso vc use o eclipse)

Pronto, era isso apenas.

Abracos,  see ya!

Validando campos com JSF

 

olá Pessoal, hoje o post é dedicado para quem está aprendendo JSF e pretende usar os recursos de validação de campo do proprio  framework. Perguntas comuns sobre validação: como validar um email? Como validar um campo número? É isso que veremos, claro que mostrarei um pequeno exemplo “motivador”, vai de você criar outras validações para seu formulário. Observe que é algo bem simples e funcional. E para aqueles que  estão estudando para antiga SCJP e acham que regex é algo somente para certificação, Vejam nesse post o poder que regex tem. No post tem um link para “testador de expressões regex online”. Muito show, já tem até alguns exemplos prontos tais como: validação de IP, telefone etc.

lets go…

Preparando o ambiente

Certifique-se que você tem os arquivos .jars necessário para rodar JSF. Confira nos posts a seguir quais os arquivos que vc precisa. Sem falar que usar Jboss tools seria uma boa ideia. Para o nosso exemplo usaremos o plugin no Eclipse Jboss tools para suporte à JSF. Também não pode esquecer que nosso application server  será  o Tomcat, se ainda não instalou/configurou veja no exemplo abaixo.

Desenvolvimento

    1. Com o Jboss tools configurado e Eclipse aberto crie um novo JSF Project.

    2. Em WebContent crie uma página .jsp que redirecione para uma página chamada formulario.jsp. Mas, lembre-se que no seu arquivo index.jsp o code fica assim:

    3. Feito isso, vamos agora codificar nosso formulário em JSF. Para isso crie uma página em jsp com suporte JSF em WebContent chamando de formulario.jsp. Veja abaixo como criar uma página caso tenha esquecido:

    4. Abaixo temos nossa página em JSF. O uso de immediate=true em cada campo é para quando aparecer a mensagem de validação a pagina atual não seja processada, ou seja, ela não vai para a página seguinte enquanto você não atender os requisitos da validação.

    5. Agora crie uma página em .jsp que exiba uma mensagem qualquer. Pois, ela somente será exibida quando as validações da pagina do formulário forem válidas. Nos colocamos nessa página uma mensagem: Mensagem enviada com sucesso!

    6. Feito isso, precisamos criar nosso bean e controller. Então crie um package chamado br.com.bean e nele crie uma classe Java chamada de Usuario.java e deixe conforme abaixo:

  1. Agora crie um package br.com.controller e nele crie uma classe chamada Controller. É essa classe que será responsável por controlar nossa aplicação. Ela que diz aonde o usuário vai parar depois de uma determinada ação. Deixe conforme abaixo:

  2. Vá no arquivo face-config.xml e crie um ManageBean para a classe Controller conforme a imagem abaixo:

  3. Agora vamos adicionar as rules para navegação com as pages. Clique em Navigation Rules e a direita add. Veja abaixo como ficou:

  4. Precisamos apenas configurar o Navigation Cases. Veja:

  5. Uma explicação básica: “Quando vinher a uma mensagem chamada ‘sucesso’ da página formulario.jsp, favor de ir para a pagina mensagem.jsp”.

  6. Agora precisamos criar uma classe que vai validar os campos do nosso formulário, que nesse caso será apenas e-mail e idade. Para isso precisamos implementar uma interface JSF que vai nos auxiliar no processo. É a interface Validator. Para isso crie um package br.com.validator e uma classe EmailValidar e informe que essa classe implementa a interface Validator. Veja meu exemplo abaixo:

  7. Agora deixe sua classe conforme abaixo. E para não perder o costume, explicação está nos comentários.

  8. Agora vamos validar o campo idade, onde é permitido apenas digito. Crie a classe IdadeValidar.java e implemente o método Validator.

  9. Feito isso precisamos apenas informar para o nosso face-config.xml que usaremos nosso validador nesta aplicação. Veja como fazer isso:

  10. Faça o mesmo para o validator idade.

  11. Damos um nome ao validador e informamos a classe que tem a validação, o nome é requirido pois é ele que vamos usar no form.

  12. Agora vá na sua página que contém o formulário e deixe os campos email e idade conforme o código abaixo.

Testando Aplicação

  1. Salve as alterações. Se o tomcat estiver rodando, dar um stop e em seguida um start. E veja aplicação rodando. No nosso caso vamos rodar dentro do próprio Eclipse. Para isso a perspectiva que estamos usando é JavaEE depois clique com o botão direito em cima do projeto e vá em Run >> Run as >> Run on Server.

Vou ficando por aqui e espero que tenham gostado do post. Simples e básico.

See you next post! 😀