Display Tag Lib - Filtro

Eu tenho uma lista com diversas areas e algumas são areas mestres e outras são subareas dessas areas por exemplo:

Area mestre: Tech
Subareas: DEV, WEB, Direct e Design

Area mestre: Administrativo
Subareas: RH, TIC, ADM, Financeiro

Oque eu queria era usa a display tag para exibir varias tabelas. Cada tabela contendo a area mestre e apenas suas subareas. Como posso fazer esse filtro?

Eu ja tive meio que uma ideia mas não consegui implementar.

Seria setar um atributo apenas com as areas mestre, e então usaria o forEach para fazer as tabelas, e setaria tambem um atributo com todas as areas. Ai na hora de criar a tabela eu filtraria p saber se o id que referencia a area mestre é igual ao id da area mestre que esta sendo usado na tabela.

Mas não consegui fazer isso? VOcês tem alguma ideia de como fazer?? É possivel?? Me ajudem por favor.

Muito Obrigado

Pelo que eu entendi

É só você colocar esses dados nos objetos e dentro desses objetos listas com as sub áreas

ai pra cada objeto vc cria uma tabela contendo os dados das listas

A ideia foi otima. Valew

Mas eu ainda estou com um pequeno problema que não consegui identificar ou talvez eu esteja fazendo da maneira errada. Quando eu executo ele retorna esse erro:

[code]org.apache.jasper.JasperException: An exception occurred processing JSP page /admin/busca/sAreas.jsp at line 57

54:
55:


56: <c:forEach items="${area}">
57: <display:table name="${area.subs}" export=“true” >
58: <display:column property=“nome” title=“Nome” />
59: <display:column media=“html” >
60:

Stacktrace:
org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:505)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:416)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:342)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:267)
javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:390)
org.apache.struts.action.RequestProcessor.doForward(RequestProcessor.java:1085)
org.apache.struts.tiles.TilesRequestProcessor.doForward(TilesRequestProcessor.java:263)
org.apache.struts.action.RequestProcessor.processForwardConfig(RequestProcessor.java:398)
org.apache.struts.tiles.TilesRequestProcessor.processForwardConfig(TilesRequestProcessor.java:318)
org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:241)
org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196)
org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:414)
javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:390)

root cause

java.lang.NumberFormatException: For input string: “subs”
java.lang.NumberFormatException.forInputString(NumberFormatException.java:48)
java.lang.Integer.parseInt(Integer.java:447)
java.lang.Integer.parseInt(Integer.java:497)
javax.el.ListELResolver.coerce(ListELResolver.java:166)
javax.el.ListELResolver.getValue(ListELResolver.java:51)
javax.el.CompositeELResolver.getValue(CompositeELResolver.java:53)
org.apache.el.parser.AstValue.getValue(AstValue.java:118)
org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:186)
org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate(PageContextImpl.java:925)
org.apache.jsp.admin.busca.sAreas_jsp._jspx_meth_display_005ftable_005f0(sAreas_jsp.java:336)
org.apache.jsp.admin.busca.sAreas_jsp._jspx_meth_c_005fforEach_005f0(sAreas_jsp.java:304)
org.apache.jsp.admin.busca.sAreas_jsp._jspx_meth_html_005fhtml_005f0(sAreas_jsp.java:171)
org.apache.jsp.admin.busca.sAreas_jsp._jspService(sAreas_jsp.java:93)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:374)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:342)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:267)
javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:390)
org.apache.struts.action.RequestProcessor.doForward(RequestProcessor.java:1085)
org.apache.struts.tiles.TilesRequestProcessor.doForward(TilesRequestProcessor.java:263)
org.apache.struts.action.RequestProcessor.processForwardConfig(RequestProcessor.java:398)
org.apache.struts.tiles.TilesRequestProcessor.processForwardConfig(TilesRequestProcessor.java:318)
org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:241)
org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196)
org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:414)
javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:390)
[/code]

As classe envolvidas são essas:

Action:

