JSF:ViewScoped的书签性

时间:2013-01-07 13:30:21

标签: jsf url parameters postback

我正在尝试将我的应用设为“Bookmarkable”,我正在使用视图参数来实现它。

我认为即使在阅读this以及其他许多人之后,我仍然无法正确地在JSF中做到这一点。

我的问题是在任何非ajax回发之后get参数会丢失,我的意思是,参数值仍然在bean中设置并且应用程序正常工作,但它会从URL中删除,从而使URL无效。 / p>

例如,拥有类似http://company.com/users?id=4的网址,只要该网页执行非ajax回发(例如,用于上传数据),网址就会变为http://company.com/users。该应用程序继续正常工作,但链接不再是“Bookmarkable”。

有没有办法阻止非ajax回发从网址中删除viewParams?

我的用例是能够将页面加入书签以编辑对象,并且我需要能够上传数据(如果不是我不会使用非ajax回发)。我知道如果我想将页面加入书签只查看对象的数据,我就不需要任何回发,但这不是我的情况。

我也可以使用相同的参数重定向到相同的页面,让app重新创建视图范围的bean,但是我真的看不到任何有关请求范围bean的好处......

非常感谢任何建议。

1 个答案:

答案 0 :(得分:2)

此行为是“按设计”。 <h:form>生成带有<form>网址的HTML action元素,不带任何视图参数。同步POST请求只是提交到该URL,因此在浏览器的地址栏中按原样反映。如果您打算在URL中保留视图参数,而使用ajax不是一个选项,那么您基本上需要创建一个自定义ViewHandler,其中getActionURL()被覆盖以包含视图参数。 <h:form>使用此方法生成action网址。

public String getActionURL(FacesContext context, String viewId) {
    String originalActionURL = super.getActionURL(context, viewId);
    String newActionURL = includeViewParamsIfNecessary(context, originalActionURL);
    return newActionURL;
}

或者,由于您的评论基于已使用OmniFaces的评论,您还可以使用<o:form> componentHandling view parameters in JSF after post基本上扩展<h:form> includeViewParams属性与<h:link><h:button>中的内容非常相似。

<o:form includeViewParams="true">
    ...
</o:form>

这样,所有<f:viewParam>值都将以表单操作网址结束。

另见:

  • {{3}}