改进ASP语法打造更高效的模板语言II
在《改进ASP语法打造更高效的模板语言》一篇中,我介绍了DTL作为ASP扩展语法的模板语言所带来的优势之一:静态标签。在这一篇中,我将带你领略DTL的又一强势:模板标签。
让我们来看一个例子,假如我想输出以下内容:
int[] numbers = new int[] { 1, 2, 3, 4, 5 };
注意空格哦!这里的动态部分就是从1到5的这部分。模板要怎样写呢?可以这样:
int[] numbers = new int[] { <%
for (int i = 1; i <= 5; i++) {
if (i < 5) {
<%!
<%=i%>,
!%>
} else {
<%!
<%=i%>
!%>
}
}
%> };
嗯,可以是可以,不过我总觉得这样的可读性较差,如果可以在动态模板中方便的使用动态模板该多好啊,那样的话我就可以简单的这样写了:
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%>
!%>
}
}
#%>
<%# 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.
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掉了,所以如果你想让你的体验更愉快的话,请随时获取最新的源代码自行编译。