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

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

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

int[] numbers = new int[] 12345 };

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

int[] numbers = new int[] <%
for (int i = 1; i <= 5; i++{
   
if (i < 5{
      
<%!
      
<%=i%>
      
!%>
   }
 else {
      
<%!
      
<%=i%>
      
!%>
   }

}

%> }
;

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

int[] numbers = new int[] <%=template1=%> };

<%# template1
for (int i = 1; i <= 5; i++{
   
if (i < 5{
      
<%!
      
<%=i%>
      
!%>
   }
 else {
      
<%!
      
<%=i%>
      
!%>
   }

}

#
%>

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

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

<%# t1
   
if (var) {
      
<%!
      OK
      
!%>
   }
 else {
      
<%!
      oh, no
      
!%>
   }

#
%>
<%
   
bool var = true;
   
<%!
   First time call
's result is <%=t1=%>.
   
   
!%>
   
   var 
= false;
   
<%!
   Second time call
's result is <%=t1=%>.
   !%>
%>

输出为:
First time call
's result is OK.
Second time call's result is oh, no.

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

截止今日,又有一些小bug被fix掉了,所以如果你想让你的体验更愉快的话,请随时获取最新的源代码自行编译。
posted @ 2005-11-12 17:29  Cavingdeep  阅读(1584)  评论(0编辑  收藏  举报