简单扩展让beetl HTML标签支持父子嵌套_html/css_WEB-ITnose
默认情况下,Beetl的html标签并不支持父子嵌套,就像类似jsp标签那样,父标签需要知道子标签的信息,子标签也需要知道父标签信息。但是beetl只需要简单扩展,就能完成嵌套标签支持。
首先看一个最终的使用效果,实现俩个html标签table.tag,tr.tag.可以在页面上这么用:
<#table data ="${userList}"><#tr class="3c" name="name"> 名称 </#tr></#table>
首先,需要扩展 HTMLTagSupportWrapper,这个类是html标签实现类,我们可以扩展此类来定制化需求,然后重新注册覆盖。因此实现类
public class HTMLNestTagSupportWrapper extends HTMLTagSupportWrapper{public void render(){....}}
HTMLNestTagSupportWrapper用到了TagNestContext类,这个类其实就是一个树形结构,记录了parent的Context,记录了当前tag信息,以及记录了子tag的Context,这样,每个tag都可以访问父tag或者子tag:代码如下
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.tag如何实现,tr仅仅实现了生成表头
<tr class="${class}">${tagBody}</tr>
<table>${tagBody}<% for(var item in data){%><tr><%var tag = getTagContext();var children = tag.children;for(var tdTagCtx in children){ print("<td>"); var tdTag = tdTagCtx.tag; var name = tdTag.tagName; var value = item[name]; print(value); println("</td>");}%></tr><%} %></table>

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

热门话题

本文讨论了HTML&lt; Progress&gt;元素,其目的,样式和与&lt; meter&gt;元素。主要重点是使用&lt; progress&gt;为了完成任务和LT;仪表&gt;对于stati

本文讨论了html&lt; datalist&gt;元素,通过提供自动完整建议,改善用户体验并减少错误来增强表格。Character计数:159

本文讨论了HTML&lt; meter&gt;元素,用于在一个范围内显示标量或分数值及其在Web开发中的常见应用。它区分了&lt; meter&gt;从&lt; progress&gt;和前

本文讨论了视口元标签,这对于移动设备上的响应式Web设计至关重要。它解释了如何正确使用确保最佳的内容缩放和用户交互,而滥用可能会导致设计和可访问性问题。

本文讨论了&lt; iframe&gt;将外部内容嵌入网页,其常见用途,安全风险以及诸如对象标签和API等替代方案的目的。

HTML适合初学者学习,因为它简单易学且能快速看到成果。1)HTML的学习曲线平缓,易于上手。2)只需掌握基本标签即可开始创建网页。3)灵活性高,可与CSS和JavaScript结合使用。4)丰富的学习资源和现代工具支持学习过程。

HTML定义网页结构,CSS负责样式和布局,JavaScript赋予动态交互。三者在网页开发中各司其职,共同构建丰富多彩的网站。

AnexampleOfAstartingTaginHtmlis,beginSaparagraph.startingTagSareEssentialInhtmlastheyInitiateEllements,defiteTheeTheErtypes,andarecrucialforsstructuringwebpages wepages webpages andConstructingthedom。
