从webapp更新url栏以表示当前状态

时间:2011-05-05 07:49:53

标签: java ajax url jsf jsf-2

我想基本上做杰森要求的here

在一句话中,我希望url栏代表AJAX应用程序的状态,这样我就可以允许它为它添加书签,并允许用户通过使用后面的/后退按钮返回到先前的状态。浏览器。

我的差异(来自杰森的问题)是我使用的是JSF 2.0。 我已经读过JSF 2.0添加了使用get的功能,但我不确定使用它的正确方法。

感谢您的帮助。

进一步澄清

如果我理解正确,为了能够在AJAX webapp中为特定状态添加书签,我将不得不使用location.hash。我对么?我试图在某种意义上实现类似gmail的行为,虽然应用程序是完整的AJAXified并且没有重定向发生,但我仍然可以使用后退/前进和书签(这就是为什么我希望从更新的URL栏更新AJAX应用程序本身,而不是通过重定向)

更新

刚刚找到this类似的问题

2 个答案:

答案 0 :(得分:3)

  

我的区别(来自杰森所说的)是我使用的是JSF 2.0。我已经读过JSF 2.0添加了使用get的功能,但我不确定使用它的正确方法。

请注意,这与维护Ajax状态不同。它通常由片段标识符(URL中以#开头的部分,也称为hashbang)发生。 JSF不为此提供内置组件/功能。到目前为止,我还没有看到一个组件库。但是,您可能会发现this answer对于在JSF中开始使用自行开发的哈希片段处理器很有用。

关于使用GET请求,只需使用<h:link><h:outputLink>甚至<a>即可创建GET链接。您可以h:<f:param>组件中提供请求参数。 E.g。

<h:link value="Edit product" outcome="product/edit">
    <f:param name="id" value="#{product.id}" />
</h:link>

product/edit.xhtml页面中,您可以定义要设置的参数和要在GET请求上执行的操作

<f:metadata>
    <f:viewParam name="id" value="#{productEditor.id}" />
    <f:event type="preRenderView" listener="#{productEditor.init}" />
</f:metadata>

在与product/edit.xhtml页面关联的请求或视图作用域中 - 在此示例#{productEditor} - 中,您只需定义属性和侦听器方法。在模型中收集,转换,验证和更新所有属性后,将执行侦听器方法。

private Long id;
private Product product;

public void init() {
    product = productService.find(id);
}

答案 1 :(得分:0)

通常你会使用AJAX来阻止完整的页面刷新。如果您更改基本uri,AFAIK所有当前浏览器都会发出页面刷新。因此,您必须按照您提供的问题中的建议使用散列部分。

我们遇到了类似的问题并做了类似的事情:

  1. 我们确定用户无法为网址添加书签。
  2. 对于应该是唯一/可收藏的网址,我们使用了不同的链接来发布重定向。这些URL在站点地图中提供。
  3. 对于浏览器,我们在登录后添加了一个中间页面。此页面会导航并重定向到应用程序。导航存储在会话中,并且当服务器获得导航请求(可以是历史记录)时,恢复相应的状态。浏览器返回打开该中间页面,该页面在服务器端发出重定向以及导航请求。