【发布时间】: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 我不知道你有没有读过我之前的评论(我是新来的),如果你没有读过,可以吗?
标签: javascript ajax jsf-2 browser-history