PCon全球产品创新大会即将开幕,抢占最后的交流席位! 了解详情
写点什么

JSF 在 GlassFish 管理控制台中的应用

  • 2008 年 9 月 09 日
  • 本文字数:3229 字

    阅读完需:约 11 分钟

相比于 Tomcat, GlassFish 的用户群还没有那么广泛,但是因为其同样免费、开源,而且拥有如延迟加载、 Grizzly 等技术,正取得越来越多人的认可。而 JSF 作为一个 Web 开发的标准,虽然自诞生之日起就一直饱受争议,不过在争议中,它也在赢得更多开发者的眼光。Anissa 是 GlassFish 的一个主要提交者,领导其管理控制台项目,在 Sun 的应用服务器团队工作了 7 年之久。InfoQ 中文站的编辑霍太稳有幸就 JSF 在 GlassFish 管理控制台中的应用,如为何在 GlassFish 管理控制台中应用 JSF 模板,如何对 JSF 做单元测试,JSF 的组件库以及如何提高 JSF 的性能等问题采访了 Anissa。

InfoQ 中文站:请介绍一下您自己以及目前所主要研究的技术领域。

Anissa:我是 GlassFish 的主要提交者,目前领导其管理控制台项目。大约七年前,我加入了应用服务器团队,那时 GlassFish 还没有开源。我参与过许多 GUI 工具,包括 J2EE 1.4 参考实现中的 deploytool 以及我们深受欢迎的 IDE_NetBeans 的插件,而现在是负责管理控制台。在这些年里,我见证了 Web 应用开发技术的发展过程,并从中受益很多。我目前专注于 Web 2.0,致力于将最新的技术应用到 GlassFish 管理控制台。

InfoQ 中文站:GlassFish 的管理控制台用到了 JSF 模板,请介绍一下选用这个技术的缘由。

Anissa:JSF 是一个面向组件的框架。因此,它易于组织各种具有复杂功能的“组件”成为一个网页,这些组件包括文件选择、文件上传、表格、BreadCrumb、属性表以及其它很多组件。但是,JSF 1.2 没有提供一种简洁的方式重用 GUI 显示逻辑或者通过模板组织页面。 JSFTemplating 通过协调模板让定义页面变得更有效率。它也添加了许多旨在鼓励代码复用的特性和其他有用的功能。这些功能包括:一个细粒度的事件模型、能够参数化的可重用“处理函数”、支持注释、页面作用域、可以将任何内容来源转化为资源流、可定制的组件工厂。这些功能和 JSF 丰富的组件模型结合,为创建 GlassFish 管理控制台提供了丰富的开发环境。

InfoQ 中文站:JSF 的一个初衷就是快速开发,但单元测试对快速开发同样重要。您如何做 JSF 的单元测试?

Anissa:我不得不承认管理控制台的单元测试是最具缺陷的地方之一,亟需提高。对于 GlassFish V2,我们已经研究并使用 Selenium 做了一些测试,虽然 Selenium 更适合功能测试。我们也依靠质量保证部门对控制台进行自动化测试。对于 GlassFish V3,我们正在研究不同的框架,例如 JSFUnit,它可以作为 Maven 构建过程和 Hudson 的一部分。

InfoQ 中文站:目前关于 JSF 的错误提示似乎还不那么直观,过于底层,对于如何定位错误您有什么技巧?

Anissa:JSF 错误信息从 1.0 开始一直在持续改进。不幸的是,很多时候人们面对错误信息,仍然需要具备足够的 JSF 是如何工作的知识才能完全理解。找出错误的根源常常需要经验。但是,这里有一些技巧可以帮助你:

  1. 查看 JSF 源代码。JSF 是开源的,不要害怕去获取源代码,看一看错误发生位置处的代码。
  2. 报告糟糕的错误信息。当你无法理解错误信息的意思时,请去 https://javaserverfaces.dev.java.net,提交一个“问题”,这会有助于改进错误信息而且你也很有可能得到你所遇到的问题的答案。
  3. 使用 google,在论坛上提问。有很多人在使用 JSF,可能有人已经遇到并提出了这个问题。如果没有,你会发现许多人乐于帮助你、解答你的问题。
  4. 确认你使用了 JSF “h:messages”组件(或者另外一个显示这些内容的组件)。JSF 经常使用“Faces 消息”机制报告错误,如果你没有在页面上包含“h:messages” 组件,你就无法看到这些错误。

