Javafriend's

Conectando o Java ao mundo externo

Enviando E-mail com Mail API

fazer um comentário »

Veremos de forma simples e prática como enviar e-mail autenticado através do Mail API. Para executar o exemplo abaixo é necessário adicionar no seu projeto as Libs smtp.jar (Biblioteca que provê classes para enviar e-mails via protocolo SMTP) além da biblioteca activation.jar (JavaBeans Activation) e por último mailapi.jar (Provê as classes necessárias para manipulação de mensagens, cabeçalhos, anexos e etc). Para maiores informações veja a página oficial: http://java.sun.com/products/javamail

Segue o código, posteriormente abordaremos os pontos principais.

1 package com.wordpress.javafriend.enviaemail;
2
3 import java.util.Properties;
4 import javax.mail.Authenticator;
5 import javax.mail.Message;
6 import javax.mail.PasswordAuthentication;
7 import javax.mail.Session;
8 import javax.mail.Transport;
9 import javax.mail.internet.InternetAddress;
10 import javax.mail.internet.MimeMessage;
11
12 public class EnviaEmail {
13
14 @SuppressWarnings(static-access)
15 public static void enviarEmail() throws Exception {
16 Properties props = System.getProperties();
17 props.put(mail.smtp.host, smtp.dominio.br);
18 props.put(mail.smtp.auth, true); // Define que o e-mail será enviado de modo autenticado
19
20 Authenticator auth = new Authenticator() {
21
22 @Override
23 public PasswordAuthentication getPasswordAuthentication() {
24 return new PasswordAuthentication(e-mail, senha);
25 }
26 };
27
28 Session session = Session.getInstance(props, auth);
29       Message message = new MimeMessage(session);
30 message.setFrom(new InternetAddress(O seu endereço de e-mail, Nome que o destinátario irá visualizar));
31
32 message.addRecipient(Message.RecipientType.TO,
33 new InternetAddress(Endereço do Destinátario, Nome do destinátario));
34       message.setSubject(Aqui o Assunto);
35 message.setContent(Aqui a mensagem ou conteúdo do e-mail, text/html);
36 Transport smtp = session.getTransport(smtp);
37 smtp.send(message);
38 }
39
40 public static void main(String[] args) {
41 try {
42 enviarEmail();
43 } catch (Exception ex) {
44 System.out.println(Não foi possivel enviar o e-mail );
45 ex.printStackTrace();
46 }
47 }
48 }
49

Veja que no código acima no método enviarEmail() é declarado um objeto props da classe Properties, este que recebe a instância  através do método estático  getProperties() da classe System. Este metódo retorna um objeto do tipo Properties com propriedades e valores do Sistema semelhante as varíveis de ambiente do Sistema Operacional. Depois adicionamos mais duas propriedades, uma referente ao domínio do servidor SMTP e outro definindo que o e-mail será autenticado. Posteriormente é instanciado a classe  Authenticator que encapsula o e-mail e  senha,  a seguir os objetos declarados da classe Properties e da classe Authenticator são passados por parâmetro no método estático Session.getInstance(props,auth) este no qual retorna uma instância da classe Session. A seguir é declarada  um objeto da classe  Message que recebe a instância da classe MimeMessage onde em seu construtor recebe o objeto da classe Session (declarado anteriormente),  no  objeto da classe Message são definidos o destinatário, o remetente e conteúdo da mensagem.

Posteriormente é  declarado um objeto da classe Transport que  recebe sua instância através do método getTransport do objeto session(classe Session) que recebe por parâmetro uma String.                                                Para envio da mensagem  invocamos o método send do objeto session que recebe objeto da classe Message(declarado anteriormente).

Escrito por Roberto Santos Marques da Silva

Setembro 24, 2009 em 10:16 am

Limitar caracteres em um JTextField

fazer um comentário »

Para limitar uma quantidade de caracteres em um JTextField não existe nenhuma propriedade como por exemplo um atributo maxlength do <input> HTML. Porém, graças a facilidade da API Java Swing é possível implementar um novo comportamento para a entrada de dados do seu componente.

A Classe JTextField possui um método de instância chamado setDocument() que recebe uma interface Document como parâmetro.

