collections - Component to iterate and render a nested tree-like object structure in JSF -
given class definition below:
public class comment { string username; string comment; list<comment> replies; // ... }
is possible use construct jsf page renders data contained in comment
instance in tree structure follows?
comments userone said blah blah ---- userthree replied blah blah blah ---- userthree replied blah blah blah ---- usertwo said blah blah ---- userone said blah blah
if nesting 1 level deep, or has fixed amount of maximum depth, nest jsf repeater components <ui:repeat>
or <h:datatable>
in each other usual way.
<ul> <ui:repeat value="#{bean.comments}" var="comment"> <li>#{comment.username} #{comment.comment} <ul> <ui:repeat value="#{comment.replies}" var="reply"> <li>#{reply.username} #{reply.comment}</li> </ui:repeat> </ul> </li> </ui:repeat> </ul>
but if nesting level "unlimited", need jsf component instead can render tree hierarchy. not available in standard jsf component set. you'd need @ 3rd party component libraries primefaces <p:tree>
, or richfaces <rich:tree>
, or omnifaces <o:tree>
. omnifaces 1 allows have full control on tree markup, while others you'd possibly need fiddle css want.
<o:tree value="#{bean.comments}" var="comment"> <o:treenode> <ul> <o:treenodeitem> <li>#{comment.username} #{comment.comment} <o:treeinsertchildren /> </li> </o:treenodeitem> </ul> </o:treenode> </o:tree>
i'd clarity rename string comment
property message
or text
orso.
if you're on jsf 2.x, consider <my:comments comment="#{bean.comments}">
composite component below.
<cc:interface componenttype="commentscomposite"> <cc:attribute name="comment" type="com.example.comment" required="true" /> </cc:interface> <cc:implementation> <c:if test="#{not empty cc.comment.replies}"> <ul> <c:foreach items="#{cc.comment.replies}" var="comment" varstatus="loop"> <li> #{comment.username} #{comment.comment} <my:comments comment="#{cc.parent.comment.replies[loop.index]}" /> </li> </c:foreach> </ul> </c:if> </cc:implementation>
@facescomponent("commentscomposite") public class commentscomposite extends uinamingcontainer { private comment comment; @override public void setvalueexpression(string name, valueexpression expression) { if ("comment".equals(name)) { setcomment((comment) expression.getvalue(getfacescontext().getelcontext())); } else { super.setvalueexpression(name, expression); } } public comment getcomment() { return comment; } public void setcomment(comment comment) { this.comment = comment; } }
see blog on subject, recursive tree of composite components.
Comments
Post a Comment