quinta-feira, 17 de março de 2011

Plugin jQuery Date Mask

Olá, pessoal!

Hoje resolvi estudar um pouco sobre um componente que já precisei e não encontrei.
O componente precisaria formatar uma data em um input e, no decorrer da digitação ele corrigir datas inválidas como 30/02.
Como não encontrei, eu criei. =)

Veja como ficou:

Sem informar parâmetros:

Data:

jQuery(function($){
   $(seletor).dateMask();
});

Informando todos parâmetros:

Data:

jQuery(function($){
   $(seletor).dateMask({separator:'-', format:'dmy', minYear:1900, maxYear:2011});
});

Formato de mês e ano:

Data:

jQuery(function($){
   $(seletor).dateMask({separator:' ', format:'my', minYear:1900, maxYear:2011});
});


Veja a documentação completa no jQuery Plugin

Download

Abraços!

quarta-feira, 16 de março de 2011

Mensagem desaparecendo

Olá!

Uma coisa que me quebrou muito a cabeiça foi fazer a mensagem do richfaces desaparecer após um determinado tempo.
Tanto estudei que descobri uma forma de fazer isso.

Primeiro é preciso criar uma funçao do jquery:
jQuery.fn.extend({
 hideMsg: function(time) { //PARÂMETRO EM MILISSEGUNDOS
  $el = $(this);  
  setTimeout(function() {
   if ($el && $el.attr('id') && $el.attr('id').indexOf('msg') > -1){
    $el.hide();
   }
  }, time );
 }
});

Em seguida é preciso fazer a chamada da função criada dentro da tag messages no jsp.
<rich:messages id="msg">
 <rich:jQuery query="hideMsg(8000)" selector="#msg"></rich:jQuery>
</rich:messages>

Já está pronto.
Nesse exemplo, após 8 segundos da exibição da mensagem, ela desaparece.

Não sei se existe uma maneira melhor de fazer isso, mas essa foi a que consegui.
As variações ficam por conta da criatividade de cada um. E não se esqueça de compartilhar conosco.


Espero ter ajudado!
Abraços!

Enviando e-mail de uma conta externa

Olá!

Nesse post vou mostrar como enviar e-mail utilizando a biblioteca JavaMail através de uma conta externa (nesse caso utilizei o gmail).

Segue o código:

import java.util.Date;
import java.util.Properties;

import javax.mail.Authenticator;
import javax.mail.Message;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

public class EnviarEMail {

 public static void main(String[] args) {
  
  Properties p = new Properties();  
  p.put("mail.host", "smtp.gmail.com"); //CONFIGURAÇÃO DO GMAIL
  p.put("mail.smtp.starttls.enable","true");
  p.put("mail.smtp.port", "587");
  p.put("mail.smtp.auth", "true");

  Authenticator auth = new Authenticator() {
   
    public PasswordAuthentication getPasswordAuthentication() {
     return new PasswordAuthentication("meu_email@gmail.com", "minha_senha");
    }};

   try{
    Session session = Session.getInstance(p, auth);  
    MimeMessage msg = new MimeMessage(session);
 
    //DEFINE O ENDEREÇO DO REMETENTE
    InternetAddress[] de = {new InternetAddress("remetente@mail.com")};
 
    msg.setFrom(de[0]);
    msg.setReplyTo(de); //INFORMA O ENDEREÇO DE RESPOSTA
  
    msg.setRecipient(Message.RecipientType.TO, new InternetAddress("destinatario_1@mail.com"));
 
    //DEFINE A DATA DO ENVIO
    msg.setSentDate(new Date());
    msg.setSubject("Assunto da mensagem");
    
    String mensagem = "Aqui vem o conteúdo do e-mail";
    
    msg.setText(mensagem);

    //DEFINE A CODIFICAÇÃO DO TEXTO DA MENSAGEM. NESSE CASO HTML.
    msg.setContent(mensagem, "text/html");
 
    Transport.send(msg);
    
    System.out.println("Mensagem enviada com sucesso!");
    
  }catch (Exception e) {
   e.printStackTrace();
  }
 }
}

Para enviar o e-mail para mais de uma pessoa, basta adicionar um destinatário conforme segue:
//ENVIA COMO UMA CÓPIA
msg.addRecipient(Message.RecipientType.CC, new InternetAddress("destinatario_2@mail.com"));
//ENVIA COMO UMA CÓPIA OCULTA
msg.addRecipient(Message.RecipientType.BCC, new InternetAddress("destinatario_3@mail.com"));

