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!!!

sábado, 13 de fevereiro de 2010

Código Formatado

Olá, Pessoal!!!

Graças ao post do MMaia, consegui implantar formatação de código no nosso blog. Infelizmente, para que a formatação funcione, tive que desabilitar a quebra automática de linha. Assim, no final de cada linha será preciso colocar "<br/>".

Modo de Usar

Ao postar o código, basta colocá-lo entre as tags "<pre class="brush: linguagem"></pre>

Exemplo

O código:

<pre class="brush: java">
public class MeuObjeto {
private String nome;
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
}
</pre>

Ficará:

public class MeuObjeto {
 private String nome;
 public String getNome() {
  return nome;
 }
 public void setNome(String nome) {
  this.nome = nome;
 } 
}

Obs.:O caracter < deve ser substituído por &lt;
E > substituído por &gt;

Linguagens

ActionScript3 = as3, actionscript3 
Bash/shell = bash, shell  
C# = c-sharp, csharp 
C++ = cpp, c  
CSS = css  
Delphi = delphi, pas, pascal  
Diff = diff, patch  
Groovy = groovy  
JavaScript = js, jscript, javascript 
Java = java
JavaFX = jfx, javafx 
Perl = perl, pl 
PHP = php 
Plain Text = plain, text 
PowerShell = ps, powershell 
Python = py, python 
Ruby = rails, ror, ruby 
Scala = scala 
SQL = sql 
Visual Basic = vb, vbnet 
XML = xml, xhtml, xslt, html, xhtml

Valeu, galera!!!

sexta-feira, 12 de fevereiro de 2010

Tutorial PickList RichFaces

Olá, pessoal! Como sofri um pouco para conseguir utilizar o PickList do RichFaces, resolvi fazer um simples tutorial de sua utilização. Links: http://docs.jboss.org/richfaces/3.3.2.GA/en/devguide/html/rich_pickList.html http://livedemo.exadel.com/richfaces-demo/richfaces/pickList.jsf?c=pickList

JSP

<rich:pickList value="#{bean.listaDestino}" 
 copyAllControlLabel=" " 
 copyControlLabel=" "
 removeControlLabel=" "
 removeAllControlLabel=" "> 
 <f:selectItems value="#{bean.ListaOrigem}"/>
</rich:pickList>

Os atributos …ControlLabel possibilitam você alterar o rótulo de cada botão do componente.

BEAN

public class Bean {
  private List<MeuObjeto> listaDestino;
  private List<SelectItem> listaOrigem;
  
  public List<MeuObjeto> getListaDestino() {
    if (listaDestino == null) {
      listaDestino = new ArrayList<MeuObjeto>();
    }
    return listaDestino;
  }
  public List<SelectItem> getListaOrigem() {
    if (listaOrigem == null) {
      listaOrigem = new ArrayList<SelectItem>();
      
      /* Criei esse objeto apenas a título de exemplo. 
       * Num caso real, você poderia buscar a lista do banco.
       */
      MeuObjeto o = new MeuObjeto();
      listaOrigem.add(new SelectItem(o, o.getNome()));
    }  
    return listaOrigem;
  }
  public void setListaDestino(List<MeuObjeto> listaDestino) {
    this.listaDestino = listaDestino;
  }
  public void setListaOrigem(List<SelectItem> listaOrigem) {
    this.listaOrigem = listaOrigem;
  }
}

Pronto!
Dessa forma sua lista já irá funcionar. Ao passar os elementos de uma lista para outra, a listaDestino será atualizada.

Abraços!!!