论坛首页 Java企业应用论坛

Jet - Jaskell Server Page

浏览 21747 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2006-03-09  
ajoo 写道

我在web表示层还是个菜鸟。关于Jet只是一个粗浅的想法。

嗯,绝对是个大菜鸟,而且一眼就看出来没有实际的web表示层经验......
首先,实际项目中,通常都是有基本的静态HTML页面(用来做prototype或者用户需求确认),除非UI非常简单的系统,很少上来就开始用模板语言直接写页面的,以你的例子来说,先有一个静态的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>jet? drug?</td>
			<td>11.00</td>
			<td>ISBN-253-874</td>
		</tr>
	</table>
</body>
</html>


确认完毕以后,开始写代码了,只用稍微修改一下,翻译成JSP或者模本语言:
<html>
<title>
${title}
</title>
<body>
	<b>${title}</b>: <br/>
	<table>
		<tr>
			<th>name</th>
			<th>price</th>
			<th>isbn</th>
		</tr>
		<#list books as b>
		<tr>
			<td>${b.name?html}</td>
			<td>${b.price?string("##.00");}</td>
			<td>${b.isbn}</td>
		</tr>
		</#list>
	</table>
</body>
</html>

这样的代码和原先的html很类似,熟悉html的人,就马上能够想象出页面的排版,jet加上的tag这个标签,破坏了原有的html结构,根本是个鸡肋,给阅读带来困难。同样的,在jet里面用sequence添加html,也破坏html结构,导致可读性下降。虽然jet的代码量比较小,但是一个bad practice, 里面设计的tag, b, br,  th, tr等等函数也就没有什么用处。

所有的template language都是类似的,偶比较关心的是:
1. 学习成本 Freemarker > Jet
2. 性能    未知
3. 所提供的build-in渲染处理多样性和便捷性 Freemarker > Jet
0 请登录后投票
   发表时间:2006-03-09  
Readonly 写道

确认完毕以后,开始写代码了,只用稍微修改一下,翻译成JSP或者模本语言:
<html>
<title>
${title}
</title>
<body>
	<b>${title}</b>: <br/>
	<table>
		<tr>
			<th>name</th>
			<th>price</th>
			<th>isbn</th>
		</tr>
		<#list books as b>
		<tr>
			<td>${b.name?html}</td>
			<td>${b.price?string("##.00");}</td>
			<td>${b.isbn}</td>
		</tr>
		</#list>
	</table>
</body>
</html>

这样的代码和原先的html很类似,熟悉html的人,就马上能够想象出页面的排版

基本上就是说<#list>这种tag写法上比sequence函数更象html?
如果上面的东西用jet写,大概是这样:

${sequence books \b->$$<[
<tr>
  <td>${html.escape(b.name);}</td>
  <td>${fmt("##.00", b.price);}</td>
  <td>${b.isbn}</td>
</tr>
]>$$}

我承认可读性上比freemarker这种专门的template engine要差,就是不知道这个差别是不是致命。

引用
jet加上的tag这个标签,破坏了原有的html结构,根本是个鸡肋,给阅读带来困难。

有点武断。如果要我写上面的东西,尤其是当td非常多了之后,我肯定会选择refactor成:
${sequence books \b-> tr [html.escape(b.name);, fmt("##.00", b.price);, b.isbn]}

我想这里面有一个权衡的问题。不见得这种tr, td函数就永远没用。你那么写自然直观,但是代价是更长的代码。读写都比较费劲。


同样的,在jet里面用sequence添加html,也破坏html结构,导致可读性下降。

“破坏html结构”的意思就是说sequence跟<#list>不同,长得不象tag?这么说,freemarker的${}是不是也不如jsp的custom tag好了?

引用
虽然jet的代码量比较小,但是一个bad practice, 里面设计的tag, b, br,  th, tr等等函数也就没有什么用处

不知道,也许没用,也许有用。不过大不了不用它们,自己写tag就是了。
引用

1. 学习成本 Freemarker > Jet

你是说jet的学习成本大于freemarker吧?
我觉得,这个得两说。jet的学习成本都是jaskell这个general purpose的脚本语言的成本。jet本身没什么学习成本。就象jsp,大家说它的成本,肯定不包括学java的成本吧?
就说不喜欢jaskell,那么用ruby,groovy这些脚本来写server page如何呢?freemarker相比它们优势又在哪里?

引用
2. 性能    未知

对。性能是个问题。现在我没有benchmark。

引用
3. 所提供的build-in渲染处理多样性和便捷性 Freemarker > Jet

比如说?
0 请登录后投票
   发表时间:2006-03-09  