Também é possível enviar um e-mail para várias pessoas de uma só vez:
msg.setRecipients(Message.RecipientType.BCC, new InternetAddress[]{new InternetAddress("destinatario_1@mail.com"), 
 new InternetAddress("destinatario_2@mail.com"), new InternetAddress("destinatario_3@mail.com")});

Isso fará com que os destinatários 1, 2 e 3 recebam o mesmo e-mail.
Notem que o RecipientType está definido como BCC (Cópia oculta). Isso significa que nenhum destinatário poderá visualizar a lista de destinatário.

Essa dica me ajudou muito. Espero que ajude mais pessoas.

Abraços!!!

terça-feira, 15 de março de 2011

Criar um array tipado de um ArrayList

Continuando na sequência dos estudos com arrays, também descobri como criar um array[] tipado por meio de um ArrayList.

Segue o código:

List<String> lista = Arrays.asList("Primeiro", "Segundo", "Terceiro");
String[] array = lista.toArray(new String[lista.size()]);
Isso é muito útil quando é necessário passar um array[] como parâmetro e se tem um ArrayList.

Criar um List já preenchido

Recentemente eu tive a necessidade de criar um List já preenchido para passá-lo como parâmetro.
Como não foi muito fácil de encontrar, decidi postar para que possa ajudar quem precise.

Segue o código:

List<string> lista = Arrays.asList("Primeiro", "Segundo", "Terceiro");
Esse código faz com que se tenha um List com as strings "Primeiro", "Segundo" e "Terceiro".

quarta-feira, 17 de fevereiro de 2010

Persistindo Enum com Hibernate

Olá, pessoal!

Tive alguns problemas, por isso resolvi criar um tópico para tratar desse assunto.

Para gravar enumeradores num campo varchar, consulte o link: https://www.hibernate.org/265.html

Para gravar enumeradores num campo int, segue a anotação:
@Enumerated(EnumType.ORDINAL)
public Tipo getTipo() {  
 return tipo;
}

Já para gravar uma lista de enumeradores na tabela, é preciso inserir a seguinte anotação:
@CollectionOfElements(fetch=FetchType.LAZY)
@JoinTable(name = "tabelaTipo", joinColumns = @JoinColumn(name = "id_tabelaDestino"))
@Column(name="campoTipo")
public List<Tipo> getListaTipo() {
 if (listaTipo == null){
  listaTipo = new ArrayList<Tipo>();
 }
 return listaTipo;
}

Nesse caso, será gravado o objeto em questão e a lista dos tipos na tabela “tabelaTipo” referenciando o objeto em questão na coluna “id_tabelaDestino” contendo o número correspondente ao tipo na coluna "campoTipo".

É isso aí, pessoal!
Qualquer dúvida, sugestão ou elogio, comente.

Abraços!!!

Menu dinâmico com Rich Faces

Olá, pessoal!
Nesse tutorial vou mostrar uma solução que encontrei para criar um menu dinâmico infinito multinível.

Primeiramente vamos criar a classe Menu:

public class Menu {

 private Long id;
 private String nome; //Rótulo do menu. 
 private String navegacao; //Nome da navegação cadastrada no faces-config.xml
 private Menu menuSuperior; //Elemento pai do menu caso haja.
 private TipoMenu tipoMenu;
 
 public Menu getMenuSuperior() {
  return menuSuperior;
 } 
 public TipoMenu getTipoMenu() {
  if (tipoMenu == null){
   tipoMenu = TipoMenu.ITEM;
  }
  return tipoMenu;
 }
 public String getNome() {
  return nome;
 }
 public String getNavegacao() {
  return navegacao;
 }
 public void setNome(String nome) {
  this.nome = nome;
 }
 public void setNavegacao(String navegacao) {
  this.navegacao = navegacao;
 }
 public void setMenuSuperior(Menu menuSuperior) {
  this.menuSuperior = menuSuperior;
 }
 public void setTipoMenu(TipoMenu tipoMenu) {
  this.tipoMenu = tipoMenu;
 }
 public Long getId() {
  return id;
 }
 public void setId(Long id) {
  this.id = id;
 }
}


A classe TipoMenu é um enumerador:

public enum TipoMenu {
 DROP_DOWN,
 GROUP,
 ITEM; 
}


Realizando o controle:

public class MenuControle {
 
 private HtmlToolBar htmlToolBar;
 private int countId = 1;
  
