quinta-feira, 26 de setembro de 2013

JSF: Como ter um selectBooleanCheckbox selecionado

No Java Server Faces, o componente "selectBooleanCheckbox" serve para o request de parâmetros do tipo boolean, isto é "true" ou "false".
Quando vinculamos seu valor a algum atributo de uma variável objeto do managed bean, geralmente faz-se desta maneira:
<h:selectBooleanCheckbox id="illustrations"
    value="#{bookManagedBean.book.illustrations}" />
Desta forma, o componente não é renderizado "checado" pois vinculamos seu value ao valor de "illustrations". Para contornar este problema, simplesmente atribua o valor "true" ao atributo da variável no construtor do managed bean, como demonstra o código:

@ManagedBean
@RequestScoped
public class BookManagedBean {

  private Book book = new Book();

  public BookManagedBean() {
    book.setIllustrations(true);
  }
}
Deste modo, ao renderizar o componente pela primeira vez, o valor de selectBooleanCheckBox virá como "checked". Veja na imagem:

Esta é só uma dica para JSF.
abçs

terça-feira, 24 de setembro de 2013

Tutorial de Eclipse, GlassFish e Java EE 6



Gostaria de divulgar um tutorial que achei na internet, com o desenvolvimento passo-a-passo de uma aplicação com Eclipse, Glassfish para Java EE

An Eclipse / GlassFish / Java EE 6 Tutorial


Achei o tutorial muito bem explicado, mas acho interessante complementar com um bom livro. Estou lendo o "Beginning Java EE 6 with GlassFish" da editora Apress

 O livro também traz de forma simples os conceitos por trás do Java EE, como JPA, EJB, JSF. Aliado a bons exemplos integrados ao Maven. O único problema é que é  necessário atualizar as dependências no pom.xml no source dos exemplos. Tirando este empecilho o livro é realmente muito didático. O dois utilizam o banco de dados JavaDB, que é uma distribuição da Oracle do Apache Derby.

Juntando o tutorial mais o livro, acho que pode-se ter uma boa visão da intergração das diversas específicações que compõe o Java EE, e  como utilizar o Eclipse para agilizar o desenvolvimento. Pelo menos esta é minha opinião.

Obrigado.

quarta-feira, 11 de setembro de 2013

Projetos Spring integrados ao Maven


Estava estudando o SpringMVC e Apache Maven, quando me deparei com alguns problemas. Em diversos tutoriais pela internet e em até um ebook que estava lendo, a criação dos projetos eram feitos com o plugin "maven-archetype-webapp". Este plugin gera péssimos resultados tanto na configuração quanto na arquitetura de diretorios do projeto.

Os projetos gerados utilizam o Dynamic Web Module de versão 2.3 do Eclipse, uma versão realmente muito antiga. Tentar configurar manualmente pelo Properties do projeto era impossível. Modificar o arquivo web.xml gerava erros e diversos “warnings”.

Para solucionar estes problemas pode-se usar o Spring Tool Suite. O Spring Tool Suite pode ser baixado como uma IDE completa na página Spring Source ou ser utilizado como plugin no Eclipse. Para adicionar o plugin ao Eclipse basta fazer uma busca no Marketplace.

O Spring Tool Suite ou STS é muito completo e prático, tanto para geração de projetos como na integração com o Maven. Aqui vai um pequeno tutorial para criar um projeto Spring MVC.

Vá em File, New e Other ou aperte Control + n. Escolha Spring Project e aperte em Next.

Escreva um nome para seu projeto, escolha a opção Spring MVC Project e tecle em Next. 
 
Escolha um nome para os pacotes e aperte em Finish. 

 
Aguarde até o projeto ser construído, o que pode levar tempo. Quando seu projeto estiver pronto, vá em Properties ou aperte Alt + Enter. Na opção Project Facets modifique a versão do Java para a 1.7 (Java 7) e em Dynamic Web Module, configure para a versão 3.0.

Agora, vá em Java Build Path e aperte em “Add Libray...”. Selecione Server Runtime, aperte Next e escolha um servidor. No meu caso é o Apache Tomcat 7. Desta forma podemos registrar servlets do projeto através de Annotations, caso necessite.


 
No arquivo web.xml altere a tag web-app de abertura para

