前提
課題の一環で、MySQLのデータベースを利用し、JSPを用いた住所検索システムを作成中です。
実現したいこと
郵便番号または住所(文字列・部分一致)を入力して検索可能となる仕様にしたい。
条件は以下の通り。
- 1.jspでテキストボックスを2つ配置する。
- 2.jspで2つのパラメータを取得する。
- Zip1.javaの「dataload」メソッドを2つの引数にする。
発生している問題・エラーメッセージ
Webブラウザに
エラーの表示 データベースに接続できませんでした。
というように2.jspに記載されているエラーメッセージが表示されます。
該当のソースコード
1.jsp
1<html> 2 <head> 3 <a href="../11-3/1.jsp"></a> 4 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 5 <title>郵便番号検索フォーム</title> 6 </head> 7 <body> 8 <header> 9 <h1>郵便番号検索フォーム</h1> 10 </header> 11 <article> 12 <form action="2.jsp" method="post"> 13 郵便番号:<input type="text" name="code" value="" size="30" /><br /> 14 住所:<input type="text" name="address" value="" size ="30" /><br /> 15 <input type="submit" value="送信"> 16 </form> 17 </article> 18 </body> 19</html>
2.jsp
1<%@page contentType="text/html" pageEncoding="UTF-8" %> 2<jsp:useBean id="zip" scope="session" class="ex11.Zip1" /> 3 4<% /* エンコード */ 5 6 request.setCharacterEncoding("UTF-8"); 7 8 /* 変数の宣言 */ 9 String code = ""; 10 String address =""; 11 12 /* パラメータの取得 */ 13 if ((request.getParameter("code") != null) || (request.getParameter("address") != null)) { 14 if(request.getParameter("code") != null){ 15 code = request.getParameter("code"); 16 } 17 if(request.getParameter("address") != null){ 18 address = request.getParameter("address"); 19 } 20 21 /* データ一覧の取得メソッド */ 22 try { 23 zip.dataload(code, address); 24%> 25<jsp:forward page="3.jsp" /> 26<% 27} catch (Exception e) { 28%> 29 30<!DOCTYPE html> 31<html> 32 <head> 33 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 34 <title>エラーの表示</title> 35 </head> 36 <body> 37 <header> 38 <h1>エラーの表示</h1> 39 </header> 40 <article> 41 データベースに接続できませんでした。 42 </article> 43 </body> 44</html> 45 46<% 47 } 48} 49%>
3.jsp
1<%@page contentType="text/html" pageEncoding="UTF-8"%> 2<jsp:useBean id="zip" scope="session" class="ex11.Zip1" /> 3 4<!DOCTYPE html> 5<html> 6 <head> 7 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 8 <title>住所の表示</title> 9 <!-- Google Maps APIを読み込む --> 10 <script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false"></script> 11 <script type="text/javascript" src="maps.js"></script> 12 </head> 13 <body onload = "initialize()"> 14 <header> 15 <h1>住所の表示</h1> 16 </header> 17 <article> 18 データ件数:<%= zip.getNum()%> 19 <table border="1"> 20 <tr><th>郵便番号</th><th>住所</th></tr> 21 <% for (int i = 0; i < zip.getNum(); i++) {%> 22 <tr><td><%= zip.getCode(i)%></td><td <%= "id=\"address" + i + "\""%>><%= zip.getAddress1(i) + zip.getAddress2(i) + zip.getAddress3(i)%></td></tr> 23 <% }%> 24 </table> 25 26 </article> 27 </body> 28</html>
Zip1.java
1package ex11; 2 3import java.sql.*; 4 5public class Zip1 { 6 7 /* 1. フィールドの定義 */ 8 protected String[] code = new String[20]; //郵便番号 9 protected String[] address1 = new String[20]; //住所1 10 protected String[] address2 = new String[20]; //住所2 11 protected String[] address3 = new String[20]; //住所3 12 protected int num; 13 14 /* 2. メソッド */ 15 /* 2.1 データベースからのデータ取得メソッド */ 16 public void dataload(String code, String address) throws Exception { //エラー処理が必要にする 17 18 /* 2.1.1 データベースに接続 */ 19 Class.forName("com.mysql.jdbc.Driver").newInstance(); //com.mysql.jdbc.Driverはドライバのクラス名 20 String url = "jdbc:mysql://localhost/class2?characterEncoding=UTF-8"; //データベース名は適宜修正:文字エンコードはUTF-8 21 Connection conn = DriverManager.getConnection(url, "class", "class"); //上記URL設定でユーザ名とパスワードを使って接続 22 23 /* 2.1.2 SELECT文の実行 */ 24 String sql = "SELECT * FROM zip WHERE code LIKE ? OR CONCAT (address1, address2, address3) LIKE ? ORDER BY code"; //SQL文の設定 ?などパラメータが必要がない場合は通常のStatementを利用 25 PreparedStatement stmt = conn.prepareStatement(sql); //JDBCのステートメント(SQL文)の作成 26 stmt.setString(1, code + "%"); //Like文で曖昧検索 27 stmt.setString(2, "%"+ address + "%"); //Like文で曖昧検索 28 stmt.setMaxRows(100); //最大の数を制限 29 ResultSet rs = stmt.executeQuery(); //ステートメントを実行しリザルトセットに代入 30 31 /* 2.1.3 結果の取り出しと表示 */ 32 num = 0; 33 while (rs.next()) { //リザルトセットを1行進める.ない場合は終了 34 this.code[num] = rs.getString("code"); 35 this.address1[num] = rs.getString("address1"); 36 this.address2[num] = rs.getString("address2"); 37 this.address3[num] = rs.getString("address3"); 38 num++; 39 } 40 41 /* 2.1.4 データベースからの切断 */ 42 rs.close(); //開いた順に閉じる 43 stmt.close(); 44 conn.close(); 45 } 46 public String getCode(int i) { 47 if (i >= 0 && num > i) { 48 return code[i]; 49 } else { 50 return ""; 51 } 52 } 53 public String getAddress1(int i) { 54 if (i >= 0 && num > i) { 55 return address1[i]; 56 } else { 57 return ""; 58 } 59 } 60 public String getAddress2(int i) { 61 if (i >= 0 && num > i) { 62 return address2[i]; 63 } else { 64 return ""; 65 } 66 } 67 public String getAddress3(int i) { 68 if (i >= 0 && num > i) { 69 return address3[i]; 70 } else { 71 return ""; 72 } 73 } 74 public int getNum() { 75 return num; 76 } 77}
//以下SQLデータベースの例 //テーブル名”zip" +----+--------+---------+---------+--------------+--------------+--------------+----------+------------+----------+ | id | jis | oldcode | code | address1ruby | address2ruby | address3ruby | address1 | address2 | address3 | +----+--------+---------+---------+--------------+--------------+--------------+----------+------------+----------+ | 2 | 01101 | 064 | 0640941 | ホッカイドウ | サッポロシチュウオウク | アサヒガオカ | 北海道 | 札幌市中央区 | 旭ケ丘 | +----+--------+---------+---------+--------------+--------------+--------------+----------+------------+----------+
試したこと
エラーの問題点としてSQL文が間違っていると予想し、SELECT句、CONCATを中心に色々調べ、変更してみたのですがエラーメッセージは変わらず…
SQL文が誤っている場合どう変更すればいいか、また、その他問題点があれば教えてください。
環境
Apache NetBeans IDE 15
MySQL 8.0.31


回答2件
あなたの回答
tips
プレビュー