使用 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的主要内容,如果未能解决你的问题,请参考以下文章

JSF 2.0:按 ENTER 时的 ajax 请求

JSF动态包含使用Ajax请求[重复]

在每个 ajax 请求上重建 JSF 视图

发出 JSF Ajax 请求时显示加载进度

JSF ajax 请求中的异常处理

JSF ajax 请求中的异常处理