精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2006-03-07
robbin推荐了freemarker,大致看了一下,感觉基本上比jsp的好处就在于可以轻松自己定义macro,(对应于jsp的taglib)。 robbin列举的freemarker比jsp的好处在于: * freemarker简单易用 freemarker提供了一套非常简单,而且可以快速上手的模版语言,不论学习还是使用,都比掌握Webwork的JSP Tag要容易和快速。 * 作为view来说,freemarker功能要强大很多 freemarker提供了一整套built-in来扩展各种数据类型在页面上的显示格式,而JSP不具备这样的功能 * freemarker提供了强大的自定义macro功能 freemarker的macro可以让你自定义freemarker标记,提高页面可重用性,而JSP不具备这样的方面功能 * freemarker不依赖Servlet API 因此freemaker可以放在classpath路径下面,这样就可以支持模块开发和插件开发,请参考:webwork的模块化开发和tonic * freemarker报错可以准确定位到行和列 而JSP只有在特定的AppServer(Resin)下面才支持,大部分AppServer下面,当JSP报错的时候,只能定位到JSP编译后的Servlet行数,给查错带来很大的不便。 * freemarker不需要预编译 JSP在第一次访问的时候需要预编译为Servlet Class,这个过程在开发的时候,会让人感觉很不方便,需要等待好一会,而freemarker则没有这样的问题 * freemarker原生支持webwork tag 因此具有webwork JSP Tag的所有的功能 freemarker的格式显示。不知道robbin是不是指对date, number的固定格式输出?这些jsp做不到么?不可以用DateFormat, NumberFormat来搞么? Jet把基本的dateformat和numberformat都搞成了函数。希望能够达到freemarker的简单程度?(后面的例子里会看到) freemarker不依赖servlet api。这条怎么解释呢?是不是说freemarker的文件可以被classloader所加载,不需要被特殊部署于servlet容器中? Jet也是这样的。 freemarker和Jet都不需要额外的编译,所以错误定位都同样直接准确。 freemarker的macro,感觉就是一个自制的函数系统了吧。这个可是jet的强项。jet不但可以任意定义freemarker里面的函数,还可以定义高阶函数。也就是说,macro可以当作其它macro的参数,也可以作为其它macro的返回值。这点不知道freemarker做不做得到? 下面是一个简单的例子,假设data model里面有一个title的值是"Book List",有一个books列表,值是["Learning Jaskell", "Jet & Jaskell"], 下面的jet文件用来生成html: $$<< <html> ${tag "title" title} <body> ${b title}: $br <table> <tr> ${sequence ["name", "price", "isbn"] th} </tr> ${sequence books \p->tr[html.escape(p.name);, asmoney(p.price);, p.isbn]} </table> </body> </html> >>$$ where asmoney n = "$" + format {pattern="##.00"} n; end "$$<<"和">>$$"之间扩着需要生成的字符串。模板功能由jaskell的string interpolation来实现。 tag, b, br, sequence, th, tr, format, escape等都是预定义的函数。 tag用来声称任意的tag。b, br, th, tr都生成对应的html tag。 format用来做数字和日期的格式化。 sequence负责把一个列表的东西顺序地生成字符串并放入最终的结果。 escape负责对任意的字符串作html转义操作。 因为Jet用的是Jaskell脚本语言,所以得以利用所有函数式脚本的功能,也不需要象freemarker一样自己发明一套语法和语义出来。 生成的html如下: <html> <title>Book List</title> <body> <b>Book List</b>: <br> <table> <tr> <th>name</th><th>price</th><th>isbn</th> </tr> <tr> <td>Learning Jaskell</td><td>$50.30</td><td>ASD9097BS768D9c</td> </tr> <tr> <td>Jet & amp; JSP</td><td>$30.00</td><td>87daCa089JCD</td> </tr> </table> </body> </html> 我在web表示层还是个菜鸟。关于Jet只是一个粗浅的想法。很有可能漏掉了freemarker的非常重要的功能。欢迎大家不吝赐教。 ![]() 英文文档以及api: http://docs.codehaus.org/display/JASKELL/Jet 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2006-03-07
引用 freemarker的macro,感觉就是一个自制的函数系统了吧。这个可是jet的强项。jet不但可以任意定义freemarker里面的函数,还可以定义高阶函数。也就是说,macro可以当作其它macro的参数,也可以作为其它macro的返回值。这点不知道freemarker做不做得到?
默认是不可以的,我有hack freemarker的代码,让Macro实现TemplateModel就可以了 |
|
返回顶楼 | |
发表时间:2006-03-07
JSP也可以在页面定义函数。
|
|
返回顶楼 | |
发表时间:2006-03-07
zzeric 写道 JSP也可以在页面定义函数。
呵呵。那是我孤陋了。能不能给了连接或者例子?要是jsp也能方便地定义函数,就不大看出来freemarker比jsp强多少了。 |
|
返回顶楼 | |
发表时间:2006-03-08
ajoo 写道 zzeric 写道 JSP也可以在页面定义函数。
呵呵。那是我孤陋了。能不能给了连接或者例子?要是jsp也能方便地定义函数,就不大看出来freemarker比jsp强多少了。 封装成javabean不行吗?要不直接就在jsp中写javacode 要说功能强大,jsp几乎是强大过头的了,看你怎么用咯 |
|
返回顶楼 | |
发表时间:2006-03-08
javabean里面包含显示逻辑吗?好像不好吧?而且也不方便。
在jsp里面直接写一次性的java代码可以,写个可以重用的函数怎么写法? |
|
返回顶楼 | |
发表时间:2006-03-08
<%!
public int sum(int a,int b) { return a + b; } %> 不过只能同一页面内重用,除非做成一个单独的文件用include加到不同的页面 |
|
返回顶楼 | |
发表时间:2006-03-08
哦,确实不知道可以这么用。这个sum就被翻译成这个servlet的一个成员函数了?
只不过,这个函数用来重用显示逻辑还是比较笨重啊。比如象freemarker那样,写一个repeat函数,可以repeat任意的html片断,甚至可以重复调用其它的函数以及custom tag,就做不到了吧? 再比如象jet里面的这个: sequence ["name", "price", "isbn"] th th是个函数,th "abc"就返回<th>abc</th> sequence也是一个函数,它对一个list里面的每一个成员调用后面当作参数传递进来的th函数,最终结果就是生成一个<th>name</th><th>price</th><th>isbn</th> 这种sequence函数用jsp写是要累死的吧? jsp的这个函数主要还是重用一些纯粹的业务逻辑,可是业务逻辑在server page里面本来就是要尽量避免的呀。 |
|
返回顶楼 | |
发表时间:2006-03-08
引用 这种sequence函数用jsp写是要累死的吧?
这么写 xx.sequence( new String[]{"name","price","isbn"},new ThFunction(writer) ) |
|
返回顶楼 | |
发表时间:2006-03-08
各位大哥,把本来简简单单的模板搞那么复杂,有必要吗?
|
|
返回顶楼 | |