- PR -

JSPプログラムでデータベースのアクセスについて

投稿者投稿内容
KAKE
会議室デビュー日: 2005/09/17
投稿数: 17
投稿日時: 2005-11-08 12:55
こんにちは。JSP/サーブレットについて「10日で覚えるJSP/サーブレット入門教室第2版」を参考に勉強しています。ここで問題があるのですが、簡単なJSPプログラムは動作するのですが、データベースに接続して、新規レコードを登録するというところで、ほ本の通りにTomcatの「jsp10/dayo5-1]フォルダにinsert.jsp、[jsp10/META-INF]フォルダにcontext.xml、[jsp10/WEB-INF]にweb.xmlプログラムを書き、実行するとエラーが出てきました。環境設定のほうも、本の通りにpathを設定し、JDBCドライバ(mysql-connector-java-3.1.11)をダウンロードしてきて、そのmysql-connector-java-3.1.11-bin.jarファイルを[%CATALINA_HOME%/common/lib]フォルダにコピーしました。
MySQLでレコードを登録したいDB名[jsp10] table名[softlist] 項目[No,NAME,URL,date]

プログラムコードは
[insert.jsp]
<%@ page contentType="text/html; charset=Windows-31J"
import="java.sql.*,javax.naming.*,javax.sql.*" %>
<html>
<head>
<title>ソフトウェア情報登録</title>
</head>
<body>
<h1 style="background:#cccccc">ソフトウェア情報登録</h1>
<%
Context ctx=new InitialContext();
DataSource ds=(DataSource)ctx.lookup("java:comp/env/jdbc/Jsp10");
Connection db=ds.getConnection();
Statement sttSql=db.createStatement();
sttSql.executeUpdate("insert into softlist(No,NAME,URL,date) values('6','世界中で利用される高度なWebサーバ','http://httpd.apache.org/','2004/11/15')");
sttSql.close();
db.close();
%>
データを一件追加しました
</body>
</html>

[web.xml]
<?xml version="1.0" encoding="UTF-8" ?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee.web-app_2_4.xsd"
version="2.4">
<resource-ref>
<res-ref-name>jdbc/Jsp10</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
</web-app>
context.xml
<?xml version="1.0" encoding="UTF-8" ?>
<Context displayName="JSP10 Samples" docBase="jsp10" path="/jsp10"
reloadable="true">
<Resource name="jdbc/Jsp10" auth="Container"
type="javax.sql.DataSource" username="MySQLのユーザ名" password="MySQLのパスワード"
driverClassName="org.gjt.mm.mysql.Driver" url="jdbc:mysql://localhost/jsp10?useUnicode=true&amp;characterEncoding=sjis"
maxActive="4" maxWait="5000" maxIdle="2"
validationQuery="SELECT count(*) FROM softlist" />
</Context>

             エラーの説明

説明 The server encountered an internal error () that prevented it from fulfilling this request.
例外
javax.servlet.ServletException: Cannot load JDBC driver class 'org.gjt.mm.mysql.Driver'
org.apache.jasper.runtime.PageContextImpl.doHandlePageException(PageContextImpl.java:848)
org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImpl.java:781)
org.apache.jsp.day05_002d1.insert_jsp._jspService(org.apache.jsp.day05_002d1.insert_jsp:70)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:97)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:322)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:314)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:264)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
原因

org.apache.tomcat.dbcp.dbcp.SQLNestedException: Cannot load JDBC driver class 'org.gjt.mm.mysql.Driver'
org.apache.tomcat.dbcp.dbcp.BasicDataSource.createDataSource(BasicDataSource.java:766)
org.apache.tomcat.dbcp.dbcp.BasicDataSource.getConnection(BasicDataSource.java:540)
org.apache.jsp.day05_002d1.insert_jsp._jspService(org.apache.jsp.day05_002d1.insert_jsp:55)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:97)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:322)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:314)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:264)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)

JDBCドライバーや環境設定のほうも本の通りにしたのにこのようなエラーがでてきて、全く初心者なのでどう対処したらいいのかわかりません。どうかアドバイスの方をよろしくお願いします。
PCの環境
Windows XP、Tomcat5.5.12 、MySQL Servers and Client 4.0.20d、

