JSF:带有viewscope的书签功能



我正试图使我的应用程序"书签",我使用视图参数来实现它。

我认为我仍然没有找到正确的方法在JSF中正确地做到这一点,即使在阅读了这篇文章和其他许多文章之后。

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

例如,有一个类似http://company.com/users?id=4的URL,一旦该页面执行非ajax回发(例如,用于上传数据),URL就变成http://company.com/users。应用程序继续正常工作,但链接不再是"书签"。

是否有办法防止非ajax回发从URL中删除viewParams ?

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

我也可以用相同的参数重定向到相同的页面,并让应用程序重新创建视图作用域bean,但然后我真的没有看到任何好处超过请求作用域bean…

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

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

或者,根据已经使用OmniFaces的评论,您也可以使用它的<o:form>组件,它基本上扩展了<h:form>includeViewParams属性,其工作原理与<h:link><h:button>非常相似。

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

这样,所有的<f:viewParam>值都将在表单action URL中结束。

参见:

  • post后在JSF中处理视图参数

最新更新