改进ASP语法打造更高效的模板语言II

本文深入探讨了DTL模板语言的两大特性:静态标签和模板标签。通过具体示例展示了如何利用这些特性提高模板的可读性和重用性,类似于XSLT中的template标签。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

《改进ASP语法打造更高效的模板语言》一篇中,我介绍了DTL作为ASP扩展语法的模板语言所带来的优势之一:静态标签。在这一篇中,我将带你领略DTL的又一强势:模板标签。

让我们来看一个例子,假如我想输出以下内容:

ExpandedBlockStart.gif ContractedBlock.gif int [] numbers  =   new   int []  dot.gif 12345 } ;

注意空格哦!这里的动态部分就是从1到5的这部分。模板要怎样写呢?可以这样:

ExpandedBlockStart.gif ContractedBlock.gif int [] numbers  =   new   int []  dot.gif <%
ExpandedSubBlockStart.gifContractedSubBlock.gif
for (int i = 1; i <= 5; i++dot.gif{
ExpandedSubBlockStart.gifContractedSubBlock.gif   
if (i < 5dot.gif{
InBlock.gif      
<%!
InBlock.gif      
<%=i%>
InBlock.gif      
!%>
ExpandedSubBlockStart.gifContractedSubBlock.gif   }
 else dot.gif{
InBlock.gif      
<%!
InBlock.gif      
<%=i%>
InBlock.gif      
!%>
ExpandedSubBlockEnd.gif   }

ExpandedSubBlockEnd.gif}

ExpandedBlockEnd.gif
%> }
;

嗯,可以是可以,不过我总觉得这样的可读性较差,如果可以在动态模板中方便的使用动态模板该多好啊,那样的话我就可以简单的这样写了:

ExpandedBlockStart.gif ContractedBlock.gif int [] numbers  =   new   int []  dot.gif <%=template1=%> } ;
None.gif
None.gif
<% # template1
ExpandedBlockStart.gifContractedBlock.gif
for  ( int  i  =   1 ; i  <=   5 ; i ++ dot.gif {
ExpandedSubBlockStart.gifContractedSubBlock.gif   
if (i < 5dot.gif{
InBlock.gif      
<%!
InBlock.gif      
<%=i%>
InBlock.gif      
!%>
ExpandedSubBlockStart.gifContractedSubBlock.gif   }
 else dot.gif{
InBlock.gif      
<%!
InBlock.gif      
<%=i%>
InBlock.gif      
!%>
ExpandedSubBlockEnd.gif   }

ExpandedBlockEnd.gif}

None.gif#
%>

呵呵,不错,就是这个样子,这就是我想要的。嗯,<%# templateName #%>就是所谓的模板标签,它定义了一个动态模板,<%=templateName=%>就是模板引用,将被引用的模板结果输出到引用位置上。

这下清晰多了,而且模板可以被多个地方引用,达到一定程度上的可重用性。这套机制酷似XSLT中的template标签,不过没有模板参数等的定义。也许你会问:“那我可以传参数给模板标签吗?”可以,不过准确的说不是你手动传,是自动传的。换句话说,模板引用是一个Closure,模板标签中的内容在运行时会自动获得所有模板引用当前的上下文。比如如下示例:

None.gif <% # t1
ExpandedBlockStart.gifContractedBlock.gif   
if  (var)  dot.gif {
InBlock.gif      
<%!
InBlock.gif      OK
InBlock.gif      
!%>
ExpandedBlockStart.gifContractedBlock.gif   }
  else   dot.gif {
InBlock.gif      
<%!
InBlock.gif      oh, no
InBlock.gif      
!%>
ExpandedBlockEnd.gif   }

None.gif#
%>
None.gif
<%
None.gif   
bool  var  =   true ;
None.gif   
<%!
None.gif   First time call
' s result is <%=t1=%>.
None.gif
   
None.gif   
!%>
None.gif   
None.gif   var 
=   false ;
None.gif   
<%!
None.gif   Second time call
' s result is <%=t1=%>.
None.gif
    !%>
None.gif
%>
None.gif
None.gif输出为:
None.gifFirst time call
' s result is OK.
None.gif
Second time call ' s result is oh, no.

好了,这篇的内容就介绍完了,不知道我所描述的这两大DTL语法有没有引起你的足够兴趣,再次说明一下,如果你已经感兴趣了的话,可以自己下载试一下哦。在《改进ASP语法打造更高效的模板语言》一篇中有相关链接。

截止今日,又有一些小bug被fix掉了,所以如果你想让你的体验更愉快的话,请随时获取最新的源代码自行编译。

转载于:https://www.cnblogs.com/cavingdeep/archive/2005/11/12/274802.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值