Para fazer nosso novo comportamento basta criar uma classe que implemente Document, mas para facilitar criaremos uma classe que estende de PlainDocument (classe que já implementa Document). Então sobrescreveremos o método insertString() que é responsável pela entrada de dados no componente.

1 package com.wordpress.javafriend;
2
3 import javax.swing.text.AttributeSet;
4 import javax.swing.text.BadLocationException;
5 import javax.swing.text.PlainDocument;
6
7 public class NovoDocumento extends PlainDocument {
8     @Override
9     public void insertString(int offset, String str, AttributeSet a) throws BadLocationException {
10         if (getLength() > 5)
11              return;
12         super.insertString(offset, str, a);
13   }
14 }

O método insertString() é chamado implicitamente em qualquer entrada de dados no campo, seja por digitação, CTRL+V ou até mesmo uma chamada a setText(). O método getLength() é responsável por retornar a quantidade de caracteres já inseridos no campo até o momento e com um simples IF estamos validando se a quantidade já passou de 5 caracteres para impedir que seja inserido mais alguma coisa.
Vale a pena dizer que esse parâmetro String str que o método recebe guarda o que está prestes a ser inserido, por exemplo se eu aperto a tecla “B” no campo essa variável armazenará uma string “B”. E o parâmetro int offset armazena a posição que a futura string será inserida, entende-se como posição do cursor no componente.
 
Depois é só passar uma instância de nossa classe para a propriedade Document do seu objeto JTextField.
 
1 objetoTextField.setDocument(new NovoDocumento());
Conhecendo como  o método insertString()  trabalha é possível fazer inumeras funcionalidades para seu componente, como por exemplo uma mascara que só aceita números.

Escrito por Danilo Akamine

Setembro 24, 2009 em 9:08 am

Implementando Observer com Swing

fazer um comentário »

Um problema muito comum é o gerenciamento e comunicação entre janelas em uma aplicação Swing. Vou deixar aqui uma breve explicação de como resolver isso utilizando o padrão Observer que é facilmente aplicável utilizando as implementações prontas disponíveis na API Java.

O que é Observer?

O design pattern Observer permite que objetos sejam notificados sobre mudanças de estado de outro objeto sem possuir um forte acoplamento entre eles. O observado não conhece e nem deseja conhecer o observador, apenas envia notificações a ele avisando sobre possíveis mudanças.

Observer + MVC + Swing

Aproveitando o poder do Observer podemos montar uma arquitetura MVC simples onde a camada de Controle após solicitar os dados ao Modelo, envia para a camada da View os dados solicitados. O Controle no momento deste envio não sabe para onde está enviando os dados, e a View não sabe quem enviou a ela, mas ela sabe como receber esses dados e exibir da forma correta na tela.

Exemplo

Colocamos aqui 2 exemplos, a classe ClienteController e ClienteView. Veja a comunicação entre elas, a explicação está nos comentários lembrando que foi comentado apenas o que estamos mostrando nesse post.
 

ClienteView.java

1 package com.wordpress.javafriend;
2
3 import java.awt.Color;
4 import java.awt.Dimension;
5 import java.awt.FlowLayout;
6 import java.awt.event.ActionEvent;
7 import java.awt.event.ActionListener;
8 import java.util.Observable;
9 import java.util.Observer;
10
11 import javax.swing.JButton;
12 import javax.swing.JFrame;
13 import javax.swing.JPanel;
14 import javax.swing.JTextPane;
15
16 public class ClienteView extends JFrame implements Observer {
17     private JTextPane visor;
18     private JPanel painel;
19     private JButton botao;
20    // Atributo principal para nosso exemplo
21     private ClienteController controle;
22
23     public ClienteView() {
24         super(Listagem de Clientes);
25         setSize(200, 300);
26         setLocationRelativeTo(null);
27
28         painel = new JPanel(new FlowLayout());
29         visor = new JTextPane();
30         visor.setContentType(text/html);
31         visor.setBackground(Color.LIGHT_GRAY);
32         visor.setPreferredSize(new Dimension(200, 200));
33         botao = new JButton(Solicitar listagem);
34         botao.addActionListener(new AcaoBotao());
35         painel.add(visor);
36         painel.add(botao);
37         getContentPane().add(painel);
38
39         // Instancia o controle
40         controle = new ClienteController();
41         // Adiciona essa tela como observadora, a partir de agora qualquer mudança de estado no controle a tela será notificada
42         controle.addObserver(this);
43     }
44
45     public void init() {
46         setDefaultCloseOperation(EXIT_ON_CLOSE);
47         setVisible(true);
48     }
49
50     // Innerclass responsável pela ação do botão
51     private class AcaoBotao implements ActionListener {
52         public void actionPerformed(ActionEvent e) {
53             controle.solicitarCliente(); // Executando uma ação no controle
54         }
55     }
56
57     @Override
58     public void update(Observable arg, Object arg1) {
59         // Quando este método for chamado, é porque houve mudanças no objeto que estava sendo observado (o controle)
60         // arg1: trará informações opcionais do que foi alterado ou solicitado
61         // detalhe: a view não precisa saber quem enviou os dados, mas tem certeza de que eles vieram
62         visor.setText((String) arg1);    // mostrando na tela as informações enviadas pelo controle
63     }
64
65     public static void main(String[] args) {
66         new ClienteView().init();
67     }
68 }
69
ClienteController.java

