PageNavigator のPageableListView
を
DataView
に
経緯
Stateless な
[1] 意味不明だったら
PageableListView に ついて
PagingNavigator (StatelessPagingNavigator の
IPageable な
PageableListView は、
以下のように、
抜粋
// Add FestivalListView PageableListView<Festival> festivals = newFestivalListView(parameters.get(PAGING_PAGE_PARAMETER).toLong(0)); add(new StatelessPagingNavigator("navigator", parameters, festivals)); add(festivals);
newFestivalListView(long l) ページング表示件数に
関わらず、 PageableListView
は要素全件を 取得する 実装に なります。
1万件あって、 1万件取得しても、 20件しかなければ、 20件だけ 描画と なります。 private PageableListView<Festival> newFestivalListView(long l) { LoadableDetachableModel<List<Festival>> festivals = new LoadableDetachableModel<List<Festival>>() { private static final long serialVersionUID = 7474274077691068779L; @Override protected List<Festival> load() { // Get ListView Elements FestivalRepository repository = _new(FestivalRepository.class); return repository.findAll(); } }; int itemsPerPage = 20; PageableListView<Festival> listView = new PageableListView<Festival>("festivals", festivals, itemsPerPage) { private static final long serialVersionUID = -6536722749788422260L; @Override protected void populateItem(ListItem<Festival> item) { item.add(new Label("siteUrl")); PageParameters param = new PageParameters(); Festival fes = item.getModelObject(); param.add("id", fes.getId()); Link link = new BookmarkablePageLink<>("festivalLink", FestivalDetailPage.class, param); link.add(new Label("festivalName", fes.getName())); item.add(link); byte[] imageData = fes.getThumbalizr(); Component component = null; if (imageData != null) { component = new InlineImage("festvalImage", imageData); } else { component = new ExternalImage("festvalImage", "/static/images/no_image.png"); } item.add(component); // item の css に category を追加 String css = "category-" + String.valueOf(fes.getHeldYearId().getHeldYear()); item.add(AttributeModifier.append("class", css)); } }; // ListView を 表示する listView.setVisible(true); // MarkupI を 表示する listView.setOutputMarkupId(true); return listView; }
DataView に ついて
PageableListView
のDataView
と、IDataProvider
の
1万件ある
[2] 件数次第ですが、
newFestivalDataView(long l)
private DataView<Festival> newFestivalDataView(long l) { final FestivalRepository repository = _new(FestivalRepository.class); IDataProvider<Festival> dataProvider = new IDataProvider<Festival>() { @Override public void detach() { // Do Nothing... } @Override public Iterator iterator(long offset, long limit) { return repository.findWithHeldYearAndThumbalizrByLimitAndOffset((int) limit, (int) offset).iterator(); } @Override public long size() { return repository.getRecordCount(); } @Override public IModel model(Festival o) { return new LoadableDetachableModel() { @Override protected Festival load() { return o; } }; } }; int itemsPerPage = 20; DataView<Festival> dataView = new DataView<Festival>("festivals", dataProvider, itemsPerPage) { private static final long serialVersionUID = -9200004825371647245L; @Override protected void populateItem(Item<Festival> item) { item.add(new Label("siteUrl")); PageParameters param = new PageParameters(); Festival fes = item.getModelObject(); param.add("id", fes.getId()); Link link = new BookmarkablePageLink<>("festivalLink", FestivalDetailPage.class, param); link.add(new Label("festivalName", fes.getName())); item.add(link); byte[] imageData = fes.getThumbalizr(); Component component = null; if (imageData != null) { component = new InlineImage("festvalImage", imageData); } else { component = new ExternalImage("festvalImage", "/static/images/no_image.png"); } item.add(component); // item の css に category を追加 String css = "category-" + String.valueOf(fes.getHeldYearId().getHeldYear()); item.add(AttributeModifier.append("class", css)); } }; // ListView を 表示する dataView.setVisible(true); // Markup を 表示する dataView.setOutputMarkupId(true); return dataView; }
説明1
IDataProvider
をインナークラス定義して、 必要な メソッドを 実装しています。 で@Override public Iterator iterator(long offset, long limit) { return repository.findWithHeldYearAndThumbalizrByLimitAndOffset((int) limit, (int) offset).iterator(); }
必要な 範囲の データを 取得する。 で@Override public long size() { return repository.getRecordCount(); }
データ件数を 返すように 実装しています。 の@Override public IModel model(Festival o) { return new LoadableDetachableModel() { @Override protected Festival load() { return o; } }; }
ロジックの 妥当性は ちょっと わからないですが、 Users forum - Loadable-detachable model for ListView
等で、似た様な 実装を 見かけたので 同じように 実装しています。 3
[3]おそらく、 セッションを 確立して 30分以内とかそういう レベルであれば、 問題なく 動作すると 思います。 説明2
DataView
自体の実装は、 PageableListView
を使う 実装と ほぼ 変わりないです。
肝は、IDataProvider
なのかと思いました。 説明3
StatelessPagingNavigator
に対して DataView
を設定していますが、
DataView
自体がStateless
なのか問題なく 動作しました。
Google でStatelessDataView で 検索すると、 ヒットしますが、 DataView
を直接使用しても 問題なく Stateless
になりました。
以上です。Stateless
を
面倒くさいですが。
大きな
面倒である
Stateful に
も
コメント