Freewind @ Thoughtworks scala java javascript dart 工具 编程实践 月结 math python english [comments admin] [feed]

(2012-04-24) 尝试使用Xtend开发网站

广告: 云梯:翻墙vpn (省10元) 土行孙:科研用户翻墙http proxy (有优惠)

以一些高性能的模板引擎为例:play2的scala模板,play1的rythm/japid,无不是首先把模板转为scala或java类,然后再调用其中某方法来得到最终文本。特别是play2的scala模板,转为scala类后,直接在controller代码中调用该类的render方法。

既然如此,何不直接在源代码中写view? 连翻译的步骤都省了,所见即所得。

然而在java中不可能,因为它没有多行文本。scala中直接支持xml语法,但在其中嵌入scala代码时不是很方便,格式化时也会把xml格式弄得很糟。

而Xtend的内置的模板很好用,充分考虑到这些情况,所以我尝试使用xtend直接写view层。

首先看在基类Layout.xtend中定义的main()方法,它定义了整体结构。

image

其中的headImports,是定义同文件中另一个方法:

image

子类中如果想填充body部分,可如下:

image

注意,调用main方法时,最后一个参数使用了闭包语法,方便把大块内容单独放置。

代码中有很多被«»包围的代码,它是嵌入的xtend代码。

整体来说,一眼看去,还比较清楚。

换用Amateras HTML editor打开Layout.xtend,有惊喜:

image

html代码高亮,看起来更有感觉了。此时在内部输入html代码,甚至还有提示!

image

可惜不是每段html用它打开都是这样,如果字符串中的html内容较少的话,可能连语法高亮都没有。

提了个request: https://bugs.eclipse.org/bugs/show_bug.cgi?id=377382,希望能在editor中增加html/json/xml等的高亮显示,不知何时会实现。

这是花了两天时间搞出来的示例:https://github.com/freewind/webtend

整体基于servlet,自己做了一些封装,增加了route,算是一个简单mvc框架。在eclipse中使用了run-jetty-run插件,直接引用bin中的.class,提供http访问,很方便很快。再配合dcevm,来提供hot-swap。

初看起来,这是一套非常简洁明了的组合:

  1. 将Action和View写在一个Xtend类中,直接在源代码中写HTML2. 在Action类上使用自定义的Route注解标明路径3. 一个Servlet类做入口,在debug模式下,每个请求到来时,都读取一遍全部的标注了Route的类,以找到新增的类4. orm使用了Ebean5. 使用dcevm实现hot-swap6. 使用livereload自动刷新浏览器

但在使用中,因为某些库、工具支持不够好,有些地方不太爽:

  1. 在写View时,首先两种编辑器的切换麻烦;二是写html时压力很大,总觉得是在写xtend代码,怕输错引起编译错误。在尝试过程中,总感觉到急躁。2. 不知是Dcevm不够成熟,还是run-jetty-run没配好,有时候修改了代码,却没有生效,让我总在猜测是代码写得有问题还是工具有问题,最终不断重启run-jetty-run3. 当我修改了代码时,livereload会马上触发浏览器刷新操作,但这时jetty还没有拿到编译后的代码,页面上显示的还是之前的内容。必须再次手动刷新浏览器才能看到效果,livereload完全没起作用。4. Xtend的editor支持不够好,离java还有些距离

最后放弃,因为感觉不舒服,也许需要等到这些工具比较成熟时,才适合采用这种方式。

最后要说的是:Xtend的google group比较热心,我每次提问,都会有人很快给出帮助。感谢。

comments powered by Disqus