1 package com.wordpress.javafriend;
2
3  import java.util.Observable;
4
5  public class ClienteController extends Observable {
6     public void solicitarCliente() {
7         // Aqui você faria uma solicitação de dados para um DAO por exemplo
8         // mas como isso é apenas um exemplo, estou criando os dados aqui mesmo
9          String dados = Danilo <br> Roberto <br> Oscar;
10       // Avisa a todos seus “observadores” que houve mudança de estado
11        setChanged();
12        // Envia dados aos “observadores” (quem está observando chamará o método update() implicitamente)
13        // detalhe: o controle não sabe para onde está enviando os dados
14        notifyObservers(dados);
15     }
16 }
Lembrando que estes são exemplos simples de uma implementação Observer com Swing, partindo dessa idéia inicial você pode fazer muitas coisas.

Escrito por Danilo Akamine

Julho 11, 2009 em 2:08 pm

Conectando no Excel via (ODBC)

com um comentário

Acessar informações de arquivos Excel(*.xls) no Java é muito fácil e simples, isso é possível devido ao uso de drivers ODBC e o único requisito necessário é ter o Microsoft Office Excel instalado. Uma das vantagens dessa conexão é poder fazer o uso de instruções SQL, como por exemplo um SELECT, comando utilizado largamente em banco de dados convencionais.

Primeiramente crie o arquivo Excel seguindo a estrutura abaixo:

Observe que a primeira linha da planilha está reservada para servir como colunas de uma tabela, já o nome da planilha (não do arquivo) se comportará como uma tabela lembrando que estes valores serão utilizados na cláusula SELECT.
Os registros estão a partir da segunda linha da planilha.

Abaixo um exemplo de consulta simples em um arquivo do Excel:

1 package com.wordpress.javafriend;
2 import java.sql.Connection;
3 import java.sql.DriverManager;
4 import java.sql.ResultSet;
5 import java.sql.Statement;
6
7 public class ConexaoExcel {
8     public static void main(String args[]) {
9         Connection con = null;
10       Statement stm = null;
11       ResultSet rs = null;
12
13      try {
14         Class.forName(sun.jdbc.odbc.JdbcOdbcDriver);
15         con = DriverManager.getConnection(jdbc:odbc:Arquivos do Excel;DBQ=c:/arquivo.xls);
16
17         stm = con.createStatement();
18         rs = stm.executeQuery(SELECT * FROM [dados$]);
19
20        while (rs.next()) {
21             System.out.println(rs.getString(nome) + + rs.getString(idade));
22         }
23
24         rs.close();
25         stm.close();
26         con.close();
27      }
28       catch (Exception e) {
29          e.printStackTrace();
30      }
31    }
32 }
 
Veja que na string de conexão há um argumento DBQ, seu valor indica o caminho onde o arquivo se encontra.
Muito importante lembrar que ao tentar fazer a leitura de dados deste arquivo o mesmo não pode estar aberto. Repare também que na consulta SQL o nome da tabela está entre colchetes e o nome terminado por $, se por acaso a instrução não conter esses detalhes será gerado um erro na leitura dos dados.

Escrito por Roberto Santos Marques da Silva

Julho 6, 2009 em 1:39 pm

Publicado em Desktop

Etiquetado com , , , , , , ,