有空的话可以研究底层架构的东西,比如MapReduce ,FP在底层架构设计终的作用等等........... 对架构思维,终极水平提高都会又很大帮助。

至于这些J2EE上的功能扩展之类的东西,对于学术型的研究没什么意义。最多是项目型的toolkit之类的实现。 无怪乎,对于整天把Spring挂在嘴上的Rod,很多牛人对他很不屑。

而重复发明轮子就更没意义了。
0 请登录后投票
   发表时间:2006-03-09  
firebody 写道
有空的话可以研究底层架构的东西,比如MapReduce ,FP在底层架构设计终的作用等等........... 对架构思维,终极水平提高都会又很大帮助。

至于这些J2EE上的功能扩展之类的东西,对于学术型的研究没什么意义。最多是项目型的toolkit之类的实现。 无怪乎,对于整天把Spring挂在嘴上的Rod,很多牛人对他很不屑。

而重复发明轮子就更没意义了。

很高兴又多了一个觉醒者。学会鄙视j2ee,鄙视rod这类所谓的“牛人”是一个可喜的进步。
0 请登录后投票
   发表时间:2006-03-09  
可读性是不是致命的可以通过调查来知道,至少我觉得是很重要。除非功能真的差别很大。现在都web 2.0了,强调用户体验,我想对于使用框架而的程序员也有这样的需求。

引用
3. 所提供的build-in渲染处理多样性和便捷性 Freemarker &gt; Jet

主要就是指
引用
? 以自身作为参数调用内置函数
0 请登录后投票
   发表时间:2006-03-09  
引用
有空的话可以研究底层架构的东西,比如MapReduce ,FP在底层架构设计终的作用等等........... 对架构思维,终极水平提高都会又很大帮助。
听了firebody的话,迷茫啊..咱也抱有发射火箭之心,但火箭在那里,在那里还没看到.
0 请登录后投票
   发表时间:2006-03-09  
另外tr函数的问题就是见仁见智了,例如。
                <#list books as b> 
                <tr> 
                        <td>${b.name?html}</td> 
                        <td>${b.price?string("##.00");}</td> 
                        <td>${b.isbn}</td> 
                </tr> 
                </#list> 

完全也可以写成
                <#list books as b> 
                <@m.tr value=[b.name?html, b.price?string("##.00");, b.isbn] /> 
                </#list> 

结构还是比较清晰的。
0 请登录后投票
   发表时间:2006-03-09  
?后面的东西不就是java的method吗?什么int, lower_case之类的,为什么叫“渲染”?

感觉freemarker的terminology有点奇怪。?其实是java的method概念。method其实是function的概念。又有macro。

jet就没这么多讲究,就是一个function包打天下。从这点上讲,jet更简单。

至于int, lower_case这些东西,构不成主要特点吧?jet要加些预定义的函数,粉容易。而且,你也完全可以自己定义这些函数。
0 请登录后投票
   发表时间:2006-03-09  
ajoo 写道
?后面的东西不就是java的method吗?什么int, lower_case之类的,为什么叫“渲染”?

感觉freemarker的terminology有点奇怪。?其实是java的method概念。method其实是function的概念。又有macro。

jet就没这么多讲究,就是一个function包打天下。从这点上讲,jet更简单。

至于int, lower_case这些东西,构不成主要特点吧?jet要加些预定义的函数,粉容易。而且,你也完全可以自己定义这些函数。

其实就是
SomeUtil.methodB(SomeUtil.methodA(value))

value?methodA?methodB
的区别,我认为还是相当有意义的
0 请登录后投票
   发表时间:2006-03-09  
lllyq 写道
另外tr函数的问题就是见仁见智了,例如。
                <#list books as b> 
                <tr> 
                        <td>${b.name?html}</td> 
                        <td>${b.price?string("##.00");}</td> 
                        <td>${b.isbn}</td> 
                </tr> 
                </#list> 

完全也可以写成
                <#list books as b> 
                <@m.tr value=[b.name?html, b.price?string("##.00");, b.isbn] /> 
                </#list> 

结构还是比较清晰的。


对呀。所以说,不是说tr, td函数是否应该有的问题。多了个选择总是不会错的。

不过呢,freemarker处理高阶函数的能力还是比较有限。#nested其实就是一个高阶函数参数了,只不过,一个macro除了#nested可以是接受参数的高阶函数(可以理解成回调),别的参数都不可一。
而jet函数可以接受任意多的高阶函数作为参数,还可以返回高阶函数。

至于这个功能有多大实际意义,我实际经验不多,不好说,就是从纯粹语言能力的角度看。

对了,freemarker为什么用"x?int"而不是"x.int"?各位没人觉得这个语法别扭?
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics