クリック可能なテーブル ページのリストを表示するタグを含むカスタム コンポーネント ( 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
component 属性は、ビュー スコープのバッキング Bean を示しています。このバッキング Bean とそのpages
属性currentPage
は getter を介して表示され、changePage
メソッドは呼び出すアクションです。component 属性は、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
デバッグすると、2 つの方法のいずれにも実行が入らないことがわかりました。この問題が に関連しているかどうかはわかりませんがui:repeat
、それを除けば、同じメカニズムが他の目的にも機能することがわかります。
なにか提案を?