• 締切済み

ページ処理

JSPの、通信教育を受けていますが、タブ区切りの商品テキストを読み込み、5点づつ表示させる。 下記のJSPに、 [ ○件中の○-○件の表示 ] [ 前へ / 1 2 3 4 5 / 次へ ] というページ処理をさせたいのですが、うまくいきません。通信教育は、受講料が安いせいか、質問しても「ループを使い読み飛ばせ」ぐらいの回答しか得られず困っています。どなた様かご教授願えないでしょうか。 <th>商品</th><th>商品名</th><th>現在価格</th><th>入札</th><th>締切日</th></tr> String tmpStr; StringTokenizer tkn; FileReader fr = new FileReader(application.getRealPath("data.txt")); BufferedReader br = new BufferedReader(fr); DecimalFormat df; df = new DecimalFormat("###,###"); while(br.ready()){ tmpStr = br.readLine(); out.println("<tr style='background:#ffffcc'>"); tkn = new StringTokenizer(tmpStr,"\t"); byte i; i=0; String strTmp; while(tkn.hasMoreTokens()){ strTmp = tkn.nextToken(); switch(i){ case 0: case 4: out.println("<td algin='right'>" + strTmp +"</td>"); break; case 1: out.println("<td>" + strTmp + "</td>"); break; default: out.println("<td align='right'>" +df.format(Long.parseLong(strTmp)) +"</td>"); } i++; } out.println("</tr>"); } br.close(); %> </table> </body> </html> お願いします。

みんなの回答

  • J_H
  • ベストアンサー率57% (11/19)
回答No.3

具体的な数値をあてはめると、話が早いです。 例えば、以下のような場合: 総データ数 : 37件 ( 37行 ) 最大表示数 : 5行 => page = ( 37 + 5 - 1) / 5 = 41 / 5 = 8 ( = AllPage ) になります。( int 同士の割り算の結果は int ) 37件を5件ずつ表示するには、8ページ必要ということですね。 8ページ分のリンクを作りたいわけだから、 for ( int i = 0; i < AllPage; i++){ out.print("<a href='***jsp?PageNo=" + (i + 1) + ">" + (i + 1) + "</a>"); // [ <a href='***jsp?PageNo= ] : 文字, [ (i + 1) ] : 変数, [ > ] : 文字, [ (i + 1) ] : 変数, [ </a> ] 文字 をあわせたもの // 文字 + 変数 + 文字 + 変数 + 文字 を print する。 } するわけです。 その前後に、[前へ] [次へ] というリンクを加えたものが、 <a href="***.jsp?PageNo=(RequiredPage-1)">前へ</a> を出力 for (i=0; i<AllPage; i++){ <a href="***.jsp?PageNo=(i+1)">(i+1)</a> を出力 } <a href="***.jsp?PageNo=(RequiredPage+1)">次へ</a> を出力 の意味です。(ここも、out.print が必要になります) ***.jsp?PageNo=2 の PageNo=2 は、こちらで勝手に決めたものです。 ブラウザからJSP(***.jsp)にリクエストしたときに、 テーブルに何ページ目が表示されるかを決めることが目的です。 これがないと、***.jsp にリクエストはするけど、何ページ目を表示するのか分かりません。 ***.jsp?PageNo=1 ・・・ テーブルに1ページ目を表示 ***.jsp?PageNo=2 ・・・ テーブルに2ページ目を表示

  • J_H
  • ベストアンサー率57% (11/19)
回答No.2

int page;(ページ数) は、 変数int max;(最大表示数) int count;(総データー数) を用いて、 page = (count + max - 1) /max と表せます。 この回数分、<a href="~">を出力すれば [ 前へ / 1 2 3 4 5 / 次へ ] が出力されますね。 <a href="~">は <a href="***.jsp?PageNo=2">みたくパラメータを持たせましょう。 ということは、***.jsp の先頭で、パラメータを受け取る処理が必要になります。 request.getParameter("PageNo") で要求ページ番号が「文字」として取得できるので、 数値に変換すれば、この数値によってテーブルの内容や<a href="~">するかしないかなどの分岐が出来ると思います。 具体的にはテーブルの上のほうで int RequiredPage; String strPage; strPage = request.getParameter("PageNo"); try{ RequiredPage = Integer.parseInt ( strPage ); } catch (){ // 何らかの例外が出たら 先頭ページが要求されたことにする RequiredPage = 1; } テーブルの下で int AllPage = ( count + ( max - 1 ) ) / max; // ページ数を求める <a href="***.jsp?PageNo=(RequiredPage-1)">前へ</a> を出力 for (i=0; i<AllPage; i++){ <a href="***.jsp?PageNo=(i+1)">(i+1)</a> を出力 } <a href="***.jsp?PageNo=(RequiredPage+1)">次へ</a> を出力 のような感じになるかと思います。

berryn3
質問者

補足

詳細な解答ありがとうございます。これだけ書いて頂けると解決できると思い2日間必死に頑張りましたが、 Eclipsedeで「構成が間違っています」というエラーがでます。 「int AllPage = ( count + ( max - 1 ) ) / max; // ページ数を求める <a href="***.jsp?PageNo=(RequiredPage-1)">前へ</a> を出力 for (i=0; i<AllPage; i++){ <a href="***.jsp?PageNo=(i+1)">(i+1)</a> を出力 } <a href="***.jsp?PageNo=(RequiredPage+1)">次へ</a> を出力」 この部分を、さらにご教授いただけないでしょうか?よろしくお願いします。

  • fortranxp
  • ベストアンサー率26% (181/684)
回答No.1

データに番号を振って たとえば 1P 0-20      2P 20-40      3P 40-60 のように1Pを選択されたら(POSTなどで) 0-20のみを表示するようにしたらよいの では?

berryn3
質問者

補足

早い、解答ありがとうございます。頭の中では、 変数int max;(最大表示数) int page;(ページ数) int count;(総データー数) をセットしてfor?文を使うということは解っているつもりですが、この例題の中で、具体的にご教授願えないでしょうか?よろしくお願いします。

関連するQ&A