使用这些技巧,你能够解决遇到的任何问题。

InfoQ 中文站:JSF 用来做重业务,轻页面的企业开发还比较合适,但现在客户也都比较重视页面,对界面设计也提出了很高的要求。通过 IDE,JSF 可以实现可视化编辑 Web 界面,但如何高效的实现开发人员和网页开发人员的合作?您在开发 JSF 时是如何跟美工配合的?

Anissa:我们的产品对界面设计感观有一个非常明确的标准。我们使用的组件(Woodstock)默认情况下就反映了这种设计要求。因此,JSF 面向组件的本质提供给我们很多外观和感觉方面的选择,而不需要太多开发工作。也就是说,我们的产品中有一些地方需要定制图片、决定如何显示信息,也存在一些地方没有被 JSF Woodstock 组件覆盖。针对这些情况,我们与美工合作创建图片,或者他们帮助我们决定哪些组件最合适,或者对新组件制定标准。如果需要新组件,我们经常让 Woodstock 团队负责这项工作–当我们不能等待时,我们才会自己实现。美工通常提供图片和 HTML,我们将其转化成 JSF 页面或者组件。

InfoQ 中文站:管理控制台是如何使用 AJAX 技术的?

Anissa:在 GlassFish V2 中,我们在大多数页面上使用 Ajax 计算 BreadCrumb。浏览器中的 JavaScript 计算当前哪一个树节点被选中,然后从树节点中获取 URL,将这些信息通过 XMLHttpRequest 发送给服务器。服务器将这些信息转化成由多个 Woodstock 超链接组成的 BreadCrumb 组件。显示该组件的代码返回到浏览器后,JavaScript 将 BreadCrumb 信息更新到当前页面上。

当新对象创建时,我们也使用 Ajax 更新树节点。整棵树从不会被完全刷新,它只会通过 Ajax 进行部分更新。我们使用 Dynamic Faces 实现 Ajax 技术,它是 Ed Burns(JSF 标准负责人)领导的 JSF 扩展项目的一部分。

InfoQ 中文站:JSF 一个重要的优势是基于组件,管理控制台有没有开发自己的组件库,关于组件库的选择使用有何建议?管理控制台中的表单是如何进行扩展的?

Anissa:正如在回答第 4 个问题时所提到的,我们使用 Woodstock 组件开发控制台。Woodstock 提供了一整套 JSF 组件,让开发人员基于统一的规范创建方便的本地化的应用。我们还没有遇到需要自己开发组件的情况。如果你有这个想法,你可以看一看 Ken Paulsen 写的有关 ServerSide 的文章,他是 JSFTemplating 的技术负责人和创建者。他在文中展示了如何使用 JSFTemplating 简化和加快显示 (Render) 开发。

我们的许多页面使用表单显示数据,这也是 Woodstock 的组件之一。

InfoQ 中文站:在使用 JSF 的过程中,你们主要遇到了哪些棘手的难题,又是如何克服的?

Anissa:Bug。当组件正常工作的时候它们很出色,但是当你处理一个无法工作的新组件时,很难找到原因。幸运的是,这种情况不会经常发生,因为组件被很多人、很多程序重用,因此 bug 会及时发现。但是,如果这发生了,我们会与组件作者交流、在论坛或者 irc 频道提问、搜索 google 中其他人遇到的类似问题,问题最终得到解决。

InfoQ 中文站:JSF 通过和 Session 绑定实现数据显示,虽然简单了,但是控制数据同时也困难了。对于这种情况,您是如何理解的?

Anissa:管理控制台尽量避免使用 session 作用域。频繁使用 session 可能会导致内存的大量占用,或者之前的动作遗留下来的一些信息会导致产生 bug。管理控制台尽可能多的使用 request,还有 pageSession,它允许伴随着页面存储值,只要你处于同一个页面,其值就一直存在,但不会超过页面的生存时间。我们的确遇到过一些情况,数据必须跨页面存在,我们要么在页面之间传递数据,要么在极少的个案中使用 session。

