是否可以通过将includeViewParams=true查询参数与JSF隐式导航一起使用来实现书签功能?如果是,那是怎么做的?
发布于 2012-11-06 20:12:39
首先,我们需要了解什么是“书签能力”,以及includeViewParams到底做了什么。这样可以更好地理解两者结合的效果。
Bookmarkability与HTTP请求URL的格式有关,正如您在浏览器的地址栏中看到的那样。这正是最终用户存储在书签中的URL和/或复制到其他地方的链接,例如论坛、chatbox、一些社交媒体,或者只是一个新的浏览器窗口/选项卡等。当一个链接被跟随或URL被复制到浏览器的地址栏时,默认情况下将触发HTTP GET请求。如果每次的结果都是完全相同的(不考虑授权/身份验证和页面-search结果、最新新闻等的时效性),那么我们可以讨论一个可加书签的URL。技术术语是“idempotent HTTP请求”。
但是,如果最终用户事先在该URL上提交了POST表单,而没有执行重定向,则该URL不一定是可加书签的。提交的表单数据不会反映在URL中。将URL复制到新的浏览器窗口/选项卡中不一定会产生与表单提交后完全相同的结果。这样的URL是不可加书签的。POST不是幂等的。这就是为什么page-to-page navigation by commandlinks is bad。
书签能力通常是通过URL路径和/或查询参数的特定结构来实现的。如果你看一下谷歌,多亏了q查询字符串参数,搜索结果是可加书签的。
http://google.com/search?q=bookmarkability
在JSF术语中,可以通过设置(以及转换和验证)这些请求参数
<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使创建它们变得更加方便。
https://stackoverflow.com/questions/13249844
复制相似问题