11

includeViewParams=true通过使用带有 JSF 隐式导航的查询参数是否可以实现书签功能?如果是,那么如何?

4

1 回答 1

21

首先,我们需要了解究竟什么是“书签性”以及究竟是什么includeViewParams。这样可以更好地理解两者结合的效果。

如您在浏览器的地址栏中看到的,可收藏性与 HTTP 请求 URL 的确切格式有关。这正是最终用户将存储在其书签中和/或将复制粘贴为其他地方的链接的 URL,例如论坛、聊天框、某些社交媒体或只是一个新的浏览器窗口/选项卡等。当链接被点击时或者将 URL 复制粘贴到浏览器的地址栏中,则默认情况下会触发 HTTP GET 请求。如果结果每次都完全相同(将授权/身份验证和页面的时间敏感特性——搜索结果、最新消息等——排除在外),那么我们可以讨论一个可收藏的 URL。技术术语是“幂等HTTP 请求”。

但是,如果最终用户事先在该 URL 上提交了一个 POST 表单,而该表单没有执行重定向,则该 URL 不一定是可收藏的。提交的表单数据不会反映在 URL 中。将 URL 复制粘贴到新的浏览器窗口/选项卡可能不一定会产生与表单提交后完全相同的结果。这样一个 URL 就不能加入书签。POST 不是幂等的。这就是为什么通过命令链接进行页面到页面导航不好的原因。

可书签性通常通过 URL 路径和/或查询参数的特定构造来实现。如果您查看 Google,由于q查询字符串参数,搜索结果是可收藏的。

http://google.com/search?q=bookmarkability

在 JSF 术语中,可以通过以下方式设置(并转换和验证)这些请求参数<f:viewParam>

<f:metadata>
    <f:viewParam name="q" value="#{bean.query}" />
    <f:viewAction action="#{bean.search}" />
</f:metadata>

如果您需要执行例如分页,并且您希望保持 URL 可收藏,那么您可以添加另一个请求参数:

http://google.com/search?q=bookmarkability&start=10

<f:metadata>
    <f:viewParam name="q" value="#{bean.query}" />
    <f:viewParam name="start" value="#{bean.start}" />
    <f:viewAction action="#{bean.search}" />
</f:metadata>

includeViewParams="true"基本上在生成的 GET 链接中包含所有这些视图参数。借助此功能,分页链接可以如下所示,无需重复q参数:

<h:link value="1" outcome="search" includeViewParams="true">
    <f:param name="start" value="#{null}" />
</h:link>
<h:link value="2" outcome="search" includeViewParams="true">
    <f:param name="start" value="10" />
</h:link>
<h:link value="3" outcome="search" includeViewParams="true">
    <f:param name="start" value="20" />
</h:link>
...

(当然是由一些<ui:repeat>左右产生的)

当进入带有 的页面时q=bookmarkability,这将产生以下链接

/search.xhtml?q=bookmarkability
/search.xhtml?start=10&q=bookmarkability
/search.xhtml?start=20&q=bookmarkability

这些是可收藏的 URL,includeViewParams使创建它们更加方便。

于 2012-11-06T12:12:38.943 回答