デフォルトでは、Beetl の HTML タグは親子のネストをサポートしていません。jsp タグと同様に、親タグは子タグの情報を知っている必要があり、子タグも親タグの情報を知っている必要があります。しかし、beetl に必要なのは、ネストされたタグをサポートするための単純な拡張機能だけです。
まず、2 つの HTML タグ table.tag と tr.tag を実現する最終的な使用効果を見てみましょう。これらは次のようにページで使用できます:
<#table data ="${userList}"><#tr class="3c" name="name"> 名称 </#tr></#table>
public class HTMLNestTagSupportWrapper extends HTMLTagSupportWrapper{public void render(){....}}
public class TagNestContext {private Tag tag = null;private TagNestContext parent = null;private List<TagNestContext> children = null;public Tag getTag() { return tag;}public void setTag(Tag para) { this.tag = para;}public TagNestContext getParent() { return parent;}public void setParent(TagNestContext parent) { this.parent = parent;}public List<TagNestContext> getChildren() { if(children==null) children = new ArrayList<TagNestContext>(); return children;}public void setChildren(List<TagNestContext> children) { this.children = children;}}
public void render(){ HttpServletRequest request = (HttpServletRequest)this.ctx.getGlobal("request"); TagNestContext tnc = (TagNestContext)request.getAttribute("tagContext"); if(tnc==null){ tnc = new TagNestContext(); tnc.setTag(this); request.setAttribute("tagContext", tnc); super.render(); request.removeAttribute("tagContext"); }else{ TagNestContext child = new TagNestContext(); child.setParent(tnc); child.setTag(this); tnc.getChildren().add(child); request.setAttribute("tagContext", child); super.render(); //重新设置 request.setAttribute("tagContext", child.getParent()); }}public String getTagName(){ return (String)this.args[0];}public Object get(String attr){ Map map = (Map)this.args[1]; return map.get(attr);}
<tr class="${class}">${tagBody}</tr>