Dhanji Prasanna谈Google Sitebricks Web Framework

Sitebricks是由Google推出的构建在Google Guice之上的全新Web应用开发框架,其目标在于早期的错误检测、高效的代码以及快速的开发。InfoQ有幸采访了Sitebricks创建者与Google Wave核心工程师Dhanji Prasanna一探究竟。

InfoQ:构建这样一个全新Web框架背后的动机是什么?现有的众多框架还不够使么?

Dhanji:我已经在这上面花费了大量的时间和心力(从Java 5出来就已经着手开发了)。在试用过几个流行的框架如Struts1/2、JSF等之后感受到了不少痛苦之处,从那以后就开始不断尝试让Web编程更加有趣,同时也减轻自己的痛苦。我向很多人介绍了Sitebricks,他们都对这个框架的特性感到无比兴奋。一开始他们都很不屑:不就是另一个框架而已么?但后来却转变了态度,认为这是一个优秀的框架。这给了我极大的自信,也支撑着我一路走到现在。

我相信Sitebricks还有很大的创新空间。虽然我并不喜欢使用“REST”这个时髦词,但Sitebricks在其设计之初就全面拥抱核心的HTTP规范,现在很缺这种解决方案。如果标榜其为“RESTful Web框架”,那会吸引更多的人,然而我们相信Sitebricks本身的特性就会让人们感到兴奋,因为事实就是如此。

InfoQ:相对于传统的Java框架和技术比如JSF、Wicket等等,Sitebricks有什么与众不同之处呢?

Dhanji:Sitebricks与他们都不一样。JSF和Wicket都通过采取类似于桌面UI的方式进行Web UI设计:事件、组件以及与用户的点击和行为进行交互的Widget。Sitebricks直接构建在HTTP之上,这意味着它与JAX-RS(面向RESTful Web Services的Java API)有一拼,不得不提的是,我也对JAX-RS的设计做出过贡献,但是目前它还不支持模板,也没有提供客户端API。

我对现有的MVC框架感到最不爽的地方就是他们出来的快,消失的也快,而且还隐藏了HTTP层。这导致了很多奇怪的行为,比如自动注入用于捕获点击的javascript并将其转换为收集状态的POST。另外这些框架都很庞大,做起原型来可不是一件轻松的事。而Sitebricks却很简洁,它拥抱HTTP,热爱HTTP,非常擅于获取与交换资源和消息。

