没有合适的资源?快使用搜索试试~ 我知道了~
JSF第18章,JSF第18章
资源详情
资源评论
资源推荐
UIHeadlineViewer:
一个复合的数据感知组件
本章内容
使用 RSS 提要
编写 DataModel 类
子类化 UIData
构建复合组件
SS 最近非常热门。它代表真正简单的内容辛迪加(联合)、RDF 站点概要(RDF Site
Summary),也可以什么都不代表,这取决于你正在和谁交谈。基本上说,它是基于 XML
的内容,或者概要,或者 Web 站点的联合格式。它通常被用于博客(weblog/blog)和新闻站点。
我最近阅读的几乎所有 Web 开发的书籍都至少包含一个处理 RSS 提要的例子,所以我觉得这本
书也应该与它们一样。在这一章,我们将构建一个组件来显示来自任何发布这种提要的站点的
RSS 提要(有不计其数的这种站点,见[Syndi8],它有一个综合性目录)。
UIHeadlineViewer 组
件示于图 18-1。
图 18-1 UIHeadlineViewer 是显示外部 RSS 的组件
R
第18章
554 第五部分 编写定制组件、呈现器、验证器和转换器:示例
注解
本章代码清单中的代码忽略了部分代码。你可以从本书站点
http
:
//www.manning.com/mann
下载完整源代码。
从图中你可以看到,添加 UIHeadlineViewer 到 Web 站点中的一个现有页面中是多么容易。
这种情况很常见——很多站点都显示来自其他站点的内容要点,通常还是在首页中。如果有一个
处理解释 RSS 文件复杂性的 API,通过表格呈现器用标准的
UIData 组件来显示内容要点是完全
可能的。但是这样做需要一些工作,特别是在你不知道想要如何显示你的表格之时。
在需要某一标准组件的特征,但是又需要一组特定的子组件或者属性集的情况下,就可以子
类化该组件,然后在代码中添加适当的子组件。我们称之为复合组件。
UIHeadlineViewer 就
子类化了
UIData,还添加了显示条目标题、描述以及其他属性的子组件。因为它子类化的是标
准组件,我们可以用标准的表格呈现器来使用它,而不需要开发自己的呈现器。使用
UIHeadlineViewer 比使用原来的 UIData 组件还要简单一些。
因为
UIHeadlineViewer 子类化了 UIData,所以它是数据感知的——即它可以运行于
DataModel 对象之上。JSF 包括了包装集合、结果集以及独立对象的 DataModel 对象。对于
UIHeadlineViewer 来说,我们将创建 DataModel 子类 ChannelDataModel,由它来使用 RSS
提要。图 18-2 展示了涉及实现
UIHeadlineViewer 的各种要素。
图 18-2 UIHeadlineViewer 组件的类和配置文件。组件子类化了 UIData,并被标准 Table
呈现器所用。它还使用了 DataModel 子类 ChannelDataModel。这里还有一个定制
标签处理器 HeadlineViewer_TableTag,它子类化了 HtmlTableBaseTag(它有
HTML 表格的所有 HTML 直通属性)
JSP 集成
标签库描述符(TLD) JSF 配置
<<使用>>
<<使用>>
<<使用>>
<<使用>>
<<接口>>
StateHolder
<<接口>>
NamingContainer
UIComponent
UIComponentBas
e
TableRendere
r
UIDat
a
-rende
r
erType
UIHeadlineViewe
r
channelDataModel
DataModel
HtmlTableBaseTag
HtmlBaseTag
UIComponentTag
HeadlineViewer_TableTag
第 18 章 UIHeadlineViewer:一个复合的数据感知组件 555
在深入到实现这些类的细节之前,我们来看看用来处理 RSS 提要的底层 API。
18.1 RSS 和 Informa API
从概念上讲,RSS 提要十分简单。提要被组织到频道中,而频道可以包含具有标题、发布日
期以及描述等属性的独立条目。一个 Web 站点可以产生多个频道,比如一个用于所有的内容要
点,而其他则用于各种特别的主题。例如,代码清单 18-1 就展示了 JSF Central 发布的 RSS 片段,
该站点是 JSF 社区站点。
代码清单 18-1 来自 JSFCentral 的 RSS 提要片段
556 第五部分 编写定制组件、呈现器、验证器和转换器:示例
之所以 RSS 解析变得很复杂,是因为目前有多个版本的 RSS,而它们各自都有自己的一套
东西。不同的站点使用不同的版本,有些还同时使用多个版本。为处理支持多种不同提要的复杂
性,最好使用一个第三方库。这个库应该能够将所有不同的提要规范化为通用的对象模型,这使
得我们的工作要稍微愉快一些。对于这个例子,我们使用开源的 Informa API。Informa 有很多有
用的特征,比如文本搜索和持久化。但是,对我们的目的来说,我们只接触处理来自 URL 的 RSS
提要以及对其进行管理的基础 API。
注解
本章中的代码基于
Informa v0.45
。新版本可能会发生变化。
RSS 频道在 Informa 中是由 ChannelIF 接口表达的。每个 ChannelIF 都有诸如
updatedDate、title、creator、description 之类的属性。它也具有频道的各个条目的列表,
而这些条目被实现为
ItemIF 实例。而每个 ItemIF 都有诸如 title、creator、date、found
以及 description 之类的属性。ChannelIF 对象由实现 ChannelBuilderIF 接口的类创建。而
ChannelBuilderIF 实现则以某种方式持久化频道——在内存或者在数据库中。可以从 RSS-
Parser
类获得新的 ChannelIF 实例:
这里,我们用 RSSParser 来根据新的 ChannelBuilder 实例以及特定的 URL 创建新的
ChannelIF 实例。ChannelBuilder 是在内存中保存新频道的 ChannelBuilderIF 的具体实现。
获得
ChannelIF 实例后,我们可以访问所有想要访问的频道属性以及频道的条目列表:
第 18 章 UIHeadlineViewer:一个复合的数据感知组件 557
这段代码获取了频道中所有条目的列表,然后输出每个条目的一些属性。它会产生类似以下的
输出:
注意这里与代码清单 18-1 中展示的 RSS 提要的内容是匹配的。
使用内存中的
ChannelBuilder 并且直接使用 RSSParser.parse 对于简单的例子可以工
作得很好,但是如果想要经常显示相同的提要(特别是在 Web 应用中),重新载入未改变的提要
是提高性能的一个手段。Informa 有个
FeedManager 类可以缓存 ChannelIF 实例,并且在内容
发生改变时或者提要过期时刷新它们。下面是用
FeedManager 而不是从 RSSParser 获得
ChannelIF 实例的例子:
默认情况下,FeedManager 内部用 ChannelBuilder 类来在内存中管理提要。addFeed 方法返
回一个
FeedIF 实例,它提供了有关频道的各种元数据。其实我们对 ChannelIF 实例自身更感
兴趣,它可以通过
FeedIF 的 getChannel 方法获得。这段代码产生与前面代码相同的输出内容,
除在必要的情况下提要不会重新载入。
剩余32页未读,继续阅读
xsglovelgx
- 粉丝: 1
- 资源: 18
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0