[code]public class AreaAction extends Action {

@Override
public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {

    HttpSession session = request.getSession();

    DaoFactory dao = new DaoFactory();
    //pega todas as areas do BD
    ArrayList<Area> area = dao.getAreaDAO().readAll();
    dao.close();
    ArrayList<Area> arrange = new ArrayList<Area>();

    //verifica se é mestre, seta as subareas e adiciona em um novo ArrayList
    for (Area a : area) {
        if (a.getArea() == null) {
            a.setSubs();
            arrange.add(a);
        }
    }
    
    session.setAttribute("area", arrange);
    return mapping.findForward("area");
}[/code]

Model Area

[code]@Entity
@Table(name = “area”)
public class Area implements java.io.Serializable {

@Id
@GeneratedValue
private String id;
private String nome;
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "area")
@Fetch(FetchMode.JOIN)
@Cascade(CascadeType.SAVE_UPDATE)
private Area area;
@OneToMany(mappedBy = "area", fetch = FetchType.LAZY)
@Cascade(CascadeType.ALL)
private Collection<Usuarios> usuarios;
@OneToMany(mappedBy = "area", fetch = FetchType.LAZY)
@Cascade(CascadeType.ALL)
private Collection<Area> subareas;
@Transient
private ArrayList<Area> subs;

public ArrayList<Area> getSubs() {
    return subs;
}

//seta a subarea caso seja area mestre
public void setSubs() {
    DaoFactory dao = new DaoFactory();
    ArrayList<Area> areas = dao.getAreaDAO().readAll();
    dao.close();
    this.subs = new ArrayList<Area>();
    for (Area a : areas) {
        if (a.getArea() != null) {
            if (this.id.equals(a.getArea().getId())) {
                this.subs.add(a);
            }
        }
    }
}[/code]

E a tabela (Display Tag):

<c:forEach items="${area}"> <display:table name="${area.subs}" export="true" > <display:column property="nome" title="Nome" /> <display:column media="html" > <div id="cad"> <html:form action="/altUser.do" > <html:radio property="btenviar" value="Alterar" >Alterar</html:radio> <html:radio property="btenviar" value="Excluir" >Excluir</html:radio> <html:hidden property="area.id" value="${area.id}" /> <span class="botao"> <html:submit value="Ok" /> </span> </html:form> </div> </display:column> </display:table> </c:forEach>

Oque pode estar retornando essa excessão? Como posso resolver??

Obrigado

tenta tirar o simbolo de jstl do nome da tabela

se eu não me engano não precisa

ele encontra apenas com o nome da lista igual o da tabela

O nome do bean é area??

edit:

acho que é a anotação transient na sua lista de sub áreas que está causando o erro

Vou ver se da certo sua dica e ver no que da.

Essa anotação serve apenas para indicar ao hibernate que a variavel não pertence ao BD

Não deu certo =/

E nao vejo um meio de tirar essa anotação. Se não o hibernate ira interpretar como atributo do BD.

Fiz um debug e verifiquei que esta tudo correto. As subareas são setadas corretamente, porem não consigo exibi-las.

Alguma outra ideia?

você consegue exibir algo das sub áreas na página sem ser pela display tag??

Sim,

incluse com a display tag se eu setar como atributo antes. o problema esta sendo essa sublist

se você tirar a anotação de transient não funciona??

trava o hibernate porque ele não acha esse campo no banco

Acho que achei o erro

quando você usou o forEach, você esqueceu de definir uma variável para cada item da lista de objetos de área

assim quando você setou a sua sub área na tabela, você pegou a sub área de uma lista onde não foi informado a posição

<div id="table1">   
                <c:forEach items="${area}" var="a">   
                     <display:table name="${a.subs}" export="true" >   
                         <display:column property="nome" title="Nome" />                           
                         <display:column media="html" >   
                               <div id="cad">   

Espero que você entenda o que eu quis dizer, acho que fui meio cofuso

Perfeito cara.

Foi exatamente isso. Acho que preciso estudar um poko mais afundo essa taglib Core e oque para que serve cada atributo. Agora só preciso me virar com o CSS e com a condisção caso seja nulo. Mas isso eu me viro.

Valew mesmo

Abss