虽然使用带有JSF隐式导航的includeViewParams=true
查询参数,是否可以实现书签?如果是,那怎么办?
答案 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
查询字符串参数,搜索结果可以收藏。
在JSF术语中,可以通过<f:viewParam>
设置(并转换和验证)这些请求参数:
<f:metadata>
<f:viewParam name="q" value="#{bean.query}" />
<f:viewAction action="#{bean.search}" />
</f:metadata>
如果你需要执行例如分页,并且你想保持URL可书签,那么你可以添加另一个请求参数:
与
<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
使这些网址更加便捷。