はじめまして。主にエンハンスで活動しております。
今回はフレームワークにMyBaisを用いたWebページの話です。
既存の画面にも明細1行に複数行のレコード情報を取得しているページはあったのですが、せっかくのMyBatisですから、一度に複数のレコードを取得したいと思い、200行くらいのレコードをMyBatisの機能で1オブジェクトに変換しました。200行が1オブジェクトになるんですよ。1オブジェクトの中にListがあって、それが10サイズのリストになっていて、さらにListを含んでいる。そういうオブジェクトがMyBatisのresultMapでできちゃうんですから驚きです。
画面にも、200オブジェクトではなく1オブジェクトとして送られてくるので、1行分です。嬉しいですね。
ここで、明細エリアの説明をしたいと思います。明細エリアにはページ切り替えがついていて、1ページの表示件数は10件です。DB上では200行取得できていましても、行数としては1行分にあたりますので、ページ切り替えは発生しません。ところが、崩れました。ページ切り替えの部品が。
ページ切り替えのオブジェクトはPageDtoというものを使っていまして、中身はこんな感じです。
/** 件数 */
private Integer count;
/** 表示している明細の開始行数 */
private Integer indexFrom;
/** 表示している明細の終了行数 */
private Integer indexTo;
/** 表示している明細欄の次ページ */
private Integer indexNext;
/** 表示している明細欄の前ページ */
private Integer indexPrev;
/** 表示している明細欄の最終ページ */
private Integer indexMax;
今回は、1行が複数レコードで構成されるので、それが原因だろうと考え、このPageDtoにステップ数を追加しようと思いました。ただし、その改修方法ですと、既存のPageDtoにも影響が出るため、試験範囲を広げなければなりません。
そこで、このPageDtoに値を設定する共通サービスを修正することにしました。それでは、その共通サービスを見てみましょう。
public PageDto createPageDto(int pageCnt, int current, int count) {
PageDto page = new PageDto;
page.setCount(count);
int max = Mah.ceil(count / pageCnt);
page.setIndexMax(max);
page.setIndexNext(current + 1 > max ? max : current + 1);
page.setIndexPrev(current - 1 > 1 ? current - 1 : 1);
page.setIndexTo(current * pageCnt > max ? max : current * pageCnt);
return page;
}
実際はこんな風に三項演算子なんかは使われていないですけど、記事を読むにはシンプルでわかりやすいと思いましたので使用しました。既存のPageDtoについて理解するのに、ここまでで2時間以上、費やしてしまった気がします。最初から、JSPの方でどのように見ればすぐわかったのに、Javaの設定方法やJUnitのケースを見たり、遠回りしてしまいました。
ということで、今回の改修案です。
public PageDto createPageDto(int pageCnt, int current, int cnt, int stepCnt) {
PageDto page = new PageDto;
int count = cnt / stepCnt;
page.setCount(count);
int max = Mah.ceil(count / pageCnt);
page.setIndexMax(max);
page.setIndexNext(current + 1 > max ? max : current + 1);
page.setIndexPrev(current - 1 > 1 ? current - 1 : 1);
page.setIndexTo(current * pageCnt > max ? max : current * pageCnt);
return page;
}
引数が異なるので、既存のメソッドにも修正が入らないし、安心ですね。JUnitがあるので、既存のメソッドから↓下のように呼び出しても良いのですが、今回のお客様との距離感を考えるとやらないですね。
/** 既存のメソッドから新規メソッドを呼び出す */
public PageDto createPageDto(int pageCnt, int current, int count) {
return createPageDto(pageCnt, current, count, 1);
}
以上です。最後まで、ご覧いただきありがとうございました。