度重なる質問申し訳ありません。
現在DB操作について学んでいるJava独学者です。
下記のようなソースで一覧表示画面を作成してみました。
この一覧画面をページング処理したいのですが、その方法がよく分からず頭を抱えています。
期待する結果は以下の通りです。
(1)DBの内容を10件ごとに表示し、「Back」「Next」のリンクを使って画面を移動する。
(2)次(もしくは前)に表示する10件がない場合は上記のリンクを非表示としたい。
※ちなみにDBはPostgreSQLを使用しております。
下記はソースの一部です。
**Srvlet**
if(button != null && button.equals("一覧")){
target = "/list.jsp";
CList cList = new CList();
List list = cList.list();
request.setAttribute("SELECT", list);
}
**JSP**
<%@page contentType="text/html; charset=Windows-31J" %>
<%@page import="java.util.*" %>
<%@page import="XXXX.bean.Bean" %>
<%@page import="XXXX.service.CList" %>
<%@page import="XXXX.service.Search" %>
<jsp:useBean id="SELECT" class="java.util.ArrayList" scope="request"/>
<HTML>
<HEAD>
//省略//
</HEAD>
<BODY>
<BR>
<%
ArrayList array = (ArrayList)request.getAttribute("SELECT");
for(int i=0 ; i<array.size() ; i++){
Bean bean = (Bean)array.get(i);
%>
<TR>
<TD><INPUT type="radio" name="radio" value="<%= (int)bean.getId() %>" <%=
bean == array.get(0) ? "checked" : ""%>></TD>
<TD><%= (int)bean.getId() %></TD>
<TD><%= (String)bean.getName() %></TD>
<TD><%= (String)bean.getTel() %></TD>
</TR>
<%} %>
</TABLE>
</TD>
</TR>
</TABLE>
</FORM>
</DIV>
<a href="">
<font color="#0000ff"><b>Back</b></font></a>
<a href="">
<font color="#0000ff"><b>Next</b></font></a>
**CList.java**
DBAccess db = new DBAccess();
db.open();
String SQL = "SELECT*FROM LIST ORDER BY ID ASC;";
db.setSql(SQL);
ResultSet rs=db.select();
List list = new ArrayList();
while (rs.next()) {
Bean bean = new Bean();
bean.setId(rs.getInt("ID"));
bean.setName(rs.getString("NAME"));
bean.setTel(rs.getString("TEL"));
list.add(bean);
}
rs.close();
db.close();
return list;
}
}
色々調べた結果、SQL文を使う方法とArrayList等に格納する方法があるようですが、
どちらも良く理解出来ませんでした。
勉強不足で申し訳ありませんが、ご教授お願いいたします。
A 回答 (3件)
- 最新から表示
- 回答順に表示
No.3
- 回答日時:
No.2です。
ページングに必要な情報はNo.1さんの回答でも私の回答でもほぼ同じことが書いてあると思うのですが・・
全件数、表示するページ番号、1ページのに表示する件数です。
今のコードでは上記のどの情報も保持していないですよね?
毎回全件を取得して最初の5件を表示するだけになっています。
今のコードに加えるならば、
<%
ArrayList array = (ArrayList)session.getAttribute("SELECT");
//ページ番号
int pageNo = Integer.parseInt(request.getParameter("pageNo"));
//1ページの件数
int displayNumber = Integer.parseInt(request.getParameter("displayNumber"));
//for(int i=0; i<array.size() ; i++){
for(int start = (pageNumber - 1) * displayNumber, end = start + displayNumber;start < end && start < array.size(); start++){
Bean bean = (Bean)array.get(start);
%>
というような感じにして、break処理はなくします。
#雰囲気で書いているのでおかしいとこもあるかもしれません。
ですが、一般的にはView(JSP)にこのようなロジックを記述するのではなく、
検索時に必要な分だけをListに詰めてViewに返し、ViewではListを全件表示するだけにすると思います。
そうすればsessionを使う必要もなくなります。
既にそうされているかもしれまえせんが、頭の中で考えるだけではなく
必要な情報や処理を絵に書いてみると整理しやすいと思いますよ。
No.2
- 回答日時:
(1)について
PostgreSQLならばLIMI句とOFFSET句を使えばよさそうです。
環境がないので実際に試すことはできないのですが、
SELECT * FROM LIST ORDER BY ID ASC LIMIT 10(1ページの件数) OFFSET 0(読み飛ばす行数);
とすれば最初の10件が取得できると思います。
以降は表示しようとするページ番号によってOFFSET句の値を変更していけばいいのではないでしょうか。
もしくは、ResultSetのabsoluteメソッドを使って表示開始行までカーソルを移動してから
1ページの件数分だけループしてListに追加するようにしてもいいと思います。
(2)について
検索結果の全件数を保持しておけば、現在表示しているページ番号と1ページの件数から
次ページもしくは前ページが存在するかが判断できると思います。
全件数はCOUNT(*) over() などでSQLで取得したり、
ResultSetのlastメソッドを使ってカーソルの最終行に移動してgetRowメソッドで取得することもできます。
初めはいっぺんにやろうとせずに、少しずつ処理を追加していくようにした方がいいと思います。
この回答への補足
お2人のアドバイスを参考にし、DB量もそこまで多くないことから
今回はListで処理を行うことにしました。
あの後に色々自分なりに修正を加えたものが下記のソースになります。
**Srvlet**
if(button != null && button.equals("一覧")){
target = "/list.jsp";
CList cList = new CList();
List list = cList.list();
HttpSession. session=request.getSession();
session.setAttribute("SELECT", list);
}
**JSP**
//省略//
<BODY>
<BR>
<%
ArrayList array = (ArrayList)session.getAttribute("SELECT");
for(int i=0 ; i<array.size() ; i++){
Bean bean = (Bean)array.get(i);
%>
<TR>
<TD><INPUT type="radio" name="radio" value="<%= (int)bean.getId() %>" <%=
bean == array.get(0) ? "checked" : ""%>></TD>
<TD><%= (int)bean.getId() %></TD>
<TD><%= (String)bean.getName() %></TD>
<TD><%= (String)bean.getTel() %></TD>
</TR>
<%
if(i==4){
break;}
%>
<%} %>
</TABLE>
</TD>
</TR>
</TABLE>
</FORM>
</DIV>
<a href="list.jsp?list=1">
<font color="#0000ff"><b>Back</b></font></a>
<a href="list.jsp?list=2">
<font color="#0000ff"><b>Next</b></font></a>
変数iをbreakすることで5件までの表示に成功しました。
また、request をSessionに変更したことで、情報を記憶出来ているとは思うのですが
NEXT・BACKに飛ぶと同じ情報が保持されたままとなっています。
何か前後の情報を格納しないと期待する処理は行われないと思うのですが、
その部分でまた詰まってしまいました・・・。
アドバイス等御座いましたらお願いいたします。
No.1
- 回答日時:
一般的には、SQLで表示するページ分だけ取得して、
次へ、前へを押下時に、再度ページ分取得だと思います。
Listでやると全件保持したりしてメモリを圧迫するかと思います。
1.検索結果は全部で何件あるか?(COUNT 文)
2.1.の結果が 1 ページに収まるか?収まらないか?
全件数 / 1ページ表示件数 = ページ数
今から表示しようとしているページ番号により、「前へ」「次へ」リンクを表示するか判断する。
3.今から表示しようとしているページ番号により、結果を取得する。
select ...
from テーブル名
offset 80 limit 10
※offset は今から表示しようとするページ番号により何件目から表示するか事前に計算しておく。(3ページ目を表示するなら 10 * 3 = 30 など)
limit は1ページに表示する件数。
4.結果を画面表示する。
簡単に書いたので色々と抜けている、間違っていることがあるかもしれませんが
参考程度にしてください。
この回答への補足
アドバイス有難うございます。
SQLで行うページングロジックを把握出来ただけでも大変有り難いです。
今回は情報量もそこまで大きくないので、Listで行うことにしましたが
SQLで行う方法も今後習得出来るよう精進したいと思います!
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- AJAX JavascriptからPHPへのAjax通信でnullが返ってくる 3 2022/08/03 22:00
- CGI perlで書いたcgiでsqliteの使い方を教えてください 2 2023/05/08 21:29
- PHP if(preg_match("/[^0-9]/",$gu_d)){意味を教えてください。 1 2022/05/06 05:37
- HTML・CSS CSS のみのタブ切り替えについて 1 2023/01/11 16:47
- PHP ここでの ②if($su_d<>"")の比較演算子 を使う理由は 1 2022/03/26 02:33
- PHP PHP MySql ページング 2 2022/09/20 06:38
- Excel(エクセル) PHPプログラムをエクセルに張り付けると検索ボックスがでてくる! 3 2022/05/08 07:10
- PHP htmlspecialcharsが機能していないです。 バグですか? 1 2022/04/05 01:22
- Visual Basic(VBA) Selenium.ChromeDriverの使い方について 7 2022/09/22 06:43
- HTML・CSS テーブルタグのセルの幅の一部だけを指定 1 2023/03/12 12:02
このQ&Aを見た人はこんなQ&Aも見ています
-
それもChatGPT!?と驚いた使用方法を教えてください
仕事やプライベートでも利用が浸透してきたChatGPTですが、こんなときに使うの!!?とびっくりしたり、これは画期的な有効活用だ!とうなった事例があれば教えてください!
-
スマホに会話を聞かれているな!?と思ったことありますか?
スマートフォンで検索はしてないのに、友達と話していた製品の広告が直後に出てきたりすることってありませんか? こんな感じでスマホに会話を聞かれているかも!?と思ったエピソードってありますか?
-
2024年に成し遂げたこと
今年も残すところわずか。 皆さんが今年達成したことを教えていただきたいです。 どんな小さなものでも構いません。
-
食べられるかと思ったけど…ダメでした
「この煮物、だいぶ放置しちゃったけど大丈夫かな…」 「食べ物じゃないけど、なんか食べたらすごく美味しそうな気がする」
-
2024年においていきたいもの
2024年もあとわずかですが、いま抱えているもので「これは来年にもっていきたくないなぁ」というものを教えて下さい。
-
ページング
Java
-
JSPでDBからデータ読み込みブラウザーで10件ずつ表示させたい。
Java
-
JSP+Servletでのページングの常識
Java
-
-
4
1ページに10件ずつ表示したい
Java
-
5
データ数をカウントしたいのですが
Java
-
6
count(*)で取得した値をJAVAの変数に代入するには?
Java
-
7
jspからServletを呼び、元のjspページに戻るにはどうしたらよいですか?
Java
-
8
servletからjspへオブジェクトの配列情報を送る方法
Java
-
9
フォーム上で押されたボタンによってサーブレットの処理を変えたい
Java
-
10
jsp~jspにhiddenを使って変数を飛ばしたい
JavaScript
-
11
Javascriptの値をJava(JSP)へ渡す方法
Java
-
12
ループ処理の際、最後だけ,"をつけたくない"
Java
-
13
レコード件数の表示
Java
-
14
JSPのクラスをコンパイルできない問題
Java
-
15
JSPの処理の途中で、JavaScriptの処理をしたい
JavaScript
-
16
submitをボタン以外にするには
HTML・CSS
-
17
単一グループのグループ関数ではありません。
Oracle
-
18
Selectの中身をfor文で入れる
JavaScript
-
19
JSPからYYYYMMDDで日付入力する
Java
-
20
htmlでテーブル内にテキストボックスを作りたいのですが・・・
HTML・CSS
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・「みんな教えて! 選手権!!」開催のお知らせ
- ・漫画をレンタルでお得に読める!
- ・「黒歴史」教えて下さい
- ・2024年においていきたいもの
- ・我が家のお雑煮スタイル、教えて下さい
- ・店員も客も斜め上を行くデパートの福袋
- ・食べられるかと思ったけど…ダメでした
- ・【大喜利】【投稿~12/28】こんなおせち料理は嫌だ
- ・前回の年越しの瞬間、何してた?
- ・【お題】マッチョ習字
- ・モテ期を経験した方いらっしゃいますか?
- ・一番最初にネットにつないだのはいつ?
- ・好きな人を振り向かせるためにしたこと
- ・【選手権お題その2】この漫画の2コマ目を考えてください
- ・2024年に成し遂げたこと
- ・3分あったら何をしますか?
- ・何歳が一番楽しかった?
- ・治せない「クセ」を教えてください
- ・【大喜利】【投稿~12/17】 ありそうだけど絶対に無いことわざ
- ・【選手権お題その1】これってもしかして自分だけかもしれないな…と思うあるあるを教えてください
- ・集合写真、どこに映る?
- ・自分の通っていた小学校のあるある
- ・フォントについて教えてください!
- ・これが怖いの自分だけ?というものありますか?
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・10代と話して驚いたこと
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
DBを10件毎に表示ページング...
-
月の第一週とは
-
エクセルで相対パスの書き方を...
-
よくある 『 第○(1・2・3・4・...
-
エクセルで毎月第2週日の水曜日...
-
週2回のペースって だいたい何...
-
リストコントロールの列幅を固...
-
VBA。複数のChangeイベントをま...
-
[C#]ListView一覧表示時の幅設...
-
フォーム要素の文字数制限について
-
毎週同じ曜日にラブホに行くと...
-
[Excel] ある日の曜日が当月の"...
-
xamppでcgiが動かない
-
apacheでPerl CGIが作動せず、5...
-
Perl の外部モジュールの利用方法
-
Excel VBA 第〇△曜日の場合休日...
-
EXCEL:ヘッダー日付を年号で?...
-
曜日派?日付派??
-
require文が実行できない
-
VBAでExcelのヘッダーに文字列+...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
DBを10件毎に表示ページング...
-
ホームページにブログ記事をサ...
-
c# webBrowser 内のpdfファイル...
-
HTMLでASPを動かしたい
-
携帯端末の選別
-
CGI RESCUEの簡易予約システムY...
-
if文について
-
診断系サイト製作に必要な事を...
-
月の第一週とは
-
エクセルで相対パスの書き方を...
-
エクセルで毎月第2週日の水曜日...
-
毎○曜日って、使いますか?
-
よくある 『 第○(1・2・3・4・...
-
apacheでPerl CGIが作動せず、5...
-
週2回のペースって だいたい何...
-
[Excel] ある日の曜日が当月の"...
-
VBA。複数のChangeイベントをま...
-
Excelで第一〇曜日を求める方法...
-
リストコントロールの列幅を固...
-
[C#]ListView一覧表示時の幅設...
おすすめ情報