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



我开发了一个自定义组件(受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有关,但省略它,我可以告诉您相同的机制确实适用于其他目的。

任何建议吗?

我想你应该试着用<c:forEach>代替<ui:repeat>

相关内容

  • 没有找到相关文章

最新更新