<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xmlns="http://java.sun.com/xml/ns/javaee"

xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"

id="WebApp_ID" version="3.0">


Assim mudamos para a versão para 3.0.

Resumindo, quando criar um projeto Spring integrado ao Maven, utilize o Spring Tools Suite. Assim você terá versões mais avançadas do módulo web do Eclipse e poderá usar Annotations para registrar servlets.

Esse artigo surgiu da insatisfação com os tutoriais que encontram-se na internet e para que outras pessoas não passem dias tentendo comfigurar seus projetos.

segunda-feira, 9 de setembro de 2013

Testando Parâmetros e Estados de Objetos com Guava

Quando criamos classes em Java, um dos pontos mais importantes é proteger o estado dos objetos que serão ou estão instanciados. Uma das maneiras de se atingir este objetivo é colocar infindáveis estruturas “if/throw” para testar os parâmetros de construtores e métodos, dificultando a legibilidade de nosso código. Como no construtor abaixo:    
public Livro(String titulo, int paginas) throws IllegalArgumentException {
   if (titulo == null)

    throw new IllegalArgumentException("titulo não pode ser nulo");

   if (titulo.length() < 0)

    throw new IllegalArgumentException("O tamanho de titulo deve ser maior que zero");

   if (paginas < 0)

    throw new IllegalArgumentException("paginas deve ser maior que zero");
  this.titulo = titulo;

  this.paginas = paginas;

}

Estas estruturas ficam espalhadas por todo nosso código. Podemos até criar métodos específicos que façam estes testes, mas então o tamanho das classes aumentam cada vez mais.


Para facilitar nosso trabalho e manter o código limpo, podemos utilizar a biblioteca Guava. Para quem não conhece, Guava é um biblioteca que fornece várias classes utilitárias e é desenvolvida pelo Google. Guava segue vários conceitos do livro “Effective Java” de Joshua Bloch, que aliás trabalhou na arquitetura do projeto. Além disso, o Google utiliza a biblioteca em seus próprios projetos Java, que com certeza traz confiança na qualidade da mesma.

Na biblioteca encontramos a classe Preconditions, que pode facilitar os testes de argumentos e estados de objetos, tornando nosso código mais limpo e bonito. A classe Preconditions possui seis métodos, sendo que todos são estáticos. Desta forma pode-se usar “import static” para facilitar o trabalho. Os métodos e as exceções que estes lançam são:

Método
Exceção Lançada
checkArgument(boolean)
IllegalArgumentException
checkNotNull(T)
NullPointerException
checkState(boolean)
IllegalStateException
checkElementIndex(int index, int size)
IndexOutOfBoundsException
checkPositionIndex(int index, int size)
IndexOutOfBoundsException
checkPositionIndexes(int start, int end, int size)
IndexOutOfBoundsException

Um método muito interessante é o checkArgument(), que testa uma expressão booleana e lança IllegalArgumentException caso esta for falsa.
 
checkArgument(paginas > 0,"O valor de paginas(%s) deve ser maior que zero", paginas);
 
Neste caso foi utilizado o método sobrecarregado que aceita como parâmetro uma String formatável para mostrar uma mensagem.
Outro exemplo é o checkNull, que verifica se o argumento passado é nulo. Podemos atribuir o valor do parâmetro ao campo diretamente, pois o retorno do método é o próprio valor que foi testado:
 
this.titulo = checkNotNull(titulo, titulo não pode ser nulo);

Caso o parâmetro for nulo, NullPointerException será lançada e a mensagem será exibida.

O método checkState avalia se o estado do objeto é correto ao se chamar um determinado método. Você pode imaginar uma classe Builder, com vários métodos “set” para os campos que serão utilizados para construção de um objeto. Ao charmar o método build(), alguns campos não podem ter determinado valor ou null. Exemplo simplificado:

import static com.google.common.base.Preconditions.*;

public class ExemploBuilder {

  private int tamanho;

  private String nome;

  public ExemploBuilder setTamanho(int tamanho) {

   this.tamanho = tamanho;

   return this;

  }

  public ExemploBuilder setNome(String nome) {

   this.nome = nome;

   return this;

  }

  public Exemplo build() throws IllegalStateException {

   checkState(tamanho > 0,

   "deve-se fornecer tamanho com valor maior que zero");

   checkState(nome != null, "nome não pode ser nulo");

   return new Exemplo(this.tamanho, this.nome);

  }

  class Exemplo {

    private int tamanho;

    private String nome;

     public Exemplo(int tamanho, String nome)   {

      this.tamanho = tamanho;

      this.nome = nome;

    }

  }


  public static void main(String[] args) {
   //lançará uma exceção.

   new ExemploBuilder().setTamanho(5).build();  

  }

} 
O checkState não avalia os parâmetros do método em si, mas se o estado do objeto é seguro ao se chamar o método. Outro exemple, seria um objeto resultSet, que é retornado após uma consulta em um banco de dados. Os métodos “get” só podem ser chamados após o método next() ser invocado.

O método checkElementIndex verifica se o valor de um índice é válido para um array, string ou outra lista qualquer. Como parâmetro, ele requer o valor do índice e o tamanho da lista. Veja o exemplo: 
int[] a = {5,8,9,4,6};
checkElementIndex(4, a.length);

Este foi um artigo demonstrando alguns métodos da classe Preconditions do Guava. O Guava possui muitas outras utilidades interressantes que podem ser consultadas na página do projeto ou também no Wiki.

Este artigo de Markus Sprunk fala de Preditons e outros métodos de verificação de argumentos em Java, fazendo uma comparação interessante.

Até mais.

quarta-feira, 4 de setembro de 2013

Tutorial EC2 com Tomcat7 e MySQL Server



Tutorial Tomcat7 e MySQL Server

Continuando com os tutoriais, já temos o Java instalado em nossa instância EC2. Faltam o Tomcat, o MySQL e configurarmos o MySQL Workbeanch da nossa máquina local.

Para instalarmos o Tomcat7 e alguns pacotes extras, basta digitarmos no console:

$ sudo apt-get install tomcat7 tomcat7-admin tomcat7-common tomcat7-docs tomcat7-examples tomcat7-user

 
Nestes pacotes encontram-se a documentação, exemplos e programas para administrar o servidor. Agora é necessário configurar o arquivo de usuários do Tomcat. No terminal entre com o comando:

$ sudo nano /etc/tomcat7/tomcat-users.xml 
 
No final do arquivo, antes da tag de fechamento “</tomcat-user>”, insira a tag de definição de user, colocando seu username, password e manager-gui na propriedade roles:

<user username="usuario" password="senha" 
roles="manager-gui"/>



O manager-gui dará acesso às páginas de gerenciamento do servidor por uma interface gráfica web. Salve o arquivo com Ctrl + x e depois “y”. Para iniciar o servidor, basta digitar:

 
$ sudo service tomcat7 start

 
Para ver se tudo deu certo, vá até o EC2 Dashboard, clique com o botão esquerdo sobre a instância EC2 e depois em Connect. Copie o ip conforme a imagem. Este é o ip público de sua instâcia que será usado para acessar o Manager-Gui do Tomcat7 e fazer a conexão com o MySQL Workbeanch.


 
Cole na barra de endereços do navegador e no final adicione “:8080”, que corresponde a porta padrão do servidor Tomcat7. Acessando você verá a página: 

 
Clique em “manager webapp”, coloque o usuário e senha cadastrados. Nesta página será feita a administração do servidor e deploy das aplicações web.



 Agora vamos instalar o banco de dados MySQL Server e configurar o  MySQL Workbeanch. No terminal digite:

$ sudo apt-get install mysql-server

e escolha a senha do banco de dados. Instale o MySQL Workbeanch na sua máquina local e abra o programa. Aperte em "New Connection" e, em Connection Method, Standard TCP/IP over SSH.


No SSH Hostname, coloque o ip público da sua instância mais ":22", correspondente a porta do SSH. Em SSH Username coloque "ubuntu" e em SSH Key file selecione o arquivo .pem gerado na criação da instância. Tanto o campo Username quanto Password se referem ao MySQL. Configure conforme seu servidor.

Clique em "Test Connection" para ver se está tudo certo. Se tudo estiver configurado corretamente você pode gerenciar o MySQL de sua instância EC2 através de uma interface gráfica em sua máquina local.

Agora que terminamos este tutoral, estarei elaborando outros referentes a plataforma Java. Qualquer dúvida é só postar.

Até...