如何将JSF Ajax与具有书签功能的视图相结合?

时间:2012-03-10 23:24:44

标签: jsf-2

我有一个 p:dataTable 以及一些改变其内容的控件,例如页码,排序和过滤器参数。控件调用AJAX交互,以便每个更改调用SQL查询到后端,但只更新客户端浏览器中的表。这就是应该的样子,对吗?

我无法弄清楚是使视图书签能够的最佳做法。将书签参数放入支持bean很容易,例如:

        <f:metadata>
            <f:viewParam name="orderNo" value="#{bean.orderNo}" />
            <f:viewParam name="sortOrder" value="#{bean.sortOrder}" />
            <f:viewParam name="showOpenItems" value="#{bean.showOpenItems}" />           
            <f:viewParam name="page" value="#{bean.page}" />
            <f:viewParam name="pageSize" vlaue="#{bean.pageSize}" />
        </f:metadata>

所以说我添加一个radioButton控件来更改sortOrder。它可能看起来像这样:

<p:selectOneRadio value="#{bean.sortOrder}">
   <p:ajax update="@form" />
   <f:selectItem itemLabel="xxx" itemValue="1" />
      (etc)
</p:selectOneRadio>

第一个问题:当启用这个启用AJAX的控件时,有没有办法保留OTHER参数,例如 orderNo 而不诉诸ViewScoped bean?

第二个问题:如何让浏览器的URL栏更新,以便在用户为该页面添加书签时,所有当前的表查询参数都会被保留?

非常感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

您可以使用<f:param>将参数添加到任何组件,并从请求范围的辅助bean中读取它。您可以使用OmniFaces Components.getParams(UIComponent)功能。

<p:selectOneRadio value="#{bean.sortOrder}">
    <p:ajax listener="#{bean.reload()}" update="@form" />
    <f:selectItem itemLabel="xxx" itemValue="1" />

    <f:param name="orderNo" value="#{bean.orderNo}"/>
</p:selectOneRadio>

从请求bean中的组件中检索params:

public void reload()
{
    final FacesContext context = FacesContext.getCurrentInstance();
    final UIComponent component = UIComponent.getCurrentComponent(context);

    List<ParamHolder> params = Components.getParams(component);

    // extract orderNo param and reload your datasource
}

要更新浏览器网址,您可以执行GET请求而不是ajax,也可以使用javascript历史记录API对其进行操作。

对于第一部分,您可以在ajax或命令组件中使用此实用程序请求bean函数。

/**
 * Redirects to the given outcome by building a bookmarkable URL using all
 * child UIParameter's of the current component.
 *
 * @param outcome
 * @param includeViewParam
 *
 * @return
 */
public void performActionParams(final String outcome, boolean includeViewParam)
{
    final FacesContext context = FacesContext.getCurrentInstance();
    final UIComponent component = UIComponent.getCurrentComponent(context);

    List<ParamHolder> params = Components.getParams(component);

    String url = FacesLocal.getBookmarkableURL(context, outcome, params, includeViewParam);
    FacesContextUtils.redirect(context, url);
}