• ベストアンサー

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
  • 回答数2
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.2

以下の文はwhileを do whileに書き直したものです。 -------------------------- do { if (br.ready() == false) break; tmpStr=br.readLine(); out.println("<tr style='background:#ffffcc'>"); tkn=new StringTokenizer(tmpStr,"\t"); do { if (tkn.hasMoreTokens() == false) break; out.println("<td>" + tkn.nextToken() + "</td>"); } while(true); out.println("</tr>"); } while(true); -------------------------- たぶん、上記のように変えれば動くはずです。 ところで、do whileに変えたい理由はなぜなのでしょうか。whileでもdo whileでも正しい結果がでれば問題ないはずですが・・・。何故 do whileにしたいのかと言うことに非常に興味があります。よかったら教えていただけませんでしょうか。

hurann
質問者

お礼

解答ありがとうございます。そしてレスが遅れてスミマセンでした。書き直す理由として、whileとdo whileを理解しているかどうかを試すために出された問題なのです。whileは何とかなったのですが、do whileに直すことが中々出来ずに、どうしても皆さんの意見を聞きたくてここで質問してみたのです。

その他の回答 (1)

回答No.1

> しかも全ての情報が <th>NO.</th> に入ってしまうのです。 そうなるように書いてあるからそうなると思います。 do while文を入れ子にしなくて良いのですか? 上のソースは入れ子になっていますが・・・ あと、do while文は中の処理が最低一回実行されます。 一回目にtkn.nextToken()を実行したときトークンが一つもないときはNoSuchElementExceptionが出そうですが・・・

