properties em java

Upload: antonio-pasqualli

Post on 09-Jul-2015

716 views

Category:

Documents


0 download

TRANSCRIPT

Properties em Java Podemos utilizar properties em vrias situaes, ajudando-nos a poupar tempo sempre que precisamos alterar dados como usurio e senha de uma conexo com o banco de dados, por exemplo. Assim, basta modificarmos os valores e reiniciar a aplicao. Dispensamos assim a obrigao de recompilar nosso projeto. Como exemplo, desenvolvi uma aplicao recentemente no trabalho que busca o endereo de diretrios em um servidor (atualmente com o S.O. Windows) para processamento de arquivos. O detalhe que fui informado pela equipe de redes que o servidor poderia mudar, tal como o seu S.O. Sendo assim, criei um arquivo de propriedades com tais endereos e sempre que algum endereo for alterado, os prprios integrantes da equipe de redes podero alterar este arquivo e reiniciar a aplicao, dispensando a presena de um programador para atualizar o projeto. Vamos ver como simples usar properties. Vamos criar um pequeno projeto para imprimir no console meus dados pessoais, que sero carregados do arquivo de propriedades. Vamos comear. Lembrando que utilizamos aqui o Netbeans, crie uma nova Aplicao Java, lembrando de marcar a opo de Criar Classe Principal. D o nome que achar mais interessante ao seu projeto.

Crie um novo diretrio (chamado utils) com a classe LoadProperties e o arquivo de propriedades mensagens.properties, no mesmo diretrio, de modo que fique assim:

Vamos editar nosso arquivo de propriedades com os valores desejados. Ficar assim:# To change this template, choose Tools | Templates # and open the template in the editor. nome=Collins Daniel nacionalidade=Brasileiro [email protected] skype=cdpm.sistemas

