• 締切済み

ページ処理

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> お願いします。

  • Java
  • 回答数3
  • ありがとう数4

みんなの回答

  • 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

  • JSPで聞きたいことがあります。

    JSPを学んで一ヶ月になります。以下の内容で質問があります。 <%@ page contentType="text/html;charset=Shift_JIS"import="java.io.*,java.util.*" %> <html> <head> <title>住所録</title> </head> <body> <h1 style="font-size:14pt;background:#cccccc">住所録</h1> <table border="0"> <tr style="background:#00ccff"> <th>No.</th><th>名前</th><th>性別</th><th>電話番号</th><th>住所</th> </tr> <% String tmpStr; StringTokenizer tkn; FileReader fr=new FileReader( application.getRealPath("myData/data.txt")); BufferedReader br=new BufferedReader(fr); while(br.ready()){ tmpStr=br.readLine(); out.println("<tr style='background:#ffffcc'>"); tkn=new StringTokenizer(tmpStr,"\t"); while(tkn.hasMoreTokens()){ out.println("<td>" + tkn.nextToken() + "</td>"); } out.println("</tr>"); } br.close(); %> </table> </body> </html> というコードがあるのですが、上記のコード中にあるwhile文をdo分に変えて、whileと同じように表示するのは可能でしょうか?ちなみに私は、 do{ tmpStr=br.readLine(); out.println("<tr style='background:#ffffcc'>"); }while(br.ready()); tkn=new StringTokenizer(tmpStr,"\t"); do{ out.println("<td>" + tkn.nextToken() + "</td>"); out.println("</tr>"); br.close(); }while(tkn.hasMoreTokens()); と記述したのですが、実行してみると、一部しか表示されず、しかも全ての情報が <th>NO.</th> に入ってしまうのです。そこで質問ですが、whileからdo文に変えて同じように表示するのは可能なのでしょうか?わかる方がいれば、お願いします。

    • ベストアンサー
    • Java
  • こういうプログラムをどう書けばいいのでしょう

    こういうプログラムがあります。 <%@ page language="java" contentType="text/html; charset=Shift_JIS" import="java.io.*,java.util.*,java.text.*"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> <title>商品一覧</title> </head> <body> <h1 style="font-size:14pt;background:#ccccff">商品一覧</h1> <table border="0"> <tr style="background:#ccccdd"> <th>商品ID</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("###,###"); Calendar calToday = Calendar.getInstance(); Calendar calTmp = Calendar.getInstance(); //ストリームが読み込み可能かどうかを返します 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(); if (i==1) { out.println("<td>" + strTmp + "</td>"); }else if (i!=4) { out.println("<td align='right'>" + df.format(Long.parseLong(strTmp)) + "</td>"); }else { //残日数の計算 calTmp.set(Calendar.YEAR, Integer.parseInt(strTmp.substring(0,4))); calTmp.set(Calendar.MONTH, Integer.parseInt(strTmp.substring(5,7))-1); calTmp.set(Calendar.DATE, Integer.parseInt(strTmp.substring(8,10))); Date dteToday = calToday.getTime(); Date dteTmp = calTmp.getTime(); long diff = (dteTmp.getTime() - dteToday.getTime()) / (24*60*60*1000); out.println("<td align='right'>" + Long.toString(diff) + "</td>"); } i++; } out.println("</tr>"); } br.close(); fr.close(); %> </table> </body> </html> このプログラムが読み込んでいるテキストファイルです。 100 タンロップ1箱 15000 1 2009/03/15 200 WELSON36個 3700 2 2009/03/20 300 フリジストンXT81個 12500 2 2009/03/21 400 120球プレッシャーボール 16000 0 2009/03/23 500 ヨネッグススポンジボール 1010 0 2009/03/25  問題のプログラムは最初の100、200、300、400、500という数字を入力すると、その商品の内容が縦書きで表示されるというモノです。 tmpStr = br.readLine(); で1行分取り出して、 tkn = new StringTokenizer(tmpStr, "\t"); でタブで区切って表示させるプログラムなのでどうにかなるようにも思えるのですが……。 1番難しいと思うのは検索番号を入力した際にその商品とどう結びつけるのか、ですね。 質問の意味が分かる方、アドバイス宜しくお願い致します。

    • ベストアンサー
    • Java
  • HTMLの質問なのかJAVAサーブレットの質問なのか微妙なのですがテー

    HTMLの質問なのかJAVAサーブレットの質問なのか微妙なのですがテーブルを一行に二つ表示したいのですが表示はできるんですが表示位置を中央にすることができなくて困ってます どうすれば中央にすることができますか? while(rs2.next()){ String name = rs2.getString("st.staff_name"); String kana = rs2.getString("st.staff_kana"); String birthday = rs2.getString("st.birthday"); String sex = rs2.getString("sm.sex"); String blood = rs2.getString("bm.blood_type"); String hight = rs2.getString("st.hight"); String weight = rs2.getString("st.weight"); String reration = rs2.getString("st.reration"); String mobile = rs2.getString("st.mobile_tel"); String tel = rs2.getString("st.tel"); out.println("<br></br><TABLE border=0 align=\"center\"><table border=1 align=\"left\"><tr><th width=150>氏名</th>"); out.println("<td width=200>"+name+"</td></tr><tr>"); out.println("<th>ヨミガナ</th>"); out.println("<td>"+kana+"</td></tr><tr>"); out.println("<th>生年月日</th>"); out.println("<td>"+birthday.replace("-", "/")+"</td></tr><tr>"); out.println("<th>性別</th>"); out.println("<td>"+sex+"</td></tr><tr>"); out.println("<tr><th>身長</th>"); out.println("<td>"+hight+"</td></tr>"); out.println("<tr><th>体重</th>"); out.println("<td>"+weight+"</td></tr>"); out.println("<tr><th>血液型</th>"); out.println("<td>"+blood+"</td></tr>"); out.println("<tr><th>携帯電話番号</th>"); String mtel=""; if(mobile!=null&&mobile.length()>0){ for (int i = 0; i < mobile.length(); i++) { char ch = mobile.charAt(i); if(i==3){ mtel+="-"; } if(i==7){ mtel+="-"; } mtel+=ch; if(mobile.length()==0){ mtel="-"; } } }else{ mtel="不所持"; } out.println("<td>"+mtel+"</td></tr>"); out.println("<tr><th>自宅電話番号</th>"); String ttel=""; for (int i = 0; i < tel.length(); i++) { char ch = tel.charAt(i); if(i==4){ ttel+="-"; } if(i==6){ ttel+="-"; } ttel+=ch; } out.println("<td>"+ttel+"</td></tr>"); out.println("<tr><th>続柄</th>"); out.println("<td>"+reration+"</td>"); out.println("</tr></table>");

  • javaじゃんけんゲーの質問

    このjavaじゃんけんゲームで 0を押すまでじゃんけんが続いて0押したら終了して、終了と表示して、じゃんけんの勝敗が表示されるように作りたいんですけどどうしたらいいですか?教えてください import java.io.*; class kadai6 { public static void main(String args[]) throws IOException { System.out.println("これは、じゃんけんゲームです。"); System.out.println("あなたの手を入力して下さい。(1:グー、2:チョキ、3:パー、0:終了)さぁどれにしますか?"); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String str = br.readLine(); int res =Integer.parseInt(str); switch(res){ case 1: System.out.println("あなたの手はグーです。"); break; case 2: System.out.println("あなたの手はチョキです。"); break; case 3: System.out.println("あなたの手はパーです。"); break; default: System.out.println("あなたの入力した値はエラーです。1~3の値を入力してください。"); System.exit(1); break; } int comp = (int)(Math.random()*3) + 1; switch (comp){ case 1: System.out.println("コンピュータの手はグーです。"); break; case 2: System.out.println("コンピュータの手はチョキです。"); break; case 3: System.out.println("コンピュータの手はパーです。"); break; default: System.out.println ("エラーです。"); break; } switch (res -comp) { case -2: System.out.println("コンピュータの勝ちです。"); break; case -1: System.out.println ("あなたの勝ちです。"); break; case 0: System.out.println ("あいこです。"); break; case 1: System.out.println ("コンピュータの勝ちです。"); break; case 2: System.out.println("あなたの勝ちです。"); break; default: System.out.println ("エラーです。"); break; } } }

  • HashMap.putについて

    ご質問させて頂きます。 hashMap.putの使い方が良く分かりません。 例えば、以下のようなkudamono.csvファイルがあるとします。 ------------------- A,2003/01/01,スイカ B,2003/02/01,バナナ C,2003/03/01,メロン D,2003/04/01,イチゴ ------------------- このデータをhashMap.putでセットしたいので 以下のようなクラスにしたんですが コンパイルエラーが出てしまいます。 ------------------- /*HashMap生成(クラス変数)*/ public static HashMap hashMap = new HashMap(); public static void main(String args[]) throws Exception { FileReader filereader = new FileReader("kudamono.csv"); BufferedReader bufferedreader = new BufferedReader(filereader); String line; int i = 1; int j = 0; while((line = bufferedreader.readLine()) != null) { System.out.println("Start line at " + i); StringTokenizer stringTokenizerTest = new StringTokenizer(line, ","); while(stringTokenizerTest.hasMoreTokens()) { HashMap.put(stringTokenizerTest.nextToken().toString()); j++; } i++; } filereader.close(); } } --------------- たぶんHashMap.putをする前に キーをセットしたり変数を宣言したりすると思うのですが その辺が良く分かりません。 ご教授して頂けたら幸いです。

    • ベストアンサー
    • Java
  • JAVAの初心者です。

    import java.io.*; class Sample1 { public static void main(String args[])throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); do{ System.out.println("1:入力文字整数確かめ"); System.out.println("2:終了"); String hako = br.readLine(); int sen = Integer.parseInt(hako); switch (sen){ case 1: System.out.println("整数を入力してください。"); String hako2 = br.readLine(); int hako3 = Integer.parseInt(hako2); if ((hako3%2)==0){ System.out.println("これは偶数ですね。"); } System.out.println("奇数ですね。"); break; case 2: System.out.println("終了いたします。"); break; } }while(sen != 2); } } 上記のように組んだのですが、}whileのところでエラー が出てしまうのです。 これってなぜなのでしょう?? 初心者特有の質問かもしれませんがご教授いただけたら嬉しいです。宜しくお願いいたします。 関係ないのかも知れませんがJDK1-5-006を使用してます。

    • ベストアンサー
    • Java
  • エラーの原因がわかりません

    JAVA初心者ですが、ファイル入力を行うプログラムを実行 すると、エラーが出ますが、そのエラーの原因が まったく見当がつきません。 誰か教えてください。 ------------読み込みデータ(loc.dat) 2 11 1 4 1 5 7 1 3 7 7 2 12 11 1 4 1 11 12 4 1 5 3 1 1 11 13 4 1 5 2 1 -------------プログラム import java.io.*; class ExReader {   public static void main(String[] args) { try { //読み込みファイル指定 FileReader fr = new FileReader("loc.dat"); BufferedReader br = new BufferedReader(fr); //ファイルから1行ずつ読み込む String s; while ((s = br.readLine()) != null) { System.out.println(s); } //読み込みファイルをクローズする br.close(); } catch (Exception e) { System.out.println("err: "+e); System.exit(1); } } } ---------------コンパイル結果 C:\JAVA\sim>javac ExReader.java ExReader.java:7: シンボルを解決できません。 シンボル: コンストラクタ FileReader (java.lang.String) 場所 : FileReader の クラス FileReader fr = new FileReader("loc.dat"); ^ ExReader.java:8: シンボルを解決できません。 シンボル: コンストラクタ BufferedReader (FileReader) 場所 : java.io.BufferedReader の クラス BufferedReader br = new BufferedReader(fr); ^ エラー 2 個

    • ベストアンサー
    • Java
  • javaで大量のファイルを読み込む方法

    javaプログラミングについて質問です。 例えば、a1.txt~a100.txtの100個のテキストファイルがある として、これをループか何かを使って順番に読み込みたいのですが、 そのような方法はあるのでしょうか。 // ファイル入力ストリームを取得 BufferedReader br = new BufferedReader(new FileReader("a1.txt")); BufferedReader br2 = new BufferedReader(new FileReader("a2.txt")); BufferedReader br3 = new BufferedReader(new FileReader("a3.txt")); ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ BufferedReader br100 = new BufferedReader(new FileReader("a100.txt")); という風に書くのが面倒に思っています。 宜しくお願いします。

    • ベストアンサー
    • Java
  • どこに・・・

    import java.io.*; class janken { public static void main(String[] args) throws IOException{ BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); System.out.print("あなたの手を入力して下さい。(1:グー、2:チョキ、3:パー)?\n"); String str = br.readLine(); int a = Integer.parseInt(str); switch(a){ case 1: System.out.println("あなたの手はグーです。"); break; case 2: System.out.println("あなたの手はチョキです。"); break; case 3: System.out.println("あなたの手はパーです。"); break; default: System.out.println("1~3を入力してください。"); break; } { int ran = ((int)(Math.random()*3)+1); int b=ran; switch(b){ case 1: System.out.println("コンピュータの手はグーです。"); break; case 2: System.out.println("コンピュータの手はチョキです。"); break; case 3: System.out.println("コンピュータの手はパーです。"); break; } int c; c=a-b; if(c == 2){ System.out.println("勝ち"); } else if(c== -1){ System.out.println("勝ち"); } else if(c==0){ System.out.println("あいこ"); } else if(c==1){ System.out.println("負け"); } else { System.out.println("負け"); } } } } いまjavaの勉強をしており、練習をかてね上のようにじゃんけんのプログラムを書きました。今の段階で、一様動くのですが、一回ごとにじゃんけんが終了されてしまいます。そこで繰り返し文のwhile(a != x)を使って数値を入力したら終了するように考えているんですが、whileをどこに入れたらいいのかがわかりません・・・ 自分でいろんなところに入れて試して見たんですが、無限ループになったりして、終了してくれません。どこにwhileを入れたらいいのでしょうか?それてもwhileじゃないほうがいいのでしょうか?アドバイスお願いします。

    • ベストアンサー
    • Java
  • javaプログラミングの質問です。

    http://questionbox.jp.msn.com/qa1030602.html?StatusCheck=ON に載っている、プログラムを以下のようにQuestionというクラスで実行してみたところ、 import java.io.*; class Question{ public static void main(String Args[]){ BufferedReader reader = null; String strArray[][] = new String[4][4]; String fileName = "foo.txt"; int i = 0; int j = 0; try{ reader = new BufferedReader ( new FileReader(fileName) ); String line; while ( (line = reader.readLine() ) != null ){ StringTokenizer st = new StringTokenizer ( line ); while ( st.hasMoreTokens() ){ strArray[i][j] = st.nextToken(); System.out.print ( strArray[i][j] + " " ); j ++; } j = 0; i ++; System.out.println (""); } } catch ( Exception e ){ System.out.println ( e.toString() ); } } } Exception in thread "main" java.lang.Error: コンパイル問題が未解決です。 StringTokenizer を型に解決できません。 StringTokenizer を型に解決できません。 というエラーが出ます。 このサイトの質問者はうまくいっているようなのですが、私のコンパイラがうまく動いていないのでしょうか? java version "1.6.0_07" を使っていて、Eclipseを用いてコンパイルをしたりしています。 どなたかご指摘をどうぞよろしくお願いいたします。

    • ベストアンサー
    • Java

専門家に質問してみよう