InfoQ 中文站:在提升 JSF 应用的性能方面,您有什么建议?

Anissa:JSF 提供了大量功能。但是,功能只有在需要时才是有价值的。是否应该使用 JSF 的更多功能取决于你应用程序的需求。如果你想对功能进一步了解以确定它们是否对你的应用有帮助,我推荐你阅读一本好书以及在 JSF 论坛上提问。你可能也会考虑加入 irc.freenode.net 上的 jsf IRC 频道。这是一个聆听其他人提问和从专家获取答案的好地方。如果正在使用 JSFTemplating 或者只是想多了解一下,#jsftemplating 也是一个不错的去处。


注:感谢 Sun 中国研究院蒋健,InfoQ 中文站 Java 社区编辑沙晓兰提供智慧支持!本文采访文稿为英文,由崔康翻译,张凯峰审校。

志愿参与 InfoQ 中文站内容建设,请邮件至 editors@cn.infoq.com 。也欢迎大家到 InfoQ 中文站用户讨论组参与我们的线上讨论。

2008 年 9 月 09 日 23:281079

评论

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

Rust从0到1-结构体-方法

rust 方法 struct 结构体 method

你对JVM垃圾收集器了解多少?面试官夺命13问谁碰谁不迷糊啊!

北游学Java

Java JVM 垃圾回收

霸榜GitHub!银四匠心之作:拼多多/蚂蚁/百度面经分享

Java 编程 程序员 架构 面试

2021 优质前端资源精选 —— 持续更新,欢迎共建

清秋

大前端 教程 资源 社区 4月日更

7.1 Go语言从入门到精通:Cobra介绍

xcbeyond

cobra Go 语言 4月日更

什么是你上大学才知道的事情?

🌍

4月日更

优秀程序员必备技能之如何高效阅读源码

中间件兴趣圈

方法论 源码解读

观《掌控习惯》笔记

尧二水丶

习惯养成 书籍推荐 书单 书籍 4月日更

函数

奈奈奈奈

我用Rocket-API实现了开放平台

棒锤🐮

学习笔记

山@支

容器&服务: ClickHouse与k8s架构

程序员架构进阶

Kubernetes Prometheus Clickhouse 28天写作 4月日更

starforce源码解读二:游戏入口

风翱

Unity 源码解读 4月日更

知乎高赞:为什么同样是分布式架构的Kafka需要Leader而Redis不需要

中间件兴趣圈

分布式 raft 一致性 数据分片

「编程概念」融合理解函数式和面向对象

顿晓

面向对象 4月日更 函数式 融合

在华为云专属月中,寻觅互联网更需要的云味道

脑极体

如何避免成为一个油腻的中年猥琐男?

石云升

读书笔记 中年 28天写作 4月日更

来学Python啦,用Python详细讲解温度转换器

Bob

Python Python 游戏编程 4月日更

面试官问:能聊聊你对充血模型和贫血模型的理解吗?

面试官问

领域驱动设计 DDD 充血模型 贫血模型

MVCC:听说有人好奇我的底层实现

咔咔

MySQL MVCC

众盟科技:直播浪潮下,医美行业的私域营销之变

脑极体

并发的HashMap为什么会引起死循环?

Java小咖秀

容器 hashmap 并发

强化区块链应用 破解知识产权运营难题

CECBC

区块链

Edge 修改使用的默认搜索引擎

HoneyMoose

我叫小M,立志建立MySQL帝国。

yes

MySQL

如何在 GitHub 上选择合适的开源工具和项目

耳东@Erdong

GitHub 4月日更

Wireshark数据包分析学习笔记Day28

穿过生命散发芬芳

Wireshark 数据包分析 4月日更

趁早

小天同学

个人感悟 成功 4月日更 恋爱 趁早

基于树莓派和OpenVINO的边缘计算

IT蜗壳-Tango

IT蜗壳教学 4月日更

Angular,AngularJS 和 react

HoneyMoose

区块链给普通人带来的机会!

CECBC

区块链

JSF在GlassFish管理控制台中的应用_Java_霍太稳@极客邦科技_InfoQ精选文章