 @SuppressWarnings("unchecked")
 public HtmlToolBar getHtmlToolBar(){
  if (htmlToolBar == null){
   try{
    ArrayList<Menu> itens = (ArrayList<Menu>) getMenuDAO().listar(Menu.class); //UTILIZAR SEU MÉTODO DE LISTAGEM.

    FacesContext context = FacesContext.getCurrentInstance();  
    htmlToolBar = (HtmlToolBar) context.getApplication().createComponent(HtmlToolBar.COMPONENT_TYPE);
    htmlToolBar.setId("myToolBar" + countId++);

    //BOTÃO SAIR
    HtmlToolBarGroup htmlToolBarGroup = (HtmlToolBarGroup) context.getApplication().createComponent(HtmlToolBarGroup.COMPONENT_TYPE);
    htmlToolBarGroup.setLocation("right");
    htmlToolBarGroup.setId("myToolBarGroup" + countId++);
    
    HtmlMenuItem menu = (HtmlMenuItem) context.getApplication().createComponent(HtmlMenuItem.COMPONENT_TYPE);   
    menu.setValue("Sair");
    menu.setSubmitMode("ajax");
    MethodExpression action = context.getApplication().getExpressionFactory().createMethodExpression(context.getELContext(), "#{menuControle.logout}", String.class, new Class[]{});
    menu.setActionExpression(action);
    
    htmlToolBarGroup.getChildren().add(menu);
    htmlToolBar.getChildren().add(htmlToolBarGroup);
    
    if (itens == null || itens.isEmpty()){
     return htmlToolBar;
    }
    
    Map<Long, Map<Long, Menu>> menuTotal = new HashMap<Long, Map<Long, Menu>>();
      
    for (Menu item : itens) {   
     Long idPai = item.getMenuSuperior() == null ? 0L : item.getMenuSuperior().getId();   
     
     if (!menuTotal.containsKey(idPai)){
      menuTotal.put(idPai, new HashMap<Long, Menu>());
     }
     menuTotal.get(idPai).put(item.getId(), item);   
    }
    
    montaMenu(context, htmlToolBar, menuTotal, 0L);
        
   }catch (Exception e) {
    e.printStackTrace();
   }
  }
  return htmlToolBar;
 }
 
 public static void montaMenu(FacesContext context, UIComponent pai, Map<Long, Map<Long, Menu>> menuTotal, Long idPai){
        
        Iterator<Long> it = menuTotal.get(idPai).keySet().iterator();
  while (it.hasNext()) {
   Long key = it.next();
   Menu item = menuTotal.get(idPai).get(key);
   UIComponent novoPai = null;
   
   switch (item.getTipoMenu()) {
   case DROP_DOWN:
    HtmlDropDownMenu menuAdm = (HtmlDropDownMenu) context.getApplication().createComponent(HtmlDropDownMenu.COMPONENT_TYPE);
    menuAdm.setValue(item.getNome());
    pai.getChildren().add(menuAdm);
    novoPai = menuAdm;
    break;
   
   case GROUP:
    HtmlMenuGroup group = (HtmlMenuGroup) context.getApplication().createComponent(HtmlMenuGroup.COMPONENT_TYPE);
    group.setValue(item.getNome());
    pai.getChildren().add(group);
    novoPai = group;
    break;
    
   case ITEM:
    HtmlMenuItem menu = (HtmlMenuItem) context.getApplication().createComponent(HtmlMenuItem.COMPONENT_TYPE);   
    menu.setValue(item.getNome());    
    menu.setSubmitMode("ajax");
    MethodExpression action = context.getApplication().getExpressionFactory().createMethodExpression(context.getELContext(), item.getNavegacao(), null, new Class<?>[0]);
    menu.setActionExpression(action);
    pai.getChildren().add(menu);
    break;    
   }
   if (menuTotal.containsKey(key)){
    montaMenu(context, novoPai, menuTotal, key);
   }         
  }        
 }
 public String logout(){
  //TODO SEU MÉTODO DE SAÍDA.
  return "login";
 }
 public void setHtmlToolBar(HtmlToolBar htmlToolBar) {
  this.htmlToolBar = htmlToolBar;
 }
}


Agora basta inserir o menu no jsp:

<rich:toolBar binding="#{menuControle.htmlToolBar}"></rich:toolBar>

Não se esqueça de cadastrar a navegação no faces-config.xml.
Valew, galera!
Abraços!!!