関連するQ&A

  • ページ処理

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

  • こういうプログラムをどう書けばいいのでしょう

    こういうプログラムがあります。 <%@ 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>");

  • Webアプリケーション checkboxでのデータベース削除

    お世話になっております。 早速なのですが、JSP, Servlet, MySQL, tomcat, javaなどをつかいWebアプリケーションを作成したいと思い投稿しました。 まずJSPのページにデータベース内容一覧を表示させそれらにinput type=checkboxを付けsubmitを使い、次のページで「~~~を削除しますか?」と表示させたいのですが・・・。 どのように次のページにデータベースとcheckboxの情報を引き渡すのかが分からなくなってしまいました。 どうかご教授ください。それとこれに関するサイトなどございましたらお教えください。 ----------------------------------------- <%@ page language="java" contentType="text/html; charset=Shift-Jis" import="java.sql.*"%> <html> <head> <title>一覧表示</title> </head> <body> <% String lh = "localhost:xxxx"; //ホスト名 String user = "xxxx"; //user名 String DB = "system"; //データベース名 String rr = "接続中"; //接続ステータス //接続データベース情報の表示 out.println("<h1 align='center'><u>マスターメンテナンスシステム</u></h1>"); out.println("<table border='1' align='left' bgcolor='#ffffff' width='100%'>"); out.println("<tr bgcolor='#ffffff'>"); out.println("<td><h2 align='center' style='background:#cccccc'>接続データベース</h2>"); out.println("<div><br></div>"); out.println("<h3>ホスト     <label>" + lh + "</label></h3>"); out.println("<h3>ユーザー   <label>" + user + "</label></h3>"); out.println("<h3>データベース <label>" + DB + "</label></h3>"); out.println("<h3>ステータス  <label>" + rr + "</label></h3>"); %> <form action="delete3.jsp" method="POST"> <h1 style="background:#cccccc" align="center"><u>テーブル詳細</u></h1> <table border="0" width="100%"> <tr style="background:#00ccff"> <th>/</th><th>NO.</th><th>PC名</th><th>構成価格/値段</th><th>OS</th><th>CPU</th><th>モニター</th><th>詳細</th></tr> <% Class.forName("org.gjt.mm.mysql.Driver"); Connection db=DriverManager.getConnection("jdbc:mysql://localhost:xxxx/sistem?user=xxxx&password=xxxx&useUnicode=true&characterEncoding=SJIS"); Statement sttSql=db.createStatement(); ResultSet rs=sttSql.executeQuery("SELECT * FROM dell_pc"); while(rs.next()) { String number=rs.getString("number"); out.println("<tr style='background:#ffffcc'>"); out.println("<td><input type='checkbox' name='tables'></td>"); out.println("<td>" + rs.getString("number") + "</td>"); out.println("<td>" + rs.getString("PC") + "</td>"); out.println("<td>" + rs.getString("kakaku") + "</td>"); out.println("<td>" + rs.getString("OS") + "</td>"); out.println("<td>" + rs.getString("CPU") + "</td>"); out.println("<td>" + rs.getString("display") + "</td>"); out.println("<td><a name='詳細' href='b.jsp?number=" + number + "'>" + number + "</a></td>"); out.println("</tr>"); } sttSql.close(); db.close(); %> </table> <a href="a.jsp">TOPへ</a> <input type="submit" value="削除"> </form> </body> </html> ----------------------------------- 環境ですがjdk1.5.0_11、MySQL5.0、tomcat6.0、eclipse3.2です。

  • ファイルから複数行のトークンを文字列検索。

    input.txt から "," で区切られた文字列をトークンで分け、 左がパターン、右が検索する文字列になります。 一行の場合は while((line = brInput.readLine())!= null ) { StringTokenizer st = new StringTokenizer(line, ","); if(st.hasMoreTokens()){ pattern = st.nextToken(); text = st.nextToken(); } これでマッチするだけなのですが、複数行の場合はどうでしょうか?

    • ベストアンサー
    • 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
  • 特定の列の<td>または<th>だけにスタイルを

    かけたいということがあります。 例えば、 ---------------------------------------------------------- <style type="text/css"> .tab1 th, .tab1 td { font-weight:normal; text-align:center; background:#fee; } .tab1 .row2 th { /* ----------------(1) */ background:#fff; } .tab1 .col2 th { /* ----------------(2) */ background:#ffff; } </style> <table class="tab1"> <col class="col1"> <col class="col2"> <col class="col3"> <tr class="row1"> <th>1</th> <th>2</th> <th>3</th> </tr> <tr class="row2"> <th>4</th> <td>5</td> <td>6</td> </tr> <tr class="row3"> <th>7</th> <td>8</td> <td>9</td> </tr> <table> ---------------------------------------------------------- だと、 1 2 3 4 5 6 7 8 9 の中の「4」は(1)により背景が白くなります。 しかし、(2)のようにしても「2」の背景は白くなりません。 <col>ってそういうものなのでしょうか? <td>または<th>にidをつけてスタイルをかけるしかないのでしょうか? よろしくお願いします。

    • ベストアンサー
    • HTML
  • 登録ボタンを押すとjspファイルが開かれてしまう

    環境は IE 8 MySQL 5.5 Java 6 です。 form method="POST" で取得したデータをDBに登録させたいと思いますが、 登録ボタンを押すとなぜかファイルを開く・保存の画面が出てしまいました。 どの部分がおかしいのでしょうか? HTML側 <html> <head> <title>情報登録</title> </head> <body> <h1 style="background:#cccccc">情報登録</h1> <form method="POST" action="p_insert.jsp"> <table border="0"> <tr> <th style="color:#FFffFF;background:#0086b2;text-align:right;">名前</th> <td><input type="text" name="nam" size="35" /></td> </tr> <tr> <th style="color:#FFffFF;background:#0086b2;text-align:right;">URL</th> <td><input type="text" name="url" size="100" /></td> </tr> <tr> <th style="color:#FFffFF;background:#0086b2;text-align:right;">入手日</th> <td><input type="text" name="gdate" size="14" />(YYYY/MM/DD)</td> </tr> <tr> <th style="color:#FFffFF;background:#0086b2;text-align:right;">ランク</th> <td> <select name="grade"> <option value="5">大変良い</option><option value="4">良い</option> <option value="3">普通</option><option value="2">悪い</option> <option value="1">非常に悪い</option> </select> </td> </tr> <tr> <th style="color:#FFffFF;background:#0086b2;text-align:right;">メモ</th> <td><input type="text" name="memo" size="100" /></td> </tr> <tr> <td colspan="2"> <input type="submit" value="登録" /> <input type="reset" value="取消" /> </td> </tr> </table> </body> </html> JSP側 <%@ page contentType="text/html; charset=Shift_JIS" import="java.sql.*,java.io.*" %> <%! public String strEncode(String strVal) throws UnsupportedEncodingException{ if(strVal==null){ return (null); }else{ return (new String(strVal.getBytes("ISO-8859-1"),"JISAutoDetect")); } } %> <% Class.forName("org.gjt.mm.mysql.Driver"); Connection db=DriverManager.getConnection( "jdbc:mysql://localhost:3306/データベース名" + "?user=jsp10&password=jsp10&useUnicode=true&characterEncoding=Shift_JIS"); Statement sttSql=db.createStatement(); sttSql.executeUpdate( "INSERT INTO aaalist(name,url,gdate,grade,memo) VALUES('" + strEncode(request.getParameter("name")) + "','" + request.getParameter("url") + "','" + request.getParameter("gdate") + "'," + request.getParameter("grade") + ",'" + strEncode(request.getParameter("memo")) + "')"); sttSql.close(); db.close(); response.sendRedirect("p_insert.html"); %>

    • ベストアンサー
    • Java
  • このようなソースを書いたのですが下に表示した二つのテーブルがどうしても

    このようなソースを書いたのですが下に表示した二つのテーブルがどうしても左よりに表示されてしまいます。 一行に2つのテーブルを横に並べつつその2つのテーブルを中央に表示できないでしょうか? よろしくお願いいたします <HTML><Div Align=center><HEAD><TITLE>検索結果詳細画面</TITLE></HEAD><BODY> <BR><BR><BR> <B>検索詳細画面</B><BR> <form action='/humans/servlet/Seach' method='get'> <table bor 社員番号</th> <td width=200> sno</td></tr><tr> <th>氏名</th> <td> name</td></tr><tr> <th>ヨミガナ</th> <td> kana</td></tr><tr> <th>住所</th> <td> address</td></tr><tr> <th>生年月日</th> <td> birthday</td></tr> <tr><th>性別</th> <td> sex</td></tr> <tr><th>身長</th> <td> hight</td></tr> <tr><th>体重</th> <td> weight</td></tr> <tr><th>血液型</th> <td> blood</td></tr> <tr><th>携帯電話番号</th> <td> mtel</td></tr> <tr><th>自宅電話番号</th> <td> ttel</td></tr></table><hr /> <br>家族(扶養家族)のデータ</br> <br></br><table border=1 align=left><tr><th width=150>氏名</th> <td width=200> name</td></tr><tr> <th>ヨミガナ</th> <td> kana</td></tr><tr> <th>生年月日</th> <td> birthday</td></tr><tr> <th>性別</th> <td> sex</td></tr><tr> <tr><th>身長</th> <td> hight</td></tr> <tr><th>体重</th> <td> weight</td></tr> <tr><th>血液型</th> <td> blood</td></tr> <tr><th>携帯電話番号</th> <td> mtel</td></tr> <tr><th>自宅電話番号</th> <td> ttel</td></tr> <tr><th>続柄</th> <td> reration</td> </tr></table> <table border=1 align=left><tr><th width=150>氏名</th> <td width=200> name2</td></tr><tr> <th>ヨミガナ</th> <td> kana2</td></tr><tr> <th>生年月日</th> <td> birthday2</td></tr><tr> <th>性別</th> <td> sex2</td></tr><tr> <tr><th>身長</th> <td> hight2</td></tr> <tr><th>体重</th> <td> weight2</td></tr> <tr><th>血液型</th> <td> blood2</td></tr> <tr><th>携帯電話番号</th> <td> mtel2</td></tr> <tr><th>自宅電話番号</th> <td> ttel2</td></tr> <tr><th>続柄</th> <td> reration2</td> </tr></table><br></br><br></br><br></br><br></br><br></br><br></br><br></br>

  • cssでテーブルの位置を設定するには?

    <table border="1" align="left">でテーブルの位置を競ってすることはできたのですが スタイルシートで行いたいです。 そもそも他のテーブルはすべて中央に寄せたいため、 table { margin-left: auto; margin-right: auto; } としています。 そのうえで、任意のテーブルのみ左に寄せて表示したいので table.test { align:left; } としたのですが、うまくいきません。 ---------------------------------------------------------- <html> <head> <title>test</title> <STYLE type="text/css"> table { margin-left: auto; margin-right: auto; width: 40%; } table.test { width: 80%; align:left; } </STYLE> </head> <body> <table border="1"> <tr><th>見出</th><th>見出</th></tr> <tr><td>セル</td><td>セル</td></tr> </table> <br><br><br> <table border="1" align="left"> <tr><th>見出</th><th>見出</th></tr> <tr><td>セル</td><td>セル</td></tr> </table> <br><br><br> <table border="1" class="test"> <tr><th>見出</th><th>見出</th></tr> <tr><td>セル</td><td>セル</td></tr> </table> </body> </html> ----------------------------------------------------- このコードだと、 table.test { width: 80%; align:left; } の、 width: 80%; の部分は認識されるようですが、align:left;は無視されます。 スタイルシートでテーブルの位置を設定する方法をご教授ください。

    • 締切済み
    • CSS

専門家に質問してみよう