Desenvolvimento de taglib

7 respostas
C

Olá Pessoal!

Estou desenvolvendo uma taglib que recebe um coleção de objetos, e os ordena. Porém essa taglib deve ordenar qualquer tipo de objeto de uma aplicação web. Ou seja, Se na minha aplicação eu tenho dois TO(Transfer Object) UsuarioTO e FuncionarioTO e cada hora eu quero ordenar uma lista de cada objeto, em minha taglib não posso fazer o Iterator com:

1.   Iterator it = listaUsuarioTO.iterator();
2.   while(it.hasNext()){
3.      UsuarioTO element = (UsuarioTO) it.next();
4.     }

Na linha 3 ele tem que ser dinânico (UsuarioTO) posso colocar FuncionarioTO também, ou seja isso não pode ser fixo.

Como faço para receber o nome da classe e colocar na linha 3, para ser dinâmico.

Pessoal, não sei se fui muito clara, por favor façam perguntas se não entenderem.

Até+++
:roll:

7 Respostas

C

Christielen,,

Uma solução para isso é o polimorfismo. Você pode criar uma interface que tanto usuário como funcionário emplimentam esta interface. Quando for iterar na verdade você terá um objeto do tipo da interface. Tipo
public interface Usuarios{
public List<Usuarios> listagem();
}

Classe UsuárioTO

public class UsuarioTO implements Usuarios{

    public List<Usuarios> listagem(){
               //implementação
    
    }
}


Classe FuncionárioTO

public class FuncionarioTO implements Usuarios{

    public List<Usuarios> listagem(){
               //implementação
    
    }
}
Quando for iterar fica assim
Iterator<Usuarios> it = listagem().iterator();
while(it.hasNext()){
    Usuarios element = it.next();
    //implementação
}
C

Olá…

Eu não posso usar polimorfismo, pois as classes são totalmente independentes, Em uma aplicação de uma empresa posso ter mais de 30 Transfer Object… :cry:

Alguém tem outra solução… :oops:

B

Ola,

O que vc pode fazer e fazer com que todas os seus TO implementes Comparable, de forma que eles saibam como se ordenar… e desta forma vc ja tem o polimorfismo.

C

Pessoal, vocês não estão entendendo :cry:

Vou colocar a minha classe que desenvolve uma taglib para que vocês possam entender melhor.

package br.com.tpd.taglib;

import java.io.IOException;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.SimpleTagSupport;

import br.com.tpd.to.UsuarioTO;

public class TaglibGrid extends SimpleTagSupport{
   /**
    *
    */
   private static final long serialVersionUID = 1L;

   private List listaUsuario;
   

   public List getListaUsuario() {
      return listaUsuario;
   }



   public void setListaUsuario(List listaUsuario) {
      this.listaUsuario = listaUsuario;
   }
   
   public void doTag() throws JspException, IOException {
      
      if(listaUsuario.size() > 0){
         Collections.sort(listaUsuario, UsuarioTO.ORDER_BY_NOME);
      }
      
      //StringBuffer sb = new StringBuffer();
      Iterator<UsuarioTO> it = listaUsuario.iterator();
      while (it.hasNext()) {
         UsuarioTO usuarioTO = (UsuarioTO) it.next();
         /**sb.append("<label for='" + usuarioTO.getNome() + "'>"
               + usuarioTO.getNome() + "</label>");
         sb.append("<label for='" + usuarioTO.getCpf() + "'>"
               + usuarioTO.getCpf() + "</label>");*/
            //getJspContext().setAttribute("usuario", usuarioTO);
         getJspBody().invoke(null);      
      }
   }

   
}

Em:

//StringBuffer sb = new StringBuffer();
      Iterator<UsuarioTO> it = listaUsuario.iterator();
      while (it.hasNext()) {
         UsuarioTO usuarioTO = (UsuarioTO) it.next();
         /**sb.append("<label for='" + usuarioTO.getNome() + "'>"
               + usuarioTO.getNome() + "</label>");
         sb.append("<label for='" + usuarioTO.getCpf() + "'>"
               + usuarioTO.getCpf() + "</label>");*/
            //getJspContext().setAttribute("usuario", usuarioTO);
         getJspBody().invoke(null);

Essa linha UsuarioTO usuarioTO = (UsuarioTO) it.next();
não pode ser fixa porque tenho vários TO. Alguém tem alguma idéia de como eu faço para pegar o nome da classe do objeto que estou passando por parâmetro pela minha taglib??

C

Christielen,

de acordo com o seu código não vejo porque você não pode utilizar polimorfismo…para isso basta todas as classes TO independente de quantas sejam, implementarem a interface. Como foi exibido anteriormente.
E quando você passar a listagem de objeto, esta irá ser do tipo da interface.
Pelo o que você mostrou dá perfeitamente para utilizar polimorfismo.

Contudo se você está vendo alguma barreira em implementar desta forma você pode utilizar o [color=“darkblue”]instance of[/color], que é uma péssima prática de programação.

Valeu

B

Ola,

Po, mas o que vc esta mostrando noa e uma ordenacao… vc esta tentando mostrar os atributos de um Bean usando tags… pelo menos e o que deu pra notar no codigo que vc postou…

Se for isto, vc pode usar reflection, vc configura seu tag para receber os nomes das propriedades a serem exibidas, as recupera via reflection, para isto so fazer uma busca aqui no forun, eu mesmo ja ajudei alguns colegas a fazerem isto, e exibir…

Mas acho que vc pode usar EL para fazer isto, misturando com o forEach, do JSTL… fica melhor, e vc nao precisa escrever uma tag para isto…

C

Pessoal eu sei que existem tags que executam a tarefa de listagem de uma coleção, porém o pessoal de onde eu trabalho que que eu desenvolva um grid customizado, ou seja, eu passo como parâmetro para minha taglib a lista de objetos e os campos que eu quero que apareça na taglib. Certo? Porém dentro de minha taglib eu tenho que itera-la para formata-la num HTML desenvolvidos pelo designer da empresa.

Eu não posso fazer que um transfer object tenham poliformismo porque se eu fizer isso o pessoal da arquitetura do projeto me mata :roll:

Não sei mas o que fazer, vocês tem uma solução alternativa para que eu possa ordenar a lista de objetos e que sejam independentes de Transfer Object, ou seja, eu passo qualquer lista de objeto com qualquer TO e ele saiba como itera-lo??

Valeu pela ajuda pessoal!

Criado 7 de julho de 2007
Ultima resposta 7 de jul. de 2007
Respostas 7
Participantes 3