- - PR -
JSP データベース (質問)
| 投稿者 | 投稿内容 |
|---|---|
|
投稿日時: 2004-08-11 17:25
はじめまして、只今、JAVAの勉強中の者です。御指導の程、よろしくお願いします^^
別のものから、以下の jsp を呼び出すとMySQLからデータを取り出す練習しているのですが、 =================================================== <%@ page contentType="text/html; charset=EUC-JP" import="java.sql.*, java.util.*, java.net.*" %> <%! String host = "localhost"; String db = "e_schedule"; String userid = "root"; String passwd ="sorosu00sql"; String DriverName = "org.gjt.mm.mysql.Driver"; String url = "jdbc:mysql://" + host + "/" + db ; String SQL = null; String Year; String Month; String Day; String YearMD; String mark; int year; int month; int i, j; int setspace; int cntday = 1; int maxday; int week; public int chkSchedule(String YMD){ int judge = 0; Connection connection = null; try{ Class.forName(DriverName); connection = DriverManager.getConnection(url,userid,passwd); Statement statement = connection.createStatement(); SQL = "SELECT * FROM schedule"; SQL = SQL + " WHERE Ymd = '" + YMD + "'"; ResultSet rs = statement.executeQuery(SQL); if (rs.next() == false){ judge = 0; } else { judge = 1; } rs.close(); statement.close(); connection.close(); } catch(Exception excp){ excp.printStackTrace(); } finally{ try{ if (connection != null){ connection.close(); } } catch(Exception sqle){} } return judge; } %> <html> <head> <base target="right"> </head> <body bgcolor="#FFFFFF" text="#000000" link="#FF8888" vlink="#FF0000"> <% Calendar calen = Calendar.getInstance(); Year = request.getParameter("year"); Month = request.getParameter("month"); year = Integer.parseInt(Year); month = Integer.parseInt(Month); %> <table border="1"> <tr> <td width="30" align="center" bgcolor="#FFB6C1">日</td> <td width="30" align="center" bgcolor="#90EE90">月</td> <td width="30" align="center" bgcolor="#90EE90">火</td> <td width="30" align="center" bgcolor="#90EE90">水</td> <td width="30" align="center" bgcolor="#90EE90">木</td> <td width="30" align="center" bgcolor="#90EE90">金</td> <td width="30" align="center" bgcolor="#90EE90">土</td> </tr> <% calen.set(year, month-1, 1); maxday = calen.getActualMaximum(Calendar.DATE); week = calen.get(Calendar.DAY_OF_WEEK); out.println(Integer.toString(year) + "年"); out.println(Integer.toString(month) + "月"); for (i=1; i<=6; i++){ if (cntday > maxday){ break; } out.println("<TR ALIGN='right'>"); for (j=1; j<=7; j++){ out.println("<TD>"); if (cntday <= 1){ setspace = week - 1; } else { setspace = 0; } if (j > setspace){ Day = Integer.toString(cntday); if (Day.length() == 1){ Day = "0" + Day; } YearMD = Year + Month + Day; mark = ""; if (chkSchedule(YearMD) == 1){ mark = "*"; } %> <A href="./show_Schedule.jsp?Ymd=<%= YearMD %>"><%= mark %><%= cntday %> <% cntday++; if (cntday > maxday){ out.println("</TD>"); break; } } else { out.println(" "); } out.println("</TD>"); } out.println("</TR>"); } cntday = 1; %> </table> <br> <a href="/jsp-examples/jsp/input_YM_top.jsp" target="_top">年月入力へ戻る</a> </body </html> ================================================== statusバーに Transffering data from 192.・・・・・ が出たまま動きません(データ転送中のまま;;)。要は処理結果(0か1)が返って来ません。なぜ? そこで、確認のため、上記と同じ物を以下のように class ファイルで作ると、値が返って来ます。 ================================================== import java.sql.*; import java.net.*; public class Test5 { public static void main(String srgs[]){ String host = "localhost"; String db = "e_schedule"; String userid = "root"; String passwd ="sorosu00sql"; String DriverName = "org.gjt.mm.mysql.Driver"; String url = "jdbc:mysql://" + host + "/" + db ; String SQL = null; String YMD = "20040805"; String Year; String Month; String Day; String YearMD; String mark; int year; int month; int i, j; int setspace; int cntday = 1; int maxday; int week; int judge = 0; Connection connection = null; try{ Class.forName(DriverName); connection = DriverManager.getConnection(url,userid,passwd); Statement statement = connection.createStatement(); SQL = "SELECT * FROM schedule"; SQL = SQL + " WHERE Ymd = '" + YMD + "'"; ResultSet rs = statement.executeQuery(SQL); if (rs.next() == false){ judge = 0; } else { judge = 1; } rs.close(); statement.close(); connection.close(); } catch(Exception excp){ excp.printStackTrace(); } finally{ try{ if (connection != null){ connection.close(); } } catch(Exception e){} } System.out.println(judge); } } ==================================== どうか、御指導頂けますでしょうか。よろしくお願いします。 |
|
投稿日時: 2004-08-11 17:36
もう少しシンプルなテストケースを作って原因を絞り込んではいかがでしょうか?
途中どこかで止まっているようなら ・デバッグ文を入れる ・ステップ実行する ・スレッドダンプを取得する などして切り分けられます。 また、関係ないとは思いますが connection.close() を二回しているのはちょっと気になります。 ResultSet/Statement/Connection のクローズは finally ブロックで一回やれば十分です。 [ メッセージ編集済み 編集者: インギ 編集日時 2004-08-11 17:44 ] |
|
投稿日時: 2004-08-11 18:00
きちんと全部追ったわけではありませんが、1回このJSPを呼び出すとchkScheduleが何十回も
呼び出されるわけですよね? それで単に時間がかかっているだけではないですか? あと気になる点を指摘しておきます。JSPの宣言部で定義した変数は、サーブレットに変換 されるとインスタンス変数になります。JSPはサーブレットと同様インスタンスが使いまわ されるので、複数のリクエストを同時に受けるとおそらく正常に動作しないでしょう。 |
|
投稿日時: 2004-08-11 18:03
とりあえず、上手く動かないのは、
もっと細かくテストをして下さい。 これでは、殆ど丸投げです。 それと、JSPで上手く動かなくて、 アプリケーションでやったのでは、 比較対照にあまりならないかと思います。 どうせやるなら、サーブレットでやってください。 サーブレットでOKなら、JSPでもOKですよ。 |
|
投稿日時: 2004-08-11 19:06
なるほど、色々ご指摘ありがとうございます。実際に皆さんのおっしゃたことをやってみます。後ほど報告します。
もし、他に何かご指摘があるようでしたら、書き込んでください。 |
|
投稿日時: 2004-08-12 04:05
昨日は、皆さんの御指導有難うございました。実際に御指摘のことを行ってみました。シンプルなテストケースで2点(サーブレット/JSP)を以下の内容で行ったのですが、2点とも statusバーに Waiting for 192.168.・・・・ が出たまま変化しません。どうしたらよいのか分かりません;;
**サーブレット** ============================================ import java.io.*; import javax.servlet.*; import javax.servlet.http.*; import java.net.*; import java.sql.*; public class ServletExample1 extends HttpServlet{ public void doGet (HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException{ String server = "localhost"; //MySQLサーバ String db = "test"; // String user = "root"; //ユーザー名 String pass = "sorosu00sql"; //パスワード String url = "jdbc:mysql://" + server + "/" + db + "?useUnicode=true&characterEncoding=EUC-JP"; Connection con = null; //HTML表示のため PrintWriter out; response.setContentType("text/html; charset=EUC-JP"); out = response.getWriter(); out.println("<HTML><HEAD><TITLE>servletからの接続1</TITLE></HEAD><BODY>"); try{ //ドライバのロード Class.forName("org.gjt.mm.mysql.Driver"); //MySQLサーバへの接続 con = DriverManager.getConnection(url,user,pass); //Statementオブジェクトの生成 Statement stmt = con.createStatement(); //漢字を含んだSQL文 String sql_str = "INSERT INTO list (name,memo) VALUES ('4番目','サーブレットからのテスト')"; stmt.executeUpdate(sql_str); out.println("漢字を含んだレコードの挿入成功です!"); //切断 con.close(); stmt.close(); out.close(); }catch(SQLException e) { out.println("接続失敗です〜<br>\n理由:" + e.toString()); }catch(Exception e){ e.printStackTrace(); }finally{ try{ //切断 con.close(); }catch(Exception e){} } } } **JSP** ============================================ <%@ page import="java.net.*,java.sql.*" import="org.gjt.mm.mysql.Driver" contentType="text/html; charset=EUC-JP" %> <HTML> <HEAD> <TITLE>JSPからの接続</TITLE> </HEAD> <BODY> <% String server = "localhost"; //MySQLサーバーのアドレス String db = "test"; //データベース名 String user = "root"; //ユーザー名 String pass = "sorosu00sql"; //パスワード String url = "jdbc:mysql://" + server + "/" + db + "?useUnicode=true&characterEncoding=EUC-JP"; Connection con = null; try{ //ドライバーのロード Class.forName("org.gjt.mm.mysql.Driver"); //MySQLサーバーへの接続 con = DriverManager.getConnection(url,user,pass); //Statementオブジェクトの生成 Statement stmt = con.createStatement(); //漢字を含んだSQL文 String sql_str = "INSERT INTO list (name,memo) VALUES ('5番目','JSPからのテスト')"; stmt.executeUpdate(sql_str); %> 漢字を含んだレコードの挿入成功です! <% //切断 con.close(); stmt.close(); }catch(SQLException e) { %> 接続失敗です〜 <% }finally{ try{ //切断 con.close(); }catch(Exception e){} } %> </BODY> </HTML> **MySQL** ========================================== +-----------------------+----------+------------------+ | host | user | password | +-----------------------+----------+------------------+ | localhost | root | 08251b511b697a2e | | localhost.localdomain | root | 08251b511b697a2e | | localhost | | | | localhost.localdomain | | | | localhost | bugs | 07f20efe61e34741 | | localhost | schedule | | +-----------------------+----------+------------------+ 6 rows in set (0.16 sec) mysql> show columns from schedule; +-------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+---------+-------+ | Ymd | varchar(50) | | PRI | | | | Memo | text | YES | | NULL | | +-------+-------------+------+-----+---------+-------+ 2 rows in set (0.00 sec) mysql> show columns from list; +-------+-----------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+-----------+------+-----+---------+-------+ | id | int(10) | YES | | NULL | | | name | char(20) | YES | | NULL | | | memo | char(240) | YES | | NULL | | +-------+-----------+------+-----+---------+-------+ 3 rows in set (0.00 sec) **CLASSPATH** ========================================== export JAVA_HOME=/usr/java/j2sdk1.4.2_05 export PATH=$PATH:$JAVA_HOME/bin export TOMCAT_HOME=/usr/share/tomcat export CATALINA_HOME=/usr/share/tomcat export CLASSPATH=.:$JAVA_HOME/jre/lib:$JAVA_HOME/lib:$JAVA_HOME/lib/tools.jar:$CATALINA_HOME/common/lib/mysql-connector-java-3.0.14-production-bin.jar:$CATALINA_HOME/common/lib 御指導よろしくお願いします。 |
|
投稿日時: 2004-08-12 08:28
おはようございます。
サーブレット・JSPのソースコードが判りやすくなりましたね。 ただ、拝見した限り問題ないように見えますが(ただし、自分の目が 節穴の可能性あり。。。 ちょっと気になりましたのは、Waiting for 192.168.・・・・となったまま、ということで MySQLとの接続の前に、Tomcatは正しくリクエスト・レスポンス処理をしますか? [ メッセージ編集済み 編集者: Ken-Lab 編集日時 2004-08-12 08:29 ] |
|
投稿日時: 2004-08-12 09:12
うーん、ログに出力するなりして、
どこまで動いているのか確認して欲しいですね。 これが出来ないと、仕事になりませんので・・・。 |
