写点什么

Dhanji Prasanna 谈 Google Sitebricks Web Framework

  • 2009-10-11
  • 本文字数:3590 字

    阅读完需:约 12 分钟

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 及其他资源正确地重写到标签内,这意味着你可以通过简单的注解来嵌入任何信息。凭借这一点,开发者可以将任何 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

2009-10-11 13:081571
用户头像

发布了 88 篇内容, 共 269.6 次阅读, 收获喜欢 9 次。

关注

评论

发布
暂无评论
发现更多内容

不断突破,稳中求进——我的移动端跨平台开发技术回顾与展望| 社区征文

No Silver Bullet

跨平台 移动端 新春征文 2月月更

vivo 评论中台的流量及数据隔离实践

vivo互联网技术

mongodb 中台 分布式

阿里巴巴DevOps文化浅谈

阿里云云效

阿里巴巴 阿里云 DevOps 云原生 研发

在阿里,我们如何管理代码分支?

阿里云云效

阿里云 DevOps 云原生 研发 分支管理

百度APP视频播放中的解码优化

百度Geek说

百度 性能优化 视频

大数据开发之运维面试题汇总分享

@零度

面试题 大数据运维

Ceph核心概念解读

总想做点什么

分布式存储 Ceph 云存储 云计算,

如何解决Python项目在VScode中跨文件夹导包问题

IT蜗壳-Tango

IT蜗壳教学 2月月更

React Fragment介绍与使用

编程江湖

React

Spring Boot Serverless 实战 | Serverless 应用的监控与调试

Serverless Devs

鸿蒙轻内核源码分析:文件系统LittleFS

华为云开发者联盟

鸿蒙 文件系统 Flash LittleFS LiteOS-M内核

“1天一朵云”,这是如何做到的?

华为云开发者联盟

数字化转型 软件架构 华为云 华为云Stack 全栈云平台

Java 字符串常见的操作

编程江湖

Kubernetes HPA 基于 Prometheus 自定义指标的可控弹性伸缩

张晓辉

Kubernetes 弹性 HPA

新思科技BSIMM评估为安全团队提供“他山之石”

InfoQ_434670063458

汽车 新思科技 软件定义汽车 软件安全 BSIMM评估

从原理到操作,让你在 APISIX 中代理 Dubbo 服务更便捷

API7.ai 技术团队

微服务网关

分配任务的人才是团队的核心成员

panda

管理 限界上下文 任务分配

Java11特性-效能翻倍的HttpClient

蜜糖的代码注释

Java 后端技术 2月月更

如何让代码代码管理变的更安全更高效 | 云效开发篇

阿里云云效

阿里云 DevOps 云原生 代码管理 Codeup

探秘 k8e:极简 Kubernetes 发行版

张晓辉

Kubernetes 云原生

做了一份前端面试复习计划,保熟~

CRMEB

盘点冬奥会上的那些“黑科技”,你也可以掌握它!

博文视点Broadview

如何帮助金融客户“用好云”?

阿里云云效

阿里云 运维 云原生 云平台 阿里云混合云

aPaaS将如何改变软件行业?

华为云开发者联盟

云计算 软件 软件开发 SaaS aPaaS

【高并发】一文解密诡异并发问题的第一个幕后黑手——可见性问题

冰河

Java 并发编程 多线程 异步编程 精通高并发系列

面向推理训练一体化的 MNN 工作台

阿里巴巴终端技术

端智能

推荐学java——Spring与web项目

逆锋起笔

Spring web idea web web项目 idea spring

设备接入服务,看完这篇给你整的明明白白

华为云开发者联盟

物联网 IoT 华为云 设备接入服务 设备

java开发之Spring集成MyBatis知识分享

@零度

Java spring mybatis

百度爱番番实时CDP建设实践

百度Geek说

后端

前端开发之js栈内存和堆内存的区别

@零度

JAVA开发 堆内存 栈内存

Dhanji Prasanna谈Google Sitebricks Web Framework_Java_Dio Synodinos_InfoQ精选文章