论坛首页 Java企业应用论坛

Jet - Jaskell Server Page

浏览 21750 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2006-03-07  
JSP确实感觉很蹩脚。连在页面里面定义个函数都不成。为了重用页面逻辑,taglib的设计却又显得臃肿复杂,重的要命。不过,这也许只是jsp自己的缺陷,不见得能敲响所有xyzSP的丧钟。

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
   发表时间:2006-03-07  
引用
freemarker的macro,感觉就是一个自制的函数系统了吧。这个可是jet的强项。jet不但可以任意定义freemarker里面的函数,还可以定义高阶函数。也就是说,macro可以当作其它macro的参数,也可以作为其它macro的返回值。这点不知道freemarker做不做得到?


默认是不可以的,我有hack freemarker的代码,让Macro实现TemplateModel就可以了
0 请登录后投票
   发表时间:2006-03-07  
JSP也可以在页面定义函数。
0 请登录后投票
   发表时间:2006-03-07  
zzeric 写道
JSP也可以在页面定义函数。

呵呵。那是我孤陋了。能不能给了连接或者例子?要是jsp也能方便地定义函数,就不大看出来freemarker比jsp强多少了。
0 请登录后投票
   发表时间:2006-03-08  
ajoo 写道
zzeric 写道
JSP也可以在页面定义函数。

呵呵。那是我孤陋了。能不能给了连接或者例子?要是jsp也能方便地定义函数,就不大看出来freemarker比jsp强多少了。


封装成javabean不行吗?要不直接就在jsp中写javacode

要说功能强大,jsp几乎是强大过头的了,看你怎么用咯
0 请登录后投票
   发表时间:2006-03-08  
javabean里面包含显示逻辑吗?好像不好吧?而且也不方便。

在jsp里面直接写一次性的java代码可以,写个可以重用的函数怎么写法?
0 请登录后投票
   发表时间:2006-03-08  
&lt;%!
public int sum(int a,int b)
{
     return a + b;
}
%&gt;

不过只能同一页面内重用,除非做成一个单独的文件用include加到不同的页面
0 请登录后投票
   发表时间: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里面本来就是要尽量避免的呀。
0 请登录后投票
   发表时间:2006-03-08  
引用
这种sequence函数用jsp写是要累死的吧?

这么写
xx.sequence( new String[]{"name","price","isbn"},new ThFunction(writer) )
0 请登录后投票
   发表时间:2006-03-08  
各位大哥,把本来简简单单的模板搞那么复杂,有必要吗?
0 请登录后投票
论坛首页 Java企业应用版

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