Bom dia !
Estou querendo fazer um Tag JSP que seria um encapsulamento de um ComboBox personalizado.
A tag já esta pronta, mas não esta funcionando como eu quero que funcione, porque é o seguinte, a tag recebe um List que é percorrida e seus valores são jogados num combo…até ai tudo bem, porém quero deixar mais complexo, quero que seja possível que eu passe uma List que tenha objetos, por exemplo :
List com objetos dessa classe de exemplo:
public class Pessoa
{
private String nome;
private int idade;
}
E em minha tag ao receber a List, quero também receber um caminho para acesso a algum atributo destes objetos da list, que seria algo assim:
<tags:Combobox valores="${listaDePessoas}" caminho="nome" />
e dentro de minha tag quria que fosse possível acessar este atributo nome sem conhecer a classe, por exemplo:
<%@ tag language="java" pageEncoding="ISO-8859-1"%>
<select>
<option></option>
<c:forEach items="${valores}" var="dado">
<option>${dado.caminho}</option> //AQUI, QUERIA ACESSAR O CAMINHO SEM SABER DE QUE CLASSE SE TRATA
</c:forEach>
</select>
Sabem se há algum macete para isso ?
Obrigado.
Resolvi de forma mais complexa este problema, porém mais orientada a objetos…criei uma Interface de acesso que deve ser recebida em minha tag de combobox, e essa interface funcinará como um conversor…
Vou postar os códigos caso alguém precise:
[color=blue]Interface[/color]
public interface Conversor<F,T>
{
public T converterPara(F objeto);
public F convertDe(T objeto);
}
[color=brown]Classe que implementa o Conversor[/color]
public class CategoriaConverter implements Conversor<Categoria, String>
{
@Override
public String convertPara(Categoria objeto)
{
if(objeto == null) throw new NullPointerException("A categoria informada é nula");
if(objeto.getTipo() == null) throw new NullPointerException("O tipo da categoria informada é nulo");
return objeto.getTipo();
}
@Override
public Categoria convertDe(String objeto)
{
if(objeto == null) throw new NullPointerException("O tipo da categoria informada é nulo");
List<Categoria> categorias = new CategoriaDAO().getPorCampo(Categoria.CAMPO_TIPO, Dao.EQUALS, objeto);
if(categorias.isEmpty()) throw new RegistroNaoEncontradoException("A categoria do tipo ["+objeto+"] não foi encontrada !");
return categorias.get(0);
}
}
[color=red]TAG[/color]
<%@ tag language="java" pageEncoding="ISO-8859-1"%>
<!-- TAGLIBS -->
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!-- ATRIBUTOS -->
<%@ attribute name="id" required="false" %>
<%@ attribute name="dados" required="true" type="java.util.List" %>
<%@ attribute name="conversor" required="true" type="br.com.ggdio.receitas.conversor.Conversor" %>
<%@ attribute name="name" required="false" %>
<!-- URL's -->
<c:url value="/resources/jquery/JQuery.js" var="jquery"/>
<c:url value="/resources/bootstrap/js/bootstrap.js" var="bootstrap_js"/>
<!-- IMPORT JQUERY+BOOTSTRAP -->
<script type="text/javascript" src="${jquery}"></script>
<script type="text/javascript" src="${bootstrap_js}"></script>
<!-- COMBOBOX HTML -->
<select id="${id}" class="combobox" name="${name}">
<option></option>
<c:forEach items="${dados}" var="dado">
<option>${conversor.converterPara(dado)}</option>
</c:forEach>
</select>
<!-- COMBOBOX JAVASCRIPT -->
<script>
$(document).ready(function()
{
$('.combobox').combobox();
});
</script>
E finalmente, a chamada da TAG:
//A EL deve chamar os dados vindos do controlador...no caso o controlador envia o conversor e a lista de dados
<tag:combobox dados="${valores}" conversor="${conversor}" id="cbCategoria" name="categoria"/><br/>