2012-09-22 156 views
7

我将PrettyFaces与JSF 2以及<h:link><f:param>标签广泛地用于获取可加入书签的页面(最好忘记JSF应用程序中的所有POST请求)。使用JSF ajax请求刷新URL

但是,其中一些链接仅改变页面的一小部分(主要是当用户停留在同一视图中时),因此改为发送一个jax请求更好。但是,<f:ajax>不能与<h:link>一起使用,只能使用<h:commandlink>。我可以通过一个命令链接以多种方式发送参数,但在这种情况下,请求后URL保持不变。因此它与页面内容不同步,并且不可刷新。

我见过使用链接发送GET和ajax请求混合的链接(指向一个新的url,同时用ajax修改页面),但到目前为止我还没有找到任何解决方案。

ajax请求完成后(或当用户点击)后,我可以用jsf刷新url吗?或者我必须使用一些外部JS库?

编辑:这里需要的JS库是新的JavaScript历史API。 More info. 我猜JSF目前不使用这个API。但是我仍然从JSF开发人员的角度对这个问题感兴趣。

此外,计划将来的JSF版本?结合<f:ajax><h:link>将是一个完美的解决方案。

+0

我在几个月前就看过OmniFaces。这不幸并不便宜/不重要。完全相同的更改URL应该能够完全返回所需的JSF视图状态,包括所有ajax更改,这些更改由单个简单GET请求的回发执行。以应用程序范围(会话无关)的方式实现此目的的所有必要信息都使GET URL非常冗长。有很多方法可以缩短网址,但仍然...然后我没有考虑到组件库的细节。 – BalusC

+0

谢谢你的回应。不过,我并不完全了解它。我认为应该由开发者负责设置一个URL,在刷新时给出完全相同的页面 - 视图应该处理请求属性等。实际上,我已经这样做了,因为''生成一个非ajax GET链接 - 我都希望发送一个ajax请求,并将URL设置为之前由''生成的URL。它可以是''或其他任何东西,重点是它应该像这样工作。 – apcuk

+0

如果目的是纯粹的页面到页面导航,那么它确实会更容易实现。但是''通常被用于许多其他更有用的东西,而不仅仅是导航。 *那部分不是微不足道的。 – 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>