- PR -

一覧画面のページ切替機能の実装について

1
投稿者投稿内容
ぬべたそ
ベテラン
会議室デビュー日: 2003/12/18
投稿数: 72
投稿日時: 2005-04-18 11:29
いつも参考にさせていただいています。
早速ですが、質問に移らせて下さい。

J2EEで件名にあるような画面を実装しようとしています。
具体的にはデータベースからデータを取得し、その一覧を画面に表示するというものです。
一覧は全件を表示するのではなく例えば20件だけ表示し、件数がそれ以上の場合は次の20件などのリンクによりページの切替をしようと考えています。

このような機能はどこでも必要なものですので、雛型のようなものがあれば利用したいと考え検索したのですが見当たりません。(定石のようなものがあればそのモデルを取り入れて実装したい)

J2EEパターンのValue List Handlerパターン(http://java.sun.com/blueprints/corej2eepatterns/Patterns/ValueListHandler.html)を参考にしたのですが、次の〜件の実現はできるのですが、前の〜件を実現しようとすると簡単にはできないみたいです。

何か参考になりそうな資料をご存知の方がいらっしゃいましたら、ご教授をお願い致します。
(株)ぽち
ぬし
会議室デビュー日: 2002/09/10
投稿数: 376
投稿日時: 2005-04-18 13:55
引用:

taipingさんの書き込み (2005-04-18 11:29) より:
J2EEパターンのValue List Handlerパターン(http://java.sun.com/blueprints/corej2eepatterns/Patterns/ValueListHandler.html)を参考にしたのですが、次の〜件の実現はできるのですが、前の〜件を実現しようとすると簡単にはできないみたいです。



こんにちわ。

Value List Handlerパターンは知らなかったのですが、参照ページを見るに
GetPreviousなる動作もあるので、「前へ」も考慮されている作りではないのでしょうか。

以前このような動きのものを作ったことがありますが、session保持タイプ、毎回
更新タイプなど、パターンだけでなく要件によって考慮すべき点もあると思います。
# 例えば、検索結果が大量にあるタイプでsessionに保持するタイプだとメモリ圧迫
# 例えば、常に最新の情報が欲しい要件でsessionに保持するタイプだと要件満たせず
# 例えば、session保持より更新タイプの方が最新情報取得はできるが、速度が遅い

どちらにせよデザインパターン自体は参照のページにあるような形で良いかと思います。
実際私が実装した時も似たようなクラス設計でした。
# もちろん参照ページのような洗練された設計ではないですが
ぬべたそ
ベテラン
会議室デビュー日: 2003/12/18
投稿数: 72
投稿日時: 2005-04-18 14:23
ぽちさん、ご返信ありがとうございます。
引用:

Value List Handlerパターンは知らなかったのですが、参照ページを見るに
GetPreviousなる動作もあるので、「前へ」も考慮されている作りではないのでしょうか。

どちらにせよデザインパターン自体は参照のページにあるような形で良いかと思います。
実際私が実装した時も似たようなクラス設計でした。
# もちろん参照ページのような洗練された設計ではないですが


getPreviousメソッドを使ってみたのですが、欲しい機能が実現できませんでした。
例えば、一覧を取得して5件(Item1-Item5)ヒットしたとします。1ページ辺り三件表示するとなると、
1ページ目:
Item1
Item2
Item3
2ページ目:
Item4
Item5
となるかと思います。
そこで、getPreviousメソッドを使って前のページに戻す場合、1ページ目の
Item1
Item2
Item3
が表示されて欲しいところですが、
Item5
Item4
Item3
と、逆順で取得されてしまいますし、Item5やItem4も再度表示されてしまいます。

そもそも、Value List Handlerパターンの使いどころを間違っているのかもしれません。
一覧を配列で持たせ、ページごとに開始と終了のインデックスを管理すればできそうなのですが。
(株)ぽち
ぬし
会議室デビュー日: 2002/09/10
投稿数: 376
投稿日時: 2005-04-18 14:45
確かに参照ページのサンプルを見ると、そのような動きの実装に
なっているみたいですね。

ただ、デザインパターンはあくまでデザインなので、提示されて
いるコードもサンプルです。

各メソッド(動作)は自分で決めれますので、要件に合った実装
を考えてみてはどうでしょう?

・どこかでcurrentのindexを取得できるようなメソッドを作る(getCurrentいじる?)
・getNext,getPreviousではindexからcount分情報を取得する

とかめちゃくちゃ簡単に考えるとできそうな、できなさそうな。

まあ、現在出ている問題点は下記が原因でしょう

・逆順で取得されてしまう
->ListIterator#previousを使用しているから

・Item4,5ではなくItem3,4,5を取得する
->Iteratorのcurrent(最終行)から指定個数分(3行)戻って取得する実装になっているから
ぬべたそ
ベテラン
会議室デビュー日: 2003/12/18
投稿数: 72
投稿日時: 2005-04-28 12:14
(株)ぽちさん、大変返信が遅くなり申し訳ありません。

「デザインパターンはあくまでデザインなので」という一言で、デザインパターンにとらわれずに実装することができました。
具体的には、デザインパターンのようにListIteratorで要素を持つのではなく、単なるオブジェクトの配列(Object[])として保持し、ページごとに配列の開始のインデックスと終了のインデックスを管理して、〇〇ページは配列のどこからどこまでを使うという感じの実装です。

おかげで動作するものを作ることが出来ました。
ありがとうございました。

追伸:ページの切替機能に関して、もっといい実装方法やメジャーな方法など、サンプルや情報を引き続きお待ちします。
今回作ったものは色々な所で使えそうなので、より良い設計、実装になったらと考えています。
1

スキルアップ/キャリアアップ(JOB@IT)