基于这一点,我们采取类似于函数式语言的方式来构建模板层,这样用户就可以一种简洁的方式组合多个页面(通过折叠和投影)了。其中的灵感来自于函数式语言如Scheme和Haskell,Terrence Parr关于模型/视图分离的论文( http://www.cs.usfca.edu/~parrt/papers/mvc.templates.pdf)也是我们所遵循的重要原则。

InfoQ:能否谈谈Sitebricks背后所遵循的基本原则及采取的技术选型?

Dhanji:当然可以。主要的原则就是简洁与类型安全,就像Guice那样。从导航到URL映射及模板语言的编写,所有内容都由一个额外的错误检测及静态分析层所支撑。Sitebricks模板中的表达式就像JSP那样简洁,但却通过一个类型推断算法进行静态的类型检查。它甚至还使用了鸭子类型,保证了静态安全。

另一个核心原则就是速度:不仅仅是性能,还有开发者的效率。Sitebricks的生命周期与HTTP别无两样,每个页面都是一个常规的Java POJO再加上一个前端的HTML模板。其他框架中的“客户化”组件通常都需要大量额外的配置及支持类。在Sitebricks中,模板系统的本性使得客户化可重用的页面片段与常规的页面没有什么差别。

最后,我想说的是Sitebricks直接构建在Guice之上。这是我们从一开始就遵循的核心设计原则,这样Sitebricks就与完整的DI系统紧密结合起来了,从而无需像其他框架那样还要花费很大气力才能利用到DI的优势。

InfoQ:要想使用Sitebricks开发Web应用都需要哪些步骤、工具以及程序库呢?

Dhanji:基本的做法就是在浏览器中运行HTML页面,然后不断编辑它,再来查看效果。无需任何特别的工具来设计页面或是组件。你可以在任何Servlet容器中运行Sitebricks并遍历页面(称作brick)或是更大的组合页面中的片段。

就像Guice一样,Sitebricks遵循这样一种思想:类型安全与早期的错误检测对开发者是大有裨益的。不仅验证对象以保证DI依赖(通过Guice及内建的Guice Servlet)的正确性,而且还对页面中的表达式进行静态的类型检查使之符合相应的页面类。在Red Hat王牌工程师Mike Brock的帮助下,我对优秀的表达式语言MVEL( http://mvel.codehaus.org)进行了扩展以使用类型推断算法,这保证了JSP风格表达式的简洁性,同时又提供了Java编译器丰富的错误检测功能。

我们的目标就是无需任何特别的工具就能获得最大的收益(甚至都不需要IDE)。MVEL要比JSP EL快一个数量级,比大多数其他的EL快好几倍。

除此之外,Sitebricks还会加载对HTML模板的静态分析,确保表单参数匹配构建目标、action URL并执行其他一整套检测。当然了,这只是冰山一角而已,我们还有很多工作要做。

InfoQ:Sitebricks能否集成其他一些流行的Web技术比如GWT、能否在客户端集成JavaScript工具、能否集成Hibernate及其他持久化框架?

Dhanji:目前你可以在Sitebricks页面上使用任何javascript框架并将其嵌入到其他Sitebricks页面上作为组合片段或是“brick”。Sitebricks会处理好这一切并将CSS、Javascript及其他资源正确地重写到<head>标签内,这意味着你可以通过简单的注解来嵌入任何信息。凭借这一点,开发者可以将任何Web页面包装起来并作为一个可重用的组合单元插入到其他页面中,该特性非常棒。你还可以通过Sitebricks将XML和JSON传递到GWT应用中,就像任何其他的客户端服务一样。

目前我们正致力于以comet风格来集成GWT,这样Sitebricks就可以轻松作为后端来支持长时间运行、双向的GWT应用了。

由于Sitebricks构建在Guice之上,因此用户可以充分利用我们所提供的与各种框架和程序库的集成。Warp-persist( http://www.wideplay.com)是一个针对JPA、Hibernate和db4objects的薄薄且又简单的集成层,用户可以通过它在任何Guice应用中轻松实现持久化和事务操作。它还具有丰富的类型安全以及自动化查询等特性。现在很多组织与个人都在使用Warp-persist,其中包括Google内部的一些项目。

Guice的Servlet模块也内置于Sitebricks之中,这能够帮助应用消除繁琐的web.xml配置。

InfoQ:好像Google Wave Federation Prototype Server使用了Sitebricks,它真的用在该服务器中了么?你是否打算将其用在更多的Google项目中呢?

Dhanji:你消息很灵通啊!事实上,Sitebricks并没有用在Google Wave参考实现中。在我建立Federation项目的构建配置时,我使用了Sitebricks的ant脚本作为模板,因此在一些示例中留有一些注释。然而我曾与一些团队讨论过将Sitebricks用在Google Wave的其他系统中,我相信当其稳定时会派上用场的。我曾与Google一些工程师谈论过Sitebricks,他们都对其表示出了极大的兴趣,但现在说这些还有些为时过早,一切都要等到代码成熟稳定时才能做出决定。

InfoQ:这个世界上并不存在万能的框架,那么你认为哪些Web应用最能从Sitebricks上获益,哪些情况下不应该使用Sitebricks呢?

Dhanji:问的好。Sitebricks适合于当今大多数具有如下特点的站点:其HTML页面具有大量文本内容和一些组件,而这些组件是通过Javascript以交互的方式插入或是修改的。

一开始,你可能会觉得像Google Wave这样使用了大量Ajax的应用并不会从Sitebricks中获得多少好处,但在看过其RPC层之后,你就会发现Sitebricks的RESTful Web Services API非常适合于为GWT应用直接传输JSON或是XML。同时,我们还发现相对于从JSON或是GWT-RPC转换来说,预先渲染的HTML片段可以极大地提升性能,而Sitebricks非常适合于这一点。

最后,我们还通过快速的序列化在Sitebricks中实现健壮的HTTP(RESTful)Web Services,同时捆绑了一个简单的HTTP客户端API,这意味着同样的Sitebricks jar可以用在Web Services远程设施的两端。为了做到这一点,我们针对MVEL进行了MVBus扩展,这与传统的程序库如XStream相比,性能提升了一个数量级。

InfoQ:Sitebricks大概的一个发布计划是怎么样的,采取什么协议呢?

Dhanji:Sitebricks目前采取的是Apache Software License 2.0,现在还处在alpha阶段,可以通过 http://code.google.com/p/google-sitebricks获取。

大家可以通过twitter直接给我发消息或是在 http://twitter.com/dhanji上给我留言。

大家可以通过Google Sitebricks的项目主页、邮件列表或是Dhanji在今年JavaOne上的演讲材料中了解到关于Sitebricks的更多信息。

Dhanji还是Dependency Injection一书的作者,InfoQ此前曾对该书进行过报道,该书的最后一章介绍了如何通过Google Sitebricks构建完整的Web应用。

大家可以查看InfoQ上关于Frameworks、Google Guice以及Google Wave的文章进行延伸阅读。

查看英文原文:Google Sitebricks Web Framework - Q&A with Dhanji Prasanna

你可能感兴趣的:(Dhanji Prasanna谈Google Sitebricks Web Framework)