前提・実現したいこと
サーブレットを勉強中の初心者です。参考書の通りに行っているのですがエラーが解消できず困っております。
H2のDB接続をコネクションプールを利用して行い、テーブルの一覧を表示したいです。
発生している問題・エラーメッセージ
コンパイルをする際に、while文で何故かセミコロンを入れるようエラーメッセージが出ます
chapter14\All.java:30: エラー: ';'がありません While(rs.next()){ ^ エラー1個
該当のソースコード
ALL.javaファイルの中身です
java
1package chapter14; 2 3import tool.Page; 4import java.io.IOException; 5import java.io.PrintWriter; 6import javax.servlet.ServletException; 7import javax.servlet.http.*; 8import javax.servlet.annotation.WebServlet; 9import javax.naming.InitialContext; 10import javax.sql.DataSource; 11import java.sql.Connection; 12import java.sql.PreparedStatement; 13import java.sql.ResultSet; 14 15@WebServlet(urlPatterns={"/chapter14/all"}) 16public class All extends HttpServlet{ 17 public void doGet ( 18 HttpServletRequest request, HttpServletResponse response 19 )throws ServletException,IOException { 20 PrintWriter out=response.getWriter(); 21 Page.header(out); 22 try { 23 InitialContext ic=new InitialContext(); 24 DataSource ds=(DataSource)ic.lookup("java:/comp/env/jdbc/book"); 25 Connection con=ds.getConnection(); 26 27 PreparedStatement st=con.prepareStatement("SELECT * FROM product"); 28 ResultSet rs=st.executeQuery(); 29 30 While(rs.next()){ 31 out.println(rs.getInt("id")); 32 out.println(":"); 33 out.println(rs.getString("name")); 34 out.println(":"); 35 out.println(rs.getInt("price")); 36 out.println("<br>"); 37 } 38 rs.close(); 39 con.close(); 40 } catch(Exception e){ 41 e.printStackTrace(out); 42 } 43 Page.footer(out); 44 } 45}
コネクションプールの設定
xml
1<Context reloadable="true"> 2<Resource 3 name="jdbc/book" 4 auth="Container" 5 type="javax.sql.DataSource" 6 driverClassName="org.h2.Driver" 7 url="jdbc:h2:tcp://localhost/~/book" 8 username="sa" 9 password="" 10/> 11</Context> 12
Database
1SELECT * FROM PRODUCT ; 2ID 3NAME 4PRICE 51 6まぐろ 7100 82 9サーモン 10100 113 12えび 13100 144 15いか 16100 175 18えんがわ 19100 206 21あなご 22100 237 24たまご 25100 268 27ほたて 28100 299 30赤貝 31100 3210 33つぶ貝 34100 3511 36サラダ軍艦 37150 38(11 rows, 0 ms)
試したこと
whileを使わない状態でDB接続文の後にout.println("test");で試したところ、testが正常に表示されました。
一括取得した変数rsがどのような状態か見たいためour.println(rs.getInt("id"));とすると、ブラウザ画面に以下のエラーメッセージが
表示されます
test org.h2.jdbc.JdbcSQLException: 有効なデータがありません No data is available [2000-194] at org.h2.message.DbException.getJdbcSQLException(DbException.java:345)・・・
上記の結果から
①コネクションプールを使わないやり方を調べてDB接続を試みましたが、while文のコンパイルで同じ結果になりました
Class.forName("JDBCのクラス名");
Connection conn = DriverManager.getConnection("接続文字列","ユーザー名","パスワード");
等・・
②while文の閉じカッコ(})に';'をつけましたが、エラー文は変わりませんでした。
③H2のJDBCドライバをダウンロードし直し(テキスト本の用意した開発環境のzipフォルダ内にあります)、
WEB-INFO/lib下へh2-1.4.194.jarをコピペし直しましたが、状況は特に変わりませんでした。
④開いているh2の8082ポートを全て閉じ、再起動してコンパイルしましたが、whileで同じエラーでした。
while文を一体どうしたら良いのか・・・数時間悩んでいるのですがお手上げです・・・
同じ本を使っている方(基礎からのサーブレット/jsp)や詳しい方がいらっしゃいましたらご教授願います
補足情報(FW/ツールのバージョンなど)
jdkのバージョン: jdk1.8.0_121
エディタ:ATOM
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/12/15 09:10