山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2005-11-08 16:35
Cannot load JDBC driver class 'org.gjt.mm.mysql.Driver' 、とありますので JDBC ドライバを読み込めていないみたいです。
クラスパスを重点的に確認しましょう。
KAKE
会議室デビュー日: 2005/09/17
投稿数: 17
投稿日時: 2005-11-09 11:36
環境変数のクラスパスを重点的に調べてみると、抜けている文字があり、それを付け足したら、上手くいきました。
アドバイス本当にありがとうございました。
KAKE
会議室デビュー日: 2005/09/17
投稿数: 17
投稿日時: 2005-11-13 00:07
PCの環境
Windows XP、Tomcat5.5.12 、MySQL Servers and Client 4.0.20d
こんばんは。また質問させていただきます。
table名[softlist] 項目 No NAME URL date
            1 Web http://www.web.com/ 2005/01/11
2 ウェブ http://www.web.ne.jp/ 2005/12/22
3 WEB http://www.WEB.ne.jp/ 2005/12/12
MySQLに接続してフォームに入力し、結果を表示させることができるのですが、すこし問題があります。すべての結果の表示をすることができるのですが、フォーム入力でたとえばNAMEを検索したいときにフォームに「E」と入力すると検索結果が「WEB」と表示させたいのですが、「Web」と「WEB」の両方が表示されます。次にフォームに「ウェブ」と入力すると検索結果がかえってきません。あいまい検索なので「Web」と「WEB」の両方が表示されますが、検索で大文字と小文字を認識させるにはどのようにすればいいでしょうか?そして日本語を認識させることができるようにするにはどのようにすればいいのでしょうか?
どうかアドバイスをよろしくお願いします。

              プログラムコード
            [List Form2.html]
<%@ page contentType="text/html; charset=Windows-31J"
import="java.sql.*,javax.naming.*,javax.sql.*" %>
<html>
<head>
<title>ソフトウェア情報一覧</title>
</head>
<body>
<h1 style="background:#cccccc">ソフトウェア情報一覧検索</h1>
<form method="POST" action="softList2.jsp">
<table border="0">
<tr>
<th align="right">名前:</th>
<td><input type="text" name="nam" size="30" /></td>
</tr>
<tr>
<th align="right">入手日:</th>
<td><input type="text" name="date1" size="30" /></td>
</tr>
<tr>
<td colspan="2">
<input type="submit" value="検索" />
</tr>
</table>
</body>
</html>
               [softList2.jsp]  
<%@ page contentType="text/html; charset=Windows-31J"
import="java.sql.*,javax.naming.*,javax.sql.*" %>
<html>
<head>
<title>ソフトウェア情報一覧</title>
</head>
<body>
<h1 style="background:#cccccc">ソフトウェア情報一覧</h1>
<table border="0">
<tr style="background:#00ccff">
<th>No.</th><th>名前</th><th>URL</th><th>入手日</th>
</tr>
<%
Context ctx=new InitialContext();
DataSource ds=(DataSource)ctx.lookup("java:comp/env/jdbc/Jsp10");
Connection db=ds.getConnection();
Statement sttSql=db.createStatement();
String nam1 = request.getParameter("nam");
String date2=request.getParameter("date1");
String sql="SELECT * FROM softlist where NAME LIKE '%" + nam1 + "%' AND date LIKE '%" + date2 + "%'";
ResultSet rs=sttSql.executeQuery(sql);
while(rs.next()){
out.println("<tr style='background:#ffffcc'>");
out.println("<td>" + rs.getString("No") + "</td>");
out.println("<td>" + rs.getString("NAME") + "</td>");
out.println("<td>" + rs.getString("URL") + "</td>");
out.println("<td>" + rs.getString("date") + "</td>");
out.println("</tr>");
}
sttSql.close();
db.close();
%>
</table>
</body>
</html>

 


山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2005-11-13 01:07
入力された文字列を全部大文字に変換し、NAME をDB側の関数で全部大文字に変換して like で絞り込めば良いかと思います。
日本語がうまく通らないのは setCharacterEncoding していないから?
すんなりいかなそうなら焦点を明確にするためにも別スレッドにて質問すると良いかもしれません。

ご質問の内容と話題はそれますが、SQLを作成している部分セキュリティ的に危険です。「SQLインジェクション」ってキーワードを調べて対策を練ってみましょう。
うみゅ
会議室デビュー日: 2005/10/11
投稿数: 12
投稿日時: 2005-11-13 01:12
大文字/小文字を区別するというのは、LIKE BINARY '文字列' でできませんか?

