tpl是witrix开发平台中的动态xml标签技术,其基本特点表现为如下三个方面:
1. 执行能力
xml本身只是对数据的描述,而没有循环和判断的能力。
在tpl中<c:forEach>和<c:if>标签可以完成程序语言的执行功能,并定义了<c:tile>, <c:iif>等更方便的标签。
2. 抽象能力
获得抽象能力,首要的一点是使得创建新概念的成本极低。很少有人大量开发jsp tag,原因就是开发tag过于麻烦,而且调整不方便。另外开发出的tag如果粒度太小,大量使用的时候是对性能的致命伤害。
tpl首先需要经过编译,而不是象jsp tag那样完全动态运行,而且tpl编译出的结果是无状态的,因此解决了性能上的问题。
在tpl中导入外部模板的语法非常简单,可以实现基本的分解
<c:include src="xxx.tpl" />
更重要的是,tpl中定义了完善的库机制。
使用库
<!-- 导入外部包, 导入时指定名字空间为demo。
注意tpl中并没有完整的名字空间支持,只能作为qName使用
-->
<c:lib src="demo_lib.xml" namespace="demo" />
<!-- 对具有cache:timeout属性的节点应用cache修饰,即该节点的运行内容被缓存 -->
<c:decorator type="cache" match="//@[cache:timeout]" />
<div id="blockA">
<p>通过tpl:tag属性可以设定宿主标签的真实标签名。这种做法可以方便可视化设计:</p>
<input tpl:tag="demo:文本框" value="in block A"
otherValue="${varInJsp}" onclick="clickOnBtn()"/>
</div>
<div id="blockB">
<p>分页表格:</p>
<img tpl:tag="demo:分页表格" headers="fieldA,fieldB" pager="${pager}" />
</div>
<div id="blockC">
<p>bodyTag标签的调用:</p>
<demo:循环data>
<input type="text" value="${row}" /> <br/>
</demo:循环data>
</div>
<div id="blockD" cache:timeout="1000s" >
<p>条件标签的调用:</p>
<demo:当Num足够大>
<p>当 thisObj中的变量 'num' 的值大于3的时候显示这句话 </p>
</demo:当Num足够大>
</div>
定义库文件demo_lib.xml
<!--
自定义标签的属性:
type: simpleTag, bodyTag 或者 conditionTag, 缺省为simpleTag
importVars : 每个自定义标签具有自己的变量空间,需要通过importVars来明确指定从外部变量空间中导入的变量。
demandArgs: 调用时必须明确给出这些参数的值
otherArgs: 如果指定了该参数,则调用自定义标签时能够使用的参数就必须在demandArgs和otherArgs指定的范围之内。
-->
<demo>
<!-- 一个简单的tag示例, 直接输出变量。这里demandArgs指定调用时必须提供的变量。 -->
<文本框 demandArgs="value" otherArgs="otherValue,onclick" type="simpleTag" >
<p> ----------------------------------- </p>
<!-- 可以使用调用时提供的其他变量,如otherValue-->
<input size="40" type="text" value="${value} * ${otherValue}" onclick="${onclick}"/>
<p> -----------------------------------</p>
</文本框>
<!-- 一个自动分页表格,要求传入headers(List类型)指定表头,pager(Pager类型)提供数据 -->
<分页表格 demandArgs="headers,pager">
<!-- 从外部导入tpl文件 -->
<c:include src="flex_table.tpl" />
</分页表格>
<!-- 一个bodyTag示例: 循环处理thisObj中的变量data中的每一行。
importVars从调用环境中自动导入变量而不需要通过调用参数直接指定。
当然如果调用参数中指定的变量与importVars中指定的变量重复,则调用参数会覆盖importVars.
-->
<循环data importVars="thisObj" type="bodyTag">
<c:forEach var="row" items="${data}">
<!-- tagBody为调用时标签的内容 -->
<cp:compile src="${tagBody}" />
</c:forEach>
</循环data>
<!-- 一个条件标签的示例.
条件标签一般不应该输出文本,而是返回一个bool值。仅当返回true的时候,调用时标签的内容才会被运行。
-->
<当Num足够大 importVars="thisObj" type="conditionTag">
<l:gt name="num" value="3" />
</当Num足够大>
</demo>
注
意到bodyTag和conditionTag使得我们可以将循环(容器)逻辑和判断逻辑抽象成有意义的概念,而不再是一些执行的指令。这种抽象能力的应
用非常依赖于xml的自描述特性,我们不需要付出太大的努力,就可以在lib中封装出一个有意义的概念来!
而且tag的参数可以指定,可以缺省,存在多种选择,也对应着多种逻辑模型。
通过<c:decorator>的用法可以看到,因为xml明确定义了结构,使得我们可以轻易的实施类似AOP的功能。
3. 集成能力
首先,tpl完全符合xml规范,与xml世界接轨,可以自由的使用xslt。例如,在
任何标签中都可以指定tpl:xdecorator属性, tpl在编译之前首先会应用指定的xslt文件进行变换,对变换后的结果再进行编译。
<anyTagName tpl:xdecorator="some_xslt.xslt">
...
</anyTagName>
其次,tpl可以使用属性标记,即tpl标签不仅仅可以通过标签名来标识,而且可以通过tpl:tag属性来标识。例如:
<input tpl:decorator="demo:文本框" />
与 <demo:文本框 />等效。
这种做法避免了tpl侵入html模型,使得我们可以利用现有工具对tpl进行所见即所得(WISIWIG)的设计。
再次, 在tpl中使用EL(Expression Language)语言,集成java数据模型。
第四, 在tpl中可以采用如下方式实现强类型化,完成与java的接口。
interface ITest{
void test(String name, int value);
}
<o:class name="MyClass" implements="ITest">
<test args="name,value" >
...
</test>
</o:class>
这种能力可以在数据源的filter中使用。
第五, tpl可以轻易的集成其它xml技术。例如,tpl集成了ant
<ant:run>
<echo message="xxx" />
</ant:run>
因此,我们立刻拥有了ant的数千个功能标签。
分享到:
相关推荐
#将html模板转化为javascript模块 ##目的 减轻前端拼接大量HTML以及维护时候的困难程度 ##安装 安装node,参见: 安装npm,参见: 安装tpl npm方式: $ npm install tpl2js -g 源码方式: $ cd ~ $ git clone git...
它使用将模板转换为 javascript。特征更有力设置Tpl 取决于 。 有一种安装 Node.js 的好方法,您可以访问了解更多详细信息。 以下Tpl设置在 Tpl/Tpl.sublime-settings 中可用(默认如下所示)。有我的 nodejs 和 tpl...
- **MVC设计**: ShopNC B2B2C商城采用了MVC(Model-View-Controller)模式进行开发,这种模式使得系统的开发更加高效,各部分结构更为清晰。 - **模型(Model)**: 定义了数据访问逻辑,由Model类来实现。 - **控制...
“tpl:tpl-用于C的小型二进制序列化库”这个标题提到了一个名为“tpl”的库,它是一个专门针对C语言设计的轻量级二进制序列化工具。序列化是将数据结构或对象转换为可以存储或传输的格式的过程,而二进制序列化则是...
“TPL:任务,TPL,PLINQ”这一标题暗示了我们要讨论的是.NET框架中的并行编程技术,主要包括Task Parallel Library(TPL),以及与之相关的并行LINQ(Parallel LINQ,简称PLINQ)。 **Task Parallel Library(TPL...
(未发布,仅在进行中) 模板实验。 React。 function App ( props ) { // some suspense calls, hooks, whatever let count = visitors . read ( ) ; return tpl ` <style> h1 { color:red; } <...
tpl 基于字符串的模版引擎 用法 let tpl = ` 小明是个老师,他的名字叫做{{name}}, 今年{{year}}岁。 他有学生{{student.length}}个。 {{#student}} 学生 ==> {{name}} <span>{{#girls}} 年龄: {{age}} ...
TPL521 中文资料 光耦 TPL521 是一款可控制的光电耦合器件,广泛应用在电脑终端机、可控硅系统设备、测量仪器、影印机、自动售票、家用电器等领域,旨在实现信号传输的隔离,以增加安全性、减小电路干扰、减化电路...
"Yangon-tpl:仰光模板" 是一个用于软件开发的模板项目,它可能是为了简化在特定编程语言或框架下的开发流程而设计的。虽然标签信息为空,但从标题来看,我们可以推断这是一个针对仰光(Yangon)地区的特定开发环境...
在本文中,我们将深入探讨 `Hyla_Tpl` 的核心概念、工作原理以及如何在实际项目中应用。 ### 一、模板引擎简介 模板引擎是 Web 开发中的一个重要组件,它允许开发者将 HTML 代码与 PHP 代码解耦,使前端设计人员...
标题中的“TPL0401数字电位器源码”是指使用STM32微控制器与TPL0401数字电位器进行交互的程序代码。STM32是一款基于ARM Cortex-M内核的微控制器,广泛应用于嵌入式系统设计。数字电位器,又称为数字 pot 或 DIP...
这些函数通常会使用TPL提供的接口,如`tpl_map`,`tpl_pack`,`tpl_unpack`等,将数据结构打包或解包。最后,调用这些函数进行实际的序列化或反序列化操作。 **4. 示例应用** 例如,假设我们有一个包含整数和字符串...
a06-tpl 快速初始化你的项目模版可以快速初始化你的项目模版,目前支持单页,和js库两种模版,后续会增加多页模版的支持安装npm install a06-tpl -g执行// 以xxx为项目名称初始化单页模版,也可以不输出项目名$ a06-tpl ...
下划线 underscore-tpl是一个插件,用于加载和预编译模板。 以下是一些,这些显示了渲染预编译模板时的区别。 用法 使用tpl! 加载模板时的前缀。... 该插件将在requirejs r.js优化器之后编译模板。 而且在开
"vant-mall-tpl:vant-ui商城模板" 是一个基于Vant UI的电子商务网站模板,专为快速构建前端商场界面而设计。这个模板利用了Vant UI组件库,提供了丰富的UI元素和交互设计,帮助开发者高效地搭建功能完备、美观的...
"act-tpl:活动模板" 是一个用于创建活动页面的模板项目,主要包含了一系列前端资源文件,便于快速构建和维护活动页面。这个模板项目的主要特点和相关知识点如下: 1. **目录结构**: - `css`:这个目录用于存储CSS...
根据提供的文件信息,我们可以梳理...通过以上步骤,我们可以有效地在Oracle数据库中进行用户管理、表空间管理和数据的导入导出操作。这些操作对于数据库的日常维护非常重要,能够帮助我们更好地管理和利用数据库资源。
生成器-简单-npm-tpl一个生成指定npm包目录结构的generator安装首先,使用安装和generator-easy-npm-tpl(我们假设您已经预装了 )。 npm install -g yonpm install -g generator-easy-npm-tpl 然后生成您的新项目:...
tpl: { wrap: ' class="dropify-wrapper"></div>', message: ' class="dropify-message"> class="file-icon" /> <p>{{ default }}</p></div>', preview: ' class="dropify-preview"> class=...
数字电位器TPL0501EVM是一款单通道、线性滑动的数字电位器,具备256个滑动位置。它可以作为三个端子的电位器使用,也可以作为两个端子的变阻器使用。TPL0501的终端间电阻为100kΩ,内部寄存器可以通过SPI兼容的接口...