Como acessar arquivo .properties a partir de uma classe na aplicação WEB?  XML
Índice dos Fóruns » Desenvolvimento Web
Autor Mensagem
Luiz_Gustavo
Virtual Machine Man
[Avatar]

Membro desde: 30/04/2005 12:55:11
Mensagens: 518
Localização: Assis
Offline

Galera, pode ser uma coisa besta, mas tô com uma dúvida no seguinte:

Tenho uma classe Factory em minha aplicação responsável por obter conexões, e gostaria de usar um arquivo .properties para informar essa Factory a respeito da URL do banco, para não ser preciso recompilar a classe para mudar o endereço do banco.

eis o construtor:



obs: URL já está declarado globalmente

Acontece que estou recebendo uma Exception, indicando que o arquivo properties não foi encontrado.
Estou colocando o arquivo .properties junto da classe Factory, mas mesmo assim não está rolando.

Outra informação relevante: não estou usando Struts ou qualquer outro Framework... só JSP e Servlet mesmo; A classe acima citada não é um servlet.

Diante disso, qual o melhor lugar para se colocar o .properties e como referenciá-lo?

[]'s

Analista e Desenvolvedor de Sistemas
http://luizgustavoss.blogspot.com/
http://luizgustavoss.wordpress.com/
http://www.linkedin.com/in/luizgustavoss
Procurando uma especialização em Java, SOA e Android? Conheça a TNT Educacional

[Email] [WWW]
thingol
Moderador

Membro desde: 29/07/2004 16:10:13
Mensagens: 17543
Offline

Primeira coisa: não use FileInputStream . Como seu arquivo .properties é apenas de leitura, use algo como

InputStream in = getClass().getResourceAsStream ("/resources/database.properties")

e ponha esse arquivo em algum lugar do seu PATH (talvez em WEB-INF/classes/resources/database.properties)


