OmniFaces:针对 Java Server Faces 的工具库

  • Kostis Kapelonis
  • 侯伯薇

2012 年 8 月 19 日

话题:JavaHTML5语言 & 开发架构

OmniFaces是一套工具库,试图让针对企业应用程序的JSF开发更轻松。它是由Bauke Scholtz(也就是BalusC)和Arjan Tijms创建的。他们都经常在知名的Stack Overflow Q/A 网站上做出贡献,从 Stack Overflow 的问题中,他们发现了一些常见的 JSF 2.x 问题,之后就实现了 OmniFaces。尽管名字叫做 OmniFaces,但它并不是另一种 JSF 的实现。相反,它使用多种辅助程序和针对特定问题的解决方案补充了现存的 JSF 类库。案例展示实际上是基于PrimeFaces的。

OmniFaces 库对很多特性都做了扩展,包括:

  • 突出显示没有通过验证的字段
  • 将常量值导入到 EL 范围内。
  • 自动把模型对象转换到下拉框和其他选择组件中。
  • 多字段的验证器,它针对“所有或没有(all or none)”、“全部相等(all equal)”、“一个或多个(one or more)”、“全部按顺序排列(all in order)”和“唯一(unique)”的验证器。
  • HTML5 渲染工具,它向 UIForm 和 UIInput 组件增加了对多种 HTML5 专用的属性的支持。
  • 完整的 Ajax 异常处理程序。
  • 每个级别都带有完整自定义标记的树状结构(对各种递归情况很有用)。
  • 针对 EL 函数的集合,用来处理数组、转换、日期和字符串。
  • 针对 HTTP 响应的 GZIP 压缩过滤器。
  • 在 Facelets 中包含 Servlets 和 JSP 页面。

InfoQ 联系了 OmniFaces 的作者,请他澄清一些问题,首先我们谈论了创建这个类库的原因。他们指出,JSF 缺少Apache CommonsGuava的等价类库,从而”所有公司或者 JSF Web 应用程序的开发者都会开发自己的系列工具,当第一次做的时候会耗费大量时间,并且易于出错。“ 他们还指出,在 JSP 应用程序中有大量经常发生的问题,像“在 Ajax 更新之前重置不可用但没有处理的输入组件,或者拥有完整的能够感知 Ajax 的、使用标准的 web.xml 错误页面机制的异常处理程序,以及下拉项目所需要的通用转换器”,这些在 OmniFaces 库中都有提供。

由于现在已经有大量 JSF 类库,包括PrimeFacesRichFacesICEFaces等,接下来我们将 OmniFaces 与它们进行一下比较。

OmniFaces 没有提供任何带有自定义渲染器的可视化组件(从而可以通过生成的 CSS/JS 达到很炫的感观和改善的行为)。OmniFaces 没有创建新的组件和 TagHandler,而是改善了现存的核心 JSF 组件和 TagHandler,像 f:viewParam、f:converter、f:validator、h:form 和 h:outputLabel。

除了组件和 TagHandler,OmniFaces 还提供了大量可重用的工具,让 JSF 开发更轻松,而不需要重新造轮子。以上提到的任何一种类库都没有提供这种特性。

所以,尽管 PrimeFaces、RichFaces 和 ICEFaces 看起来主要是专注于可视化组件(widgets),但 OmniFaces 更多关注于工具和 JSF 中的缺点和问题。你可能会说那三种都是 JSF 组件库,而 OmniFaces 是 JSF 的工具库。

InfoQ: 你能改善一种现存的 JSF 框架,而不是创建新的框架吗?

理论上我们可以,但是我们不喜欢那样做。我们想要创建一套工具库,可以为所有 JSF 的 Web 应用程序所用。然而,我们对ResetInputAjaxActionListener做了一些特别针对 RichFaces 的周边工作,因为在 RichFaces 对 PartialViewContext 的实现中有未解决的缺陷。

InfoQ: 你们在 Stack Overflow 看到了哪些重复出现的问题?

其中的一些问题包括:需要没有标签的树组件(makeup-less tree component);使用 IE 条件注释的笨拙方法;需要 f:selectItems 转换器,它会对提供的条目进行转换,而不是做昂贵的 DAO 调用;需要重置输入的字段,它在上一次 Ajax 请求中没有通过验证,但是需要在当前的 Ajax 请求中更新;能够感知 Ajax 的错误处理程序。其中几乎什么都有。

现在,我们的路线图很大程度上是由我们看到人们在使用 JSF 时所遇到的问题来决定的。这意味着我们不会坐下来,然后为我们认为很棒的东西做计划,而是对现实中的问题做出响应。这种工作方式不是固定的,我们可能会在认为必要的时候引入一些特性,但是现在几乎都是在解决人们的问题。

InfoQ: 还有什么想要和 InofQ 读者说的吗?

我们可能需要强调的一点是,我们并不想要成为 PrimeFaces(和 RichFaces)的竞争对手。相反,我们都是 PrimeFaces 的铁杆粉丝,并且在参与的商业应用程序中每天都在使用。我们使用 PrimeFaces 构建了 OmniFaces 的演示应用程序,并且清楚地提到这一点,这已经足够说明上面的说法了。

OmniFaces 最近发布了1.0 版本 (在 Maven 中还没有提供1.1 版本的更新)。 想要了解更多信息,你可以参见博客Javadoc以及标签库信息

查看英文原文:OmniFaces:A Utility Library for Java Server Faces
JavaHTML5语言 & 开发架构