Os campos da esquerda so as chaves e os da direita so os valores de cada. Lembrando que os dois devem ser separados por =. A classe LoadProperties ser responsvel por carregar o arquivo de propriedades. A mesma dever ficar assim:package utils; import java.io.IOException; import java.io.InputStream; import java.util.Properties; import java.util.logging.Level; import java.util.logging.Logger; public class LoadProperties { // Classe java.util.Properties responsvel por armazenar valores // (chave e valor) ambos do tipo String. private static Properties defaultProps = null; // Local do arquivo mensagens.properties String localProperties = "utils/mensagens.properties"; /** * Construtor da Classe LoadProperties

*/ public LoadProperties() { try { defaultProps = new Properties(); // Aqui utilizamos um ClassLoader para carregar nosso arquivo // de propriedades. InputStream stream = ClassLoader.getSystemClassLoader().getResourceAsStream(localProperties); // L os dados do arquivo de propriedade defaultProps.load(stream); } catch (IOException ex) { Logger.getLogger(LoadProperties.class.getName()).log(Level.SEVERE, null, ex); } } /** * Recupera o valor da propriedade informada. * @param Propriedade Caminho informado para recuperar seu Endereo. * @return Endereo do caminho. */ public String getPropriedade(String Propriedade) { return defaultProps.getProperty(Propriedade); } }

Nesta classe ns estamos carregando o arquivo mensagens.properties atravs de um ClassLoader (pode ver mais sobre o mesmo aqui) e logo aps o objeto defaultProps (da Classe Properties) l os dados deste arquivo. No final da classe, temos o mtodo getPropriedade que recebe a chave da propriedade e retorna o seu valor. Veremos sua utilizao abaixo. Agora, a nossa classe Main usando as propriedades. Fica assim:package exemploproperties; import utils.LoadProperties; public class Main { /** * @param args the command line arguments */ public static void main(String[] args) { // Instancia a Classe LoadProperties.

LoadProperties loadProperties = new LoadProperties(); // Pega os valores de cada propriedade informando as respectivas chaves. String nome = loadProperties.getPropriedade("nome"); String nacionalidade = loadProperties.getPropriedade("nacionalidade"); String email = loadProperties.getPropriedade("email"); String skype = loadProperties.getPropriedade("skype"); // Imprime os dados carregados System.out.println("Nome: " + nome); System.out.println("Nacionalidade: " + nacionalidade); System.out.println("email: " + email); System.out.println("Skype: " + skype); } }

E essa a sada da execuo:

Bom, isso. Bem simples. At a prxima.

Componentes Customizados no JSF Digamos que voc precisa reusar certas interfaces em diversas partes de sua aplicao JSF. Imagine que a funcionalidade no est unificada em um s componente e voc precisa agrupar dois ou mais componentes para realizar a sua tarefa. Sempre que precisar da mesma, ter que recorrer ao velho ctrl+c ctrl+v para copiar o trecho da pgina necessria at o seu novo destino. Em certos casos, uma terrvel dor de cabea. Bom, isso pode ser feito com mais eficincia e elegncia. Fazemos isso criando nosso prprio componente JSF. Mas antes de adentrarmos neste assunto, lembre-se do seguinte:

verifique se j no existe um componente que satisfaa suas necessidades. No reinvente a roda. Veja esse site. Nele tem uma lista com vrios componentes. Verifique se os componentes utilizados podem ser personalizados atravs de seus validadores e conversores. Isso pode resolver seus problemas.

Vamos l ento. No JSF existem duas formas de criar componentes customizados, atravs de composite components ou non-composite components. Vejamos as diferenas entre estas tcnicas: - Composite Components: Esta tcnica foi disponibilizada a partir do JSF 2 e dispensa o uso de classes para criar um componente customizado. Nela os componentes so definidos em pginas XHTML que utilizam a biblioteca composite para customizao. Essa biblioteca contm diversas tags que definem interface, atributos da interface, implementaes, entre outros. Alm disso, possvel o tratamento de eventos e listeners atravs de composite components; - Non-composite Components: Esta tcnica j estava disponvel antes da verso 2 do JSF e se diferencia pela necessidade de utilizar classes Java para a criao dos componentes. Este tipo de desenvolvimento pode gerar customizaes da mesma forma que composite components. Entretanto, com ela necessrio que o designer saiba programar em Java. Importante: O caminho padro para as bibliotecas de componentes customizados engloba http://java.sun.com/jsf/composite/NOME_DA_BIBLIOTECA. Uma biblioteca de composite components nada mais do que uma pasta que contm uma pgina XHTML para cada componente. O NOME_DA_BIBLIOTECA o mesmo nome da pasta. O sufixo jam utilizado para chamar os componentes da nossa biblioteca na pgina index.xhtml. Lembrando que interessante sempre utilizar sufixos pequenos para facilitar a chamada dos componentes. Sendo assim, utilizaremos neste exemplo:

Tcnica Composite Components; Ide Netbeans 6.9.1; glassfish 3.0.1; primefaces 2.2; brazilutils 0.1.1 (este utilizado para fazer validao de cpf).

obs.: Vi, depois da publicao deste post que na pgina do projeto brazilutils no consta mais os arquivos pra download. Sendo assim, sinta-se a vontade para utilizar outr mtodo de validao ou pra implementar outro mtodo ou se preferir entrem em contato comigo que envio na hora o .jar Vamos comear a prtica criando uma aplicao web, escolhendo o glassfish como servidor e o JSF 2.0 como framework. Esta aplicao servir apenas para fazer a validao de cpf e mostrar abaixo o nome do(a) dono(a) deste documento.

Abaixo o cdigo da pgina index.xhtml, o cdigo do managedBean responsvel pela validao e o resultado no browser. Lembrando que estou usando a skin humanity do primefaces.Cdigo do index.xhtml Exemplo de Customizao de Componentes

Cdigo do ManagedBeanimport br.com.collinsdaniel.componentesJSF.utils.Validacao; import javax.faces.application.FacesMessage; import javax.faces.bean.ManagedBean; import javax.faces.context.FacesContext;

@ManagedBean public class ValidaCPFMB { private String cpf; private String nome; private boolean sucesso;

public void validaCPF() { FacesContext context = FacesContext.getCurrentInstance();

if (cpf == null || getCpf().equals("")) { context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN, "Sem CPF", "CPF obrigatrio")); } else { if (Validacao.validarCpfCnpj(getCpf())) { context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "CPF Aceito", "CPF Validado com Sucesso")); setNome("Nome do Dono do CPF"); setSucesso(true); } else { context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "CPF No Aceito", "CPF Invlido"));

setNome(""); setSucesso(false); } } } // Getters e Setters }

