通过“查看参数”功能进行书签

时间:2012-11-06 11:16:25

标签: jsf jsf-2 bookmarks

虽然使用带有JSF隐式导航的includeViewParams=true查询参数,是否可以实现书签?如果是,那怎么办?

1 个答案:

答案 0 :(得分:17)

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

书签性与您在浏览器地址栏中看到的确切形式的HTTP请求URL有关。这正是最终用户将其存储在其书签中的URL和/或将copypaste作为其他地方的链接,例如论坛,聊天框,某些社交媒体或仅仅是新的浏览器窗口/标签等。当遵循链接时或者将URL复制到浏览器的地址栏中,然后默认情况下将触发HTTP GET请求。如果每次结果完全相同(留下授权/身份验证以及页面搜索结果的时间敏感性,最后新闻等等 - 外部考虑),那么我们可以讨论可收藏的URL 。技术术语是“idempotent HTTP请求”。

如果最终用户事先在该URL上提交了一个POST表单,但尚未执行重定向,则该URL不一定是可收藏的。提交的表单数据不会反映在URL中。将URL复制到新的浏览器窗口/选项卡可能不一定会产生与表单提交后完全相同的结果。这样的URL不是可收藏的。 POST不是幂等的。这就是为什么page-to-page navigation by commandlinks is bad

书签性通常通过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

这些是可收藏的网址,而includeViewParams使这些网址更加便捷。