JSF 2 自定义组件,在 ui:repeat 内带有 h:commandLink

发布于 2024-12-23 04:41:06 字数 2169 浏览 3 评论 0原文

我开发了一个自定义组件(受到这篇文章的启发 by 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 有关,但忽略它,我可以看出相同的机制确实适用于其他目的。

有什么建议吗?

I developed a custom component (inspired by this article by BalusC) that contains a ui:repeat tag displaying the list of clickable table pages.
Inside the loop block there is a h:commandLink that calls asynchronously an action, posting a parameter. The parameter value changes at every loop. Here's the page code:

[...]
<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>
[...]

Now, the cc.attrs.pager component attribute is noting else that the view-scoped backing bean, whose pages and currentPage attributes are visible through getters, and changePagemethod is the action to call. The cc.attrs.render component attribute is the target to be refreshed after every action execution. Here is the relevant bean code:

[...]

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.
}

[...]

The initial render is perfect: all the page links are correctly shown and the current page number is not linked, as desired. The problem reveals going to another page: nothing happens.
Although the h:commandLink action is posted with the exact loop parameter value, the response returns always the same page (the first).
Debugging it, I observed that the execution doesn't enter in any of the two changePage methods.
I'm not sure if this issue is related to ui:repeat, but omitting it, I can tell that the same mechanism does work for other purposes.

Any suggestion?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

篱下浅笙歌 2024-12-30 04:41:06

我认为您应该尝试将 替换为

I think you should try replacing <ui:repeat> with <c:forEach>

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文