Dhanji Prasanna 谈 Google Sitebricks Web Framework

  • Dio Synodinos
  • 张龙

2009 年 10 月 11 日

话题:JavaWeb框架语言 & 开发

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 上关于FrameworksGoogle Guice以及Google Wave的文章进行延伸阅读。

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

JavaWeb框架语言 & 开发