使用h:commandLink的JSF 2自定义组件在ui:repeat中

时间:2011-12-28 12:32:51

标签: jsf-2 foreach composite-component mojarra uirepeat

我开发了一个自定义组件(受this article BalusC启发),其中包含显示可点击表格列表的ui:repeat标记。
在循环块内部有一个h:commandLink,它异步调用一个动作,发布一个参数。每个循环都会更改参数值。这是页面代码:

[...]
<ui:repeat value="#{cc.attrs.pager.pages}" var="loopPage">
    <li>
        <h:commandLink 
            action="#{cc.attrs.pager.changePage}"
            value="#{loopPage}"
            rendered="#{loopPage != cc.attrs.pager.currentPage}"
            immediate="true"
        >
            <f:param name="selectedPage" value="#{loopPage}" />
            <f:ajax execute="@this" render="#{cc.attrs.render}" />
        </h:commandLink>

        <h:outputText 
            value="#{loopPage}" 
            rendered="#{loopPage == cc.attrs.pager.currentPage}"
        />
    </li>
</ui:repeat>
[...]

现在,cc.attrs.pager组件属性注意到视图范围的辅助bean,其pagescurrentPage属性通过getter可见,并且changePage方法是要打电话的动作。 cc.attrs.render组件属性是每次执行操作后要刷新的目标。这是相关的bean代码:

[...]

private Integer[] pages;
private int currentPage;

[...]

public Integer[] getPages() {
    return pages;
}

public int getCurrentPage() {
    return currentPage;
}

[...]

public void changePage() {
    HttpServletRequest request = (HttpServletRequest) FacesContext
        .getCurrentInstance()
        .getExternalContext()
        .getRequest()
    ;

    String page = request.getParameter("selectedPage");
    changePage(Integer.valueOf(page) * rowsPerPage);
}

public void changePage(int firstRow){
    this.firstRow = firstRow; //Set the first result to be returned
    loadDataList(); // Load requested page.
}

[...]

初始渲染是完美的:所有页面链接都正确显示,并且当前页面编号未根据需要链接。问题显示转到另一页:没有任何反应 虽然h:commandLink操作是使用精确的循环参数值发布的,但响应始终返回相同的页面(第一个)。 调试它,我发现执行没有进入两个changePage方法中的任何一个。 我不确定这个问题是否与ui:repeat有关,但省略了它,我可以说同样的机制可以用于其他目的。

有什么建议吗?

1 个答案:

答案 0 :(得分:2)

我认为你应该尝试用<ui:repeat>

替换<c:forEach>