我开发了一个自定义组件(灵感来自this article,BalusC),其中包含一个ui:repeat
标签,显示可点击表格页面的列表。
在循环块内部有一个h:commandLink
,它异步调用一个操作,发布一个参数。参数值在每个循环都会改变。这里的页面代码:带有h:commandLink的JSF 2自定义组件ui:重复
[...]
<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
组件属性指出否则该视图范围的支持豆,其pages
和currentPage
属性是通过吸气剂可见,并且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
有关,但省略它,我可以告诉相同的机制可以用于其他目的。
有什么建议吗?
感谢您的答复更换
<ui:repeat>
。你能解释我为什么要这样做吗? – ruphus 2011-12-28 13:03:15它工作吗?如果你正在使用莫哈拉,''是越野车。你不应该使用它。 –
2011-12-28 13:06:40
其实我正在使用Mojarra 2.0.6。该错误应该是[这一个](http://java.net/jira/browse/JAVASERVERFACES-1807)。你给的解决方案工作正常。感谢您的支持! – ruphus 2011-12-28 13:41:31