QCon北京「鸿蒙专场」火热来袭!即刻报名,与创新同行~ 了解详情
写点什么

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:081525
用户头像

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

关注

评论

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

华为云推出限量NFT云宝,区块链技术为你的数字资产保驾护航

华为云开发者联盟

华为云 NFT 云宝 华为云NFT 华为云数字资产链

TASKCTL服务端字符界面的应用系统安装

敏捷调度TASKCTL

kettle 元数据 ETL 调度任务 大数据运维

Linux驱动开发-编写W25Q64(Flash)驱动

DS小龙哥

4月月更

Docker 实战教程之从入门到提高 (四)

汪子熙

Docker 容器 虚拟化 docker image 4月月更

得物App H5秒开优化实战

得物技术

前端 H5 优化 实战 Web H5

低代码极简部署

源字节1号

低代码开发

平安普惠湖北分公司:齐心抗疫显担当,助力小微迎暖春

科技新消息

如何通过云效Codeup高效落地分支模式,提升开发协作率

阿里云云效

云计算 阿里云 版本管理 分支管理 分支模式

共探开源生态|Apache Pulsar 社区助力 Apache APISIX Summit Asia 2022

Apache Pulsar

开源 架构 云原生 Apache Pulsar Apache Pulsar 社区

专车数据层架构进化往事:好的架构是进化来的,不是设计来的

勇哥java实战分享

架构

ModStartCMS模块化建站系统 v3.7.0 栏目导航开关,页面样式优化

ModStart开源

jackson学习之九:springboot整合(配置文件)

程序员欣宸

4月月更

周日直播|OpenMLDB Pulsar Connector,高效打通实时数据到特征工程

Apache Pulsar

开源 架构 云原生 Apache Pulsar 消息中间件

Jira 云产品宕机多日,业界热议上云如何保障数据安全

万事ONES

Atlassian Jira 研发管理工具 项目管理工具 企业研发管理

java培训:怎样才能写出一个优秀的对外接口

@零度

JAVA开发 对外接口

TiDB 查询优化及调优系列(一)TiDB 优化器简介

PingCAP

EventBridge 特性介绍|以 IaC 的方式使用 EventBridge

阿里巴巴云原生

web前端培训学习需要掌握哪些 Linux 命令

@零度

前端开发

Apache DolphinScheduler ASF 孵化器毕业一周年,汇报来了!

白鲸开源

Big Data DolphinScheduler workflow Open Source apache 社区

web技术支持| 简单实现Vue第一章:模板编译

anyRTC开发者

Vue 前端 Web 音视频 WebRTC

对Indexlookup的理解误区

TiDB 社区干货传送门

云风:不加班、不炫技,把复杂的问题简单化

博文视点Broadview

Android C++系列:C++最佳实践2抽象类

轻口味

c++ android 4月月更

大数据培训关于数据采集面试问题分享

@零度

数据采集 面试问题 大数据开发

GPU和AT的区别在哪里?GPU与AT有哪些区别?

Finovy Cloud

人工智能 GPU服务器 显卡、gpu GPU算力

去中心化钱包系统开发app,imtoken钱包平台搭建源码

Geek_56201b

#区块链# 源码搭建 去中心化钱包

新思科技助力Linux基金会开展最新开源普查项目

InfoQ_434670063458

Linux 开源 新思科技

交易所多种模式开发、各种源码交易

Geek_56201b

交易所开发 区块链应用开发 软件定制

【数字底座专题】星环科技春季新品发布周

星环科技

从Opentracing、OpenCensus 到 OpenTelemetry,看可观测数据标准演进史

阿里巴巴云原生

今天聊一聊合成数据 (Synthetic Data)

澳鹏Appen

人工智能 数据集 数据标注 数据训练 合成数据

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