(aham, não sei se é getClass().getResourceAsStream() ou getClass().getClassLoader().getResourceAsStream(). Tente as duas alternativas
[WWW]
paribe
JWizard
[Avatar]

Membro desde: 22/08/2004 07:34:33
Mensagens: 2057
Offline

não sei se isso que vc precisa lá vai :

A classe java.util.Properties guarda um conjunto de pares nome=valor, que
podem ser lidos ou gravados em um arquivo. Alem disso, a classe Properties
traz facilidades para voce acessar as propriedades e definir valores
padrao.

No exemplo abaixo, vamos carregar as propriedades padrao de um arquivo
("padrao.properties"), depois ler as propriedades salvas pelo usuario
("salvas.properties"), fazer algumas modificacoes, e depois salvar para uma
proxima execussao do programa:

import java.util.Properties;

. . .
// Cria e le os valores padrao
Properties defaultProps = new Properties();
FileInputStream in = new FileInputStream("padrao.properties");
defaultProps.load(in);
in.close();

// Cria objeto de configuracao, com os valores padrao
Properties applicationProps = new Properties(defaultProps);

// Carrega as propriedades configuradas na ultima execussao
in = new FileInputStream("salvas.properties");
applicationProps.load(in);
in.close();

. . .
// Utilizamos as propriedades quando precisarmos
String nome = applicationProps.getProperty("nome.usuario");
String servidor = applicationProps.getProperty("servidor.ip");

. . .
// Modificamos os valores das (ou criamos novas) propriedades
applicationProps.setProperty("nome.usuario", "Bruno JavaMan");
applicationProps.setProperty("nova.propriedade", "12345");

. . .
// Salvamos para uma proxima execussao
FileOutputStream out = new FileOutputStream("salvas.properties");
applicationProps.store(out, "---Aqui vai um comentario ---");
out.close();

. . .

O codigo acima utiliza duas propriedades cujos nomes sao "nome.usuario" e
"servidor.ip". Eh comum utilizamros como nomes de propriedades
nomes.separados.por.pontos ou entao NomesComIniciaisMaiusculas, seguindo os
padroes de nomenclatura de Java.

Eh tambem comum que o arquivo de propriedades tenha a extensao
".properties", e no exemplo acima, o arquivo salvas.properties teria ao
final um conteudo similar a:

#---Aqui vai um comentario ---
#Wed Jun 26 18:10:46 BRT 2002
nome.usuario=Bruno JavaMan
servidor.ip=10.0.0.1
nova.propriedade=12345

Observe que o metodo Properties.getProperty() sempre devolve uma String, e
no caso da propriedade "nova.propriedade", esse valor teria que ser
convertido para um tipo numerico no momento de leitura.

Atualmente o uso de XML como forma de armazenar arquivos de configuracao
vem ganahando popularidade, mas os arquivos de propriedades continuam ser
uma forma simples e eficaz de gerenciar configuracoes simples.
vanderlanio
Java Ninja
[Avatar]

Membro desde: 20/07/2006 11:22:20
Mensagens: 294
Localização: Brasilia
Offline

eu coloco no src e o referencio somente (file.properties), agora se vc colocar dentro dos pacotes se nao me engano tera que referenciar os pacotes ( meu.arquivo.file.properties ).


Vanderlanio L Aguiar
[MSN]
Luiz_Gustavo
Virtual Machine Man
[Avatar]

Membro desde: 30/04/2005 12:55:11
Mensagens: 518
Localização: Assis
Offline

[EDITADO]

Funcionando!!!

[/EDITADO]

Analista e Desenvolvedor de Sistemas
http://luizgustavoss.blogspot.com/
http://luizgustavoss.wordpress.com/
http://www.linkedin.com/in/luizgustavoss
Procurando uma especialização em Java, SOA e Android? Conheça a TNT Educacional

[Email] [WWW]
Luiz_Gustavo
Virtual Machine Man
[Avatar]

Membro desde: 30/04/2005 12:55:11
Mensagens: 518
Localização: Assis
Offline

Como forma de agradecimento, aí vai a classe para quem precisar:




Críticas e sugestões são bem vindas!


[]'s e mais uma vez obrigado a todos que ajudaram.

Analista e Desenvolvedor de Sistemas
http://luizgustavoss.blogspot.com/
http://luizgustavoss.wordpress.com/
http://www.linkedin.com/in/luizgustavoss
Procurando uma especialização em Java, SOA e Android? Conheça a TNT Educacional

[Email] [WWW]
Maracuja
GUJ Ranger
[Avatar]

Membro desde: 28/03/2006 10:18:44
Mensagens: 940
Localização: Behind the screen
Offline

Pq não usa Resource Bundle???

http://java.sun.com/j2se/1.4.2/docs/api/java/util/ResourceBundle.html

"Nunca deixarei de reclamar, mas espero reclamar de coisas melhores a cada dia..." Um amigo muito sabio
Luiz_Gustavo
Virtual Machine Man
[Avatar]

Membro desde: 30/04/2005 12:55:11
Mensagens: 518
Localização: Assis
Offline

Maracuja wrote:Pq não usa Resource Bundle???

http://java.sun.com/j2se/1.4.2/docs/api/java/util/ResourceBundle.html


Acredito que usando o arquivo .properties, neste caso, é mais simples.
Mas de qualquer maneira, muito obrigado pela dica... li a referência e achei muito interessante.

[]'s

Analista e Desenvolvedor de Sistemas
http://luizgustavoss.blogspot.com/
http://luizgustavoss.wordpress.com/
http://www.linkedin.com/in/luizgustavoss
Procurando uma especialização em Java, SOA e Android? Conheça a TNT Educacional

[Email] [WWW]
Maracuja
GUJ Ranger
[Avatar]

Membro desde: 28/03/2006 10:18:44
Mensagens: 940
Localização: Behind the screen
Offline

Bom dia.


Acredito que usando o arquivo .properties, neste caso, é mais simples.


Pimeiro creio que vc ou não leu, ou não entendou o ResourceBundle; com um Bundle vc não deixaria de usar o .properties, e sim o utiliziraria de uma forma mais elegante (para não dizer correta) do que isso.



E mais uma como se tratam de dados para conexão com o Banco, pq utilizar um .properties??

É muito mais fácil, e novamente mais elegante, heheheheh, vc colocar isso como parametros de contexto a serem declarados no seu Web.xml!!!

<context-param>

"Nunca deixarei de reclamar, mas espero reclamar de coisas melhores a cada dia..." Um amigo muito sabio
Luiz_Gustavo
Virtual Machine Man
[Avatar]

Membro desde: 30/04/2005 12:55:11
Mensagens: 518
Localização: Assis
Offline

Maracuja wrote:
Pimeiro creio que vc ou não leu


o que te faz tão crente disso?
você pode ter certeza de que se eu disse que li, é porque li....

Maracuja wrote:
ou não entendou o ResourceBundle;


entendi sim maninho... mas o ResourceBundle me pareceu mais interessante no caso de uma necessidade de internacionalização da aplicação (uma das principais finalidades dele, não é)

Maracuja wrote:
com um Bundle vc não deixaria de usar o .properties, e sim o utiliziraria de uma forma mais elegante (para não dizer correta) do que isso.




só acho mais prático usar um properties para colocar uma única linha (jdbc.url=jdbc:mysql://host/banco) do que criar um ResourceBundle só para isso.

Maracuja wrote:
E mais uma como se tratam de dados para conexão com o Banco, pq utilizar um .properties??

É muito mais fácil, e novamente mais elegante, heheheheh, vc colocar isso como parametros de contexto a serem declarados no seu Web.xml!!!

<context-param>


realmente pensei nisso... vou avaliar essa alternativa também.


Essa dica do ResourceBundle acabou sendo valiosa, mas para um outro sistema que tenho aqui, que fiz em Swing.
Estou pensando em torná-lo Open-Source, e uma das coisas que quero fazer é prepará-lo para a internacionalização.
Esse sistema envolve relatórios, e os relatórios estariam sujeitos à internacionalização (claro) mas não só com relação ao idioma, mas à própria estrutura.
Ele começa a ficar interessante para mim aqui:

"... Keys are always Strings. In this example, the keys are "OkKey" and "CancelKey". In the above example, the values are also Strings--"OK" and "Cancel"--but they don't have to be. The values can be any type of object..."


pois posso incluir os relatórios no ResorceBundle.

[]'s e obrigado pelas dicas!


Analista e Desenvolvedor de Sistemas
http://luizgustavoss.blogspot.com/
http://luizgustavoss.wordpress.com/
http://www.linkedin.com/in/luizgustavoss
Procurando uma especialização em Java, SOA e Android? Conheça a TNT Educacional

[Email] [WWW]
Genos
Entusiasta Java

Membro desde: 22/07/2005 17:23:37
Mensagens: 21
Offline

Olá, estou com um problema parecido.

Estou fazendoa configuração da minha classe utilizando um arquivo xml. Como o xml não é um arquivo de propriedades (key=value), não dá para usar um ResourceBundle (ou dá???). Considerando também que esse arquivo deva ficar em algum diretório da aplicação web (WEB-INF, possivelmente), como eu poderia fazer para acessá-lo?
andredecotia
JWizard
[Avatar]

Membro desde: 19/10/2009 14:37:32
Mensagens: 2267
Localização: São Paulo
Offline

thingol wrote:Primeira coisa: não use FileInputStream . Como seu arquivo .properties é apenas de leitura, use algo como

InputStream in = getClass().getResourceAsStream ("/resources/database.properties")

e ponha esse arquivo em algum lugar do seu PATH (talvez em WEB-INF/classes/resources/database.properties)


(aham, não sei se é getClass().getResourceAsStream() ou getClass().getClassLoader().getResourceAsStream(). Tente as duas alternativas


Muito boa a dica...

Abraços,
[Email] [MSN] [ICQ]
andredecotia
JWizard
[Avatar]

Membro desde: 19/10/2009 14:37:32
Mensagens: 2267
Localização: São Paulo
Offline

Criei a pasta resources em WEB-INF depois via Eclise cliquei em Add To Build Path e coloquei o arquivo .properties mas não encontra o mesmo através da forma que estou
fazendo abaixo:



Sei fazer via a forma citada acima, num package/classpath do projeto mas gostaria de deixar dentro de WEB-INF mesmo...

--
André AS


Analista Programador Java Web freelancer / home office
Linkedin: http://www.linkedin.com/profile/view?id=41470291&trk=tab_pro

[Email] [MSN] [ICQ]
Robberta
Smalltalk
[Avatar]

Membro desde: 22/04/2011 11:05:14
Mensagens: 1
Offline

Eu estou tentando usar esse arquivo . properties e mesmo testando com vários exemplos que encontrei na net ele não carrega as informações do arquivo.

Segue código:

#Esse seria meu arquivo banco.properties que está no mesmo pacote da classe onde irei usá-lo.

driver = com.mysql.jdbc.Driver
url = jdbc:mysql://localhost:3306/locadorabd
user = root
pass = ****** (teria uma senha)


//Classe que gerencia a conexão com o banco.
public class GerenciadorConexao implements IGerenciadorConexao{
public String driver;
private String url;
private String user;
private String pass;
private static GerenciadorConexao instancia = null;
private Connection conexao = null;

private GerenciadorConexao() throws FileNotFoundException, IOException{
Properties props = new Properties();
String arquivo = "banco.properties";

try {
props.load(new FileInputStream(arquivo));
driver = props.getProperty("driver");
url = props.getProperty("url");
user = props.getProperty("user");
pass = props.getProperty("pass");
} catch (Exception ex) {
System.out.println(ex.getMessage());
}
}
public static GerenciadorConexao getInstancia() throws IOException {
if(instancia==null)
instancia = new GerenciadorConexao();
return instancia;
}

@Override
public Connection connect() {
if(conexao == null){
try {
Class.forName(driver);
conexao = DriverManager.getConnection(url, user, pass);
} catch (ClassNotFoundException ex) {
//
} catch (SQLException ex) {
//
}
}
return conexao;
}

@Override
public void disconnect() {
try {
conexao.close();
conexao = null;
} catch (SQLException ex) {
//
}
}
}


Não sei o que está errado, ele não encontra esse arquivo e não carrega as variáveis.

 
Índice dos Fóruns » Desenvolvimento Web
Ir para:   
Powered by JForum 2.1.8 © JForum Team