質問と関係ありませんが2点ほど

1: SQL文で SELECT * FROM 〜を使って列を取得するのではなく列名を明示してください。
 不必要な列をデーターベースから返すことがないようにするため
2: その書き方だと、sql injectionが可能です。
参考
IPA ISEC セキュア・プログラミング講座のSQL組み立て時の引数チェック
http://www.ipa.go.jp/security/awareness/vendor/programming/a02_01.html

すいません。内容がかぶってしまいました。

[ メッセージ編集済み 編集者: うみゅ 編集日時 2005-11-13 01:13 ]
KAKE
会議室デビュー日: 2005/09/17
投稿数: 17
投稿日時: 2005-11-13 15:57
こんにちは、アドバイスありがとうございました。
突然ですが、またまた質問してすいません。
前の質問ではMySQLに接続してフォームに入力し、結果を表示させることをWindowsのPCで行うといったことですが、これをLinuxでも同じことをしようと思いました。必要なツールをインストールし、プログラムコードをまったく同じにし、いざ動作させてみると、簡単なjspプログラムは動作するのですが、MySQLに接続して結果表示させるプログラムではエラーがでてきて困っています。
プログラムコード
          context.xml
<?xml version="1.0" encoding="UTF-8" ?>
<Context displayName="JSP10 Samples" docBase="jsp10" path="/jsp10"
reloadable="true">
<Resource name="jdbc/Jsp10" auth="Container"
type="javax.sql.DataSource" username="kakeshita" password="kake"
driverClassName="org.gjt.mm.mysql.Driver" url="jdbc:mysql://localhost/jsp10?useUnicode=true&amp;characterEncoding=sjis"
maxActive="4" maxWait="5000" maxIdle="2"
validationQuery="SELECT count(*) FROM softlist" />
</Context>
             web.xml
<?xml version="1.0" encoding="UTF-8" ?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee.web-app_2_4.xsd"
version="2.4">
<resource-ref>
<res-ref-name>jdbc/Jsp10</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
</web-app>
あと、「List Form2」と「softList2」のプログラムは以前とまったく同じです。
                 エラー内容
exception

javax.servlet.ServletException: Name jdbc is not bound in this Context
org.apache.jasper.runtime.PageContextImpl.doHandlePageException(PageContextImpl.java:846)
org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImpl.java:779)
org.apache.jsp.day05.softList2_jsp._jspService(softList2_jsp.java:88)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:94)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:324)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:292)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:236)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)


root cause

javax.naming.NameNotFoundException: Name jdbc is not bound in this Context
org.apache.naming.NamingContext.lookup(NamingContext.java:768)
org.apache.naming.NamingContext.lookup(NamingContext.java:138)
org.apache.naming.NamingContext.lookup(NamingContext.java:779)
org.apache.naming.NamingContext.lookup(NamingContext.java:138)
org.apache.naming.NamingContext.lookup(NamingContext.java:779)
org.apache.naming.NamingContext.lookup(NamingContext.java:151)
org.apache.naming.SelectorContext.lookup(SelectorContext.java:136)
javax.naming.InitialContext.lookup(InitialContext.java:347)
org.apache.jsp.day05.softList2_jsp._jspService(softList2_jsp.java:59)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:94)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:324)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:292)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:236)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)

何回も質問をし、適切なアドバイスを下さって申し訳ありませんが、どうか改善策となるアドバイスのほうをどうかよろしくお願いします。
環境
Linux Fedora Core3、Tomcat 5.0.30 、MySQL-server-4.1.14、MySQL-client-4.1.14
MySQL-devel-4.1.14、MySQL-Max-4.1.14 MySQL-shared-compat-4.1.13をそれぞれインストールしました。

うみゅ
会議室デビュー日: 2005/10/11
投稿数: 12
投稿日時: 2005-11-13 19:53
回答ではありませんが2点ほどアドバイスを。
1,質問内容は箇条書きしていただけないでしょうか。
->文章が読みにくいです。
2,Top > @IT会議室 > FAQのBBコードの使用 を参考にしてコード部分はコードタグで囲ってください。

スキルアップ/キャリアアップ(JOB@IT)