惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

C
CXSECURITY Database RSS Feed - CXSecurity.com
Stack Overflow Blog
Stack Overflow Blog
月光博客
月光博客
T
Threat Research - Cisco Blogs
小众软件
小众软件
有赞技术团队
有赞技术团队
酷 壳 – CoolShell
酷 壳 – CoolShell
Apple Machine Learning Research
Apple Machine Learning Research
C
Cyber Attacks, Cyber Crime and Cyber Security
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
T
Tailwind CSS Blog
Cisco Talos Blog
Cisco Talos Blog
V
V2EX
博客园 - 【当耐特】
C
Cybersecurity and Infrastructure Security Agency CISA
Hugging Face - Blog
Hugging Face - Blog
The Cloudflare Blog
The Last Watchdog
The Last Watchdog
Simon Willison's Weblog
Simon Willison's Weblog
T
Threatpost
S
Secure Thoughts
O
OpenAI News
P
Proofpoint News Feed
S
SegmentFault 最新的问题
Forbes - Security
Forbes - Security
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
Application and Cybersecurity Blog
Application and Cybersecurity Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Last Week in AI
Last Week in AI
宝玉的分享
宝玉的分享
Scott Helme
Scott Helme
T
Tenable Blog
A
Arctic Wolf
L
LINUX DO - 热门话题
爱范儿
爱范儿
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
www.infosecurity-magazine.com
www.infosecurity-magazine.com
V
Visual Studio Blog
Hacker News: Ask HN
Hacker News: Ask HN
Hacker News - Newest:
Hacker News - Newest: "LLM"
腾讯CDC
博客园 - Franky
WordPress大学
WordPress大学
Know Your Adversary
Know Your Adversary
博客园_首页
雷峰网
雷峰网
IT之家
IT之家
PCI Perspectives
PCI Perspectives
L
LINUX DO - 最新话题
H
Heimdal Security Blog

博客园 - Cavingdeep

用metaclass实现AOP风格的Profiler Singleton implementation using metaclass 初试IronPython与.NET的集成 Refactoring as a way to improve the existing design 用metaclass来实现AOP 不该用Generics实现Abstract Factory的理由 新兴XML处理方法VTD-XML介绍 Performance Tips I DCG 2.0.72 (Beta1) 发布了 NUnit发布2.2.3兼容.NET 2.0 RTM 如果你想拥有一个可嵌入式模板引擎…… 改进ASP语法打造更高效的模板语言 XML的特征以及一些用途 Release of DbHelper 1.2.1 深入XML系列技术 DbHelper at Tigris SQLite系列 集合的初始容量与性能 DbHelper basic usage
改进ASP语法打造更高效的模板语言II
Cavingdeep · 2005-11-12 · via 博客园 - Cavingdeep

《改进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掉了,所以如果你想让你的体验更愉快的话,请随时获取最新的源代码自行编译。