Resultado no Browser

Bom, os cdigos acima so bem simples e por isso mesmo no farei comentrios sobre os mesmos. Vamos direto ao que nos interessa. Ao clicar neste boto, podemos observar que apenas feita a validao do cpf e posteriormente incluido um nome que informado manualmente no ManagedBean (para simplificar). Para podermos reutilizar esta pequena funo faamos o seguinte: Selecionaremos o trecho de cdigo desejado para transformar em componente (todo o cdigo dentro da tag body). Vamos clicar com o boto direito, e marcar a opo refatorar-converter a componente composto. Aparecer a seguinte tela:

Aqui voc define o nome do arquivo (que ser o nome do componente), a pasta onde ser salvo e o prefixo do componente. Finalize e veja o seguinte resultado:

Cdigo do Componente recm criado

Agora incluiremos os atributos necessrios para que possamos utiliz-los quando precisarmos deste componente. Veja como fica abaixo

Veja que os atributos definidos na seo Interface so utilizados na seo Implementation. Isso serve para flexibilizar o componente. Dessa forma, por exemplo, voc pode criar o seu prprio mtodo para validar um cpf e apenas indic-lo no componente. Pgina index.xhtml com o novo componente Exemplo de Customizao de Componentes

Com o componente criado, voc pode us-lo em qualquer lugar da sua aplicao sem se preocupar em refazer todo o cdigo novamente. Bom, isso. Quaisquer dvida, fiquem a vontade pra expor atravs de comentrios. Abraos!

Criando e usando arquivos de propriedades em JavaH momento que precisamos rodar algum .jar ou at mesmo um programa e precisamos mudar algum parmetro que o mesmo utiliza sem mexer no cdigo fonte, uma soluo simples para este problema utilizar arquivos de propriedades. Abaixo vamos ver uma maneira simples de criar uma arquivo de propriedades e fazer com o seu programa java leia o mesmo.

1 Crie o arquivo de propriedadeO arquivo de propriedade nada mais que um arquivo com exteno .properties. O mesmo deve ser salvo em algum pr-determinado em seu programa Java, para que o mesmo seja lido, nesse exemplo o meu arquivo de properties foi salvo dentro do projeto em uma pasta com o nome properties. Voc pode salvar o seu arquivo de propriedades em qualquer lugar do seu computador, porm no se esquea de colocar sua localizao correta no seu programa.

Contedo do arquivo de propriedades:

prop.nome = Mario prop.dir = /tmp

2 Crie um programa para ler o arquivo de propriedade

Contedo do programa: import java.io.FileInputStream; import java.io.IOException; import java.util.Properties; /** * * @author Robson Fernando Gomes * http://maguscode.blogspot.com * */ public class ArquivoDePropriedades {

public static Properties getProp() throws IOException { Properties props = new Properties(); FileInputStream file = new FileInputStream("./properties/dados.properties"); props.load(file); return props; } public static void main(String args[]) throws IOException { System.out.println("**********Teste usando arquivo de propriedades**********"); Properties prop = getProp(); System.out.println("Nome = "+prop.getProperty("prop.nome")); System.out.println("Diretorio = "+prop.getProperty("prop.dir")); } } O cdigo pode ser simplificado da seguinte maneira:

No primeiro mtodo da classe:

Properties props = new Properties(); - Instancia-se a classe Properties FileInputStream file = new FileInputStream("./properties/dados.properties"); - Mostra a localizao do arquivo .properties props.load(file); - Carrega o arquivo na variavel props. No segundo mtodo da classe:

Properties prop = getProp(); - Obtm o objeto Properties. System.out.println("Nome = "+prop.getProperty("prop.nome")); - Pega-se a propriedade do item prop.nome. System.out.println("Diretorio = "+prop.getProperty("prop.dir")); - Pega-se a propriedade do item prop.dir.

Resultado da execuo do programaSada:

Obs.: teste usando arquivo de propriedades. Nome = Mario Diretorio = /tmp Fonte:

http://maguscode.blogspot.com/