随笔 - 49  文章 - 0 评论 - 207 trackbacks - 6
<2008年4月>
303112345
6789101112
13141516171819
20212223242526
27282930123
45678910

严正声明 : 本站文章转载请注明出处.

与我联系

搜索

 

留言簿(11)

我的标签

随笔分类

随笔档案

Atlas相关

积分与排名

  • 积分 - 56745
  • 排名 - 779

阅读排行榜

最近越来越讨厌Aspx和WebControl了, 发现用模版引擎再加上JS就可以做出很好的东西了, 前段时候研究了jQuery, 用它来开发Ajax 应用真是得心应手. StringTemplate 看起来好象也不错, 正好今天有空,拿来看了一下,正好园子里这方面的资料不是很多, 写出来与大家分享,搞了一整天,累死我了;( 下面是我的笔记,可能写得有点乱,请大家包含, 全部文件打包在这里下载

这个工程在沙加的神舟本上 VS2008(WebApplication)+.Net2.0环境下调试完成. 我在代码里面有比较详细的注释和说明希望对大家有所帮助.

下面发部分代码出来:
主要的模版文件 :
 
使用FileGroup读取的文件~~Hello $myname$
<br />$title; null="-1",  separator=" | "$
<br />
<h4>关于文件组</h4>
文件组还支持继承和接口实现,此为高级功能,详细内容参见官方文档.
<h4>用户信息</h4>
我们使用反射的方式来获取对象的属性,但是如何对日期这种数据类型执行格式化
?<br />
姓名 : $user.Name$
<br />
年龄 : $user.Age$
<br />
生日 : $user.Birthday$
<br />
女朋友 : $user.GirlFriend$
<br />
这里我们使用了一个中间的方法来返回我们想要的日期形式, 短日期的生日 : $user.ShortBirthday$
<br />
<h4>在访问属性时可以使用适配器模式来实现转换 st.SetAttribute("person"new Connector(p));</h4>
比如你的Person对象只有一个叫Name的属性,但是模版里面写的是$myname$, 这样就可以在Connector中写一个方法叫get_myname() 返回这个实
例的Name属性 :
public class Connector<br />
{<br />
    Person _person;
public Connector(Person p)<br />
<br />
    _person 
= p;<br />
}
<br />
public string get_myname()<br />
{<br />
    
return _person.Name;
}
<br />
}
<br /><br />
<h3>使用自动聚合Automatic Aggregate Creation</h3>
<hr />
$users:
{姓名, 年龄 : $users.Name$,$users.Age$}$
<br />
<br />
<h3>列表构造</h3>
<hr />
多值列表
<br />
$[mine,yours]$
<br />
在传入多个值之后,会把所有的mine列在一起显示,然后把所有的yours放在一起显示
<br /><br />
<h3>模版引用</h3>
<hr />
<h4>下面是一个登陆窗口, 来自loginform.st这个文件</h4>
$loginform()$
$loginform(message
="从行内的参数传递过来")$
$loginform(msg
=demovalue())$把模版内容作为参数.
<br />
<br />
<h3>使用匿名模版</h3>
<hr />
没搞懂怎么玩的,好象没啥用. 我们待会再来搞它.
<br />

<h3>使用穿透模式传递参数</h3>
<hr />
这个没啥好说的,假如你有个 a.st, 还有一个b.st, a.st在内容中引用b.st, 里面都含有一个叫
'name'的参数,默认情况下只有a.st会获取这个参数值.
要想两个模版都获取到参数值要使用
"SetPassThroughAttributes()"这个方法

<h3>对多值属性应用模版</h3>
<hr />
<h4>终于说到点有用的东西了, 假设我们需要一个简单的&lt;ul&gt;列表</h4>
我们把模版放在simple_list_item这个里面. 注意: 这个模版里面的it是关键字, 不需要预定义.
<br />
<ul>$custermers:simple_list_item()$</ul>

我们再来个嵌套,把列表的内容加粗. 这个加粗的模版是在代码中定义的.
<br />
这个是先加粗. 再把结果传入
<ul>$(custermers:bold()):simple_list_item()$</ul>
这次是依次调用
<hr />
<ul>$custermers:bold():simple_list_item()$</ul>
两种颜色交替显示的:
<hr />
$custermers:green(),blue();separator
=""$
<br /><br />
<h3>使用代码定义模版好象不太方便</h3>
<hr /><h4>这回再来看看匿名模版的作用</h4>
使用i0指定自动编号, 后面的数字表示起始位置.
<br />
$custermers:
{$i0$. $it$<br />}$
<h4>再来个完美点的一行解决问题的:</h4><br />
<ul>$custermers:{<strong>$it$</strong>}:{<li>$it$</li>}$</ul>
<h4>嗯,看起来好象还不错,但是我不想用这个该死的"挨踢": it,怎么办?</h4>
我们可以使用自定义的参数名, 象这样:
<br />
<ul>$custermers:{ n | <strong>$n$</strong>}:{ n | <li>$n$</li>}$</ul>
<h4>我还想加一个参数?</h4>
$qqs, nicknames :
{ n, p | $n$ : $p$</br /> }$
<br /><br />
<h3>那么现在来实战</h3>
<hr />
我们的目标是生成一个文章的列表.
<ul>
$articles : 
{ ar | <li><a href='/view.aspx?id=$ar.ID$'>$ar.Title$====createdDate : $ar.CreatedDate$</a>}$
</ul>



using System;
using System.Collections.Generic;
using System.Text;
using System.Web;
using Antlr.StringTemplate;
using System.IO;
using System.Collections;

namespace TET.Core.httphandlers
{
    
public class test_template_page : IHttpHandler
    
{
        
IHttpHandler Members
    }

}


 下面是前台输出的样子:
<html><head><style>h1,h2,h3{padding:3px;margin:0;color:maroon;}h4{padding:3px;margin:0;font-weight:bold;font-size:12px;}body