使用 JSF ajax 请求刷新 URL
Posted
技术标签:
【中文标题】使用 JSF ajax 请求刷新 URL【英文标题】:Refreshing URL with JSF ajax request 【发布时间】:2012-09-14 19:34:02 【问题描述】:我使用 JSF 2 和 PrettyFaces 以及 <h:link>
和 <f:param>
标记广泛地获取可收藏页面(很高兴终于忘记了 JSF 应用程序中的所有这些 POST 请求)。
但是,其中一些链接仅更改页面的一小部分(主要是当用户停留在同一视图中时),因此发送 ajax 请求会更好。但是,<f:ajax>
不能与<h:link>
一起使用,只能与<h:commandlink>
一起使用。我也可以使用命令链接以多种方式发送参数,但在这种情况下,请求后 URL 保持不变。因此它变得与页面内容不同步,并且不可刷新。
我看到一些网站使用的链接发送混合了 GET 和 ajax 请求(在使用 ajax 修改页面时指向一个新的 url),但到目前为止我还没有找到任何解决方案。
我可以在 ajax 请求完成后(或当用户点击)以某种方式用 jsf 刷新 url 吗?还是我必须使用一些外部 JS 库?
编辑:这里需要的 JS 库是新的 javascript History API。 More info. 我猜 JSF 目前不使用这个 API。但从 JSF 开发人员的角度来看,我仍然对这个问题感兴趣。
另外,是否计划在 JSF 的未来版本中发布?将<f:ajax>
与<h:link>
结合使用将是一个完美的解决方案。
【问题讨论】:
几个月前我已经为 OmniFaces 看过它。不幸的是,这并不便宜/微不足道。相同的更改后的 URL 应该能够准确返回所需的 JSF 视图状态,包括所有 ajax 更改,这些更改由单个普通 GET 请求的回发执行。以应用程序范围(独立于会话)的方式实现这一点的所有必要信息使 GET URL 非常冗长。有一些方法可以缩短 URL,但仍然......然后我还没有考虑到组件库的细节。 感谢您的回复。不过,我并不完全理解。我认为设置一个在刷新时返回完全相同页面的 URL 应该是开发人员的责任 - 视图应该处理请求属性等。实际上我已经这样做了,因为<h:link>
生成一个非 ajax GET 链接- 我只想发送一个 ajax 请求并将 URL 设置为先前由<h:link>
生成的 URL。它可以是<h:commandLink>
或其他任何东西,关键是它应该像这样工作。
如果目的是纯粹的页面到页面导航,那么实现起来确实会更简单。但是<f:ajax>
通常用于许多其他更有用的事情,而不仅仅是导航。 那部分不是微不足道的。
我刚刚意识到我误解了故事的一个非常重要的部分。如果我的 commandlink 的 action 方法返回的不是 null(或 void),则无论我是否使用 f:ajax
,都会重新加载整个页面。因此,使用 ajax 请求和响应无法导航到不同的视图。我对吗?然后我的问题就失去了大部分意义。您所说的“<f:ajax>
通常用于许多其他更有用的事情,而不仅仅是导航”是什么意思?如果我是正确的,它不能用于导航。
@BalusC 我不知道你有没有读过我之前的评论(我是新来的),如果你没有读过,可以吗?
【参考方案1】:
<f:ajax>
具有属性 onevent。它采用javascript
函数的名称,该函数将在ajax request
成功完成后调用。因此可以添加 js 函数,该函数将在 ajax 调用完成后导航到所需的 url。比如:
<h:commandLink id="testButton"
value="Test">
<f:ajax event="action"
execute="@form"
render="@none"
listener="#myBean.testButtonClickedHandler"
onevent="navigate"/>
</h:commandLink>
<script type="text/javascript">
function navigate()
window.location.href = "required url";
</script>
【讨论】:
以上是关于使用 JSF ajax 请求刷新 URL的主要内容,如果未能解决你的问题,请参考以下文章