質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

1回答

2295閲覧

JSP/サーブレットで構成されたフォームを使ったデータベース検索結果の表示

退会済みユーザー

退会済みユーザー

総合スコア0

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

1クリップ

投稿2020/06/10 05:14

なぜ検索結果が表示されないのか、原因と対処法がわからず
前に進めない状態に陥てしまいました。

index.jspを実行し検索ページに情報を入力すると
各フォームにて
名前検索でnull
生年検索でjava.sql.SQLException: Parameter index out of range (2 > number of parameters, which is 1).
種別検索でnullのエラーが発生します。

生年検索のjava.sql.SQLException: Parameter index out of range (2 > number of parameters, which is 1).についてはsqlの指定の際に何らかの誤りがあるようなのですが
そこがどこでどのように対処できるのがわからないといった状況です。

課題の難易度が高くなってきて追い付くのがやっとなので自分の努力不足な面もあると思いますが
できましたらわかりやすく細かく解説していただけると幸いです。

よろしくお願いいたします。

java

1<%@page 2 import="jums.JumsHelper" %> 3<% 4 JumsHelper jh = JumsHelper.getInstance(); 5%> 6 7<%@page contentType="text/html" pageEncoding="UTF-8"%> 8<!DOCTYPE html> 9<html> 10 <head> 11 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 12 <title>JUMSユーザー情報検索画面</title> 13 </head> 14 <body> 15 <form action="SearchResult" method="POST"> 16 名前: 17 <input type="text" name="name"> 18 <br><br> 19 20 生年:  21 <select name="year"> 22 <option value="">----</option> 23 <% for(int i=1950; i<=2010; i++){ %> 24 <option value="<%=i%>"><%=i%></option> 25 <% } %> 26 </select>年生まれ 27 <br><br> 28 29 種別: 30 <br> 31 <% for(int i = 1; i<=3; i++){ %> 32 <input type="radio" name="type" value="<%=i%>"><%=jh.exTypenum(i)%><br> 33 <% } %> 34 <br> 35 36 <input type="submit" name="btnSubmit" value="検索"> 37 </form> 38 <br> 39 <%=jh.home()%> 40 </body> 41</html>

java

1package jums; 2 3import java.io.IOException; 4 5import javax.servlet.ServletException; 6import javax.servlet.http.HttpServlet; 7import javax.servlet.http.HttpServletRequest; 8import javax.servlet.http.HttpServletResponse; 9 10/** 11 * 12 * @author hayashi-s 13 */ 14public class SearchResult extends HttpServlet { 15 16 private static final long serialVersionUID = 1L; 17 18 /** 19 * @see HttpServlet#HttpServlet() 20 */ 21 public SearchResult() { 22 super(); 23 // TODO Auto-generated constructor stub 24 } 25 26 /** 27 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) 28 */ 29 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 30 try{ 31 request.setCharacterEncoding("UTF-8");//リクエストパラメータの文字コードをUTF-8に変更 32 33 //フォームからの入力を取得して、JavaBeansに格納 34 UserDataBeans udb = new UserDataBeans(); 35 udb.setName(request.getParameter("name")); 36 udb.setYear(request.getParameter("year")); 37 udb.setType(request.getParameter("type")); 38 39 //DTOオブジェクトにマッピング。DB専用のパラメータに変換 40 UserDataDTO searchData = new UserDataDTO(); 41 udb.UD2DTOMapping(searchData); 42 43 UserDataDTO resultData = UserDataDAO .getInstance().search(searchData); 44 request.setAttribute("resultData", resultData); 45 46 request.getRequestDispatcher("/searchresult.jsp").forward(request, response); 47 }catch(Exception e){ 48 //何らかの理由で失敗したらエラーページにエラー文を渡して表示。想定は不正なアクセスとDBエラー 49 request.setAttribute("error", e.getMessage()); 50 request.getRequestDispatcher("/error.jsp").forward(request, response); 51 } 52 } 53 54 /** 55 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) 56 */ 57 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 58 // TODO Auto-generated method stub 59 doGet(request, response); 60 } 61 62}

java

1<%@page import="jums.JumsHelper" 2 import="jums.UserDataDTO" %> 3<% 4 JumsHelper jh = JumsHelper.getInstance(); 5 UserDataDTO udd = (UserDataDTO)request.getAttribute("resultData"); 6%> 7<%@page contentType="text/html" pageEncoding="UTF-8"%> 8<!DOCTYPE html> 9<html> 10 <head> 11 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 12 <title>JUMS検索結果画面</title> 13 </head> 14 <body> 15 <h1>検索結果</h1> 16 <table border=1> 17 <tr> 18 <th>名前</th> 19 <th>生年</th> 20 <th>種別</th> 21 <th>登録日時</th> 22 </tr> 23 <tr> 24 <td><a href="ResultDetail?id=<%= udd.getUserID()%>"><%= udd.getName()%></a></td> 25 <td><%= udd.getBirthday()%></td> 26 <td><%= udd.getType()%></td> 27 <td><%= udd.getNewDate()%></td> 28 </tr> 29 </table> 30 </body> 31 <%=jh.home()%> 32</html> 33

java

1package jums; 2 3import base.DBManager; 4import java.sql.PreparedStatement; 5import java.sql.Connection; 6import java.sql.ResultSet; 7import java.sql.SQLException; 8import java.sql.Timestamp; 9import java.text.SimpleDateFormat; 10 11/** 12 * ユーザー情報を格納するテーブルに対しての操作処理を包括する 13 * DB接続系はDBManagerクラスに一任 14 * 基本的にはやりたい1種類の動作に対して1メソッド 15 * @author hayashi-s 16 */ 17public class UserDataDAO { 18 19 //インスタンスオブジェクトを返却させてコードの簡略化 20 public static UserDataDAO getInstance(){ 21 return new UserDataDAO(); 22 } 23 24 /** 25 * データの挿入処理を行う。現在時刻は挿入直前に生成 26 * @param ud 対応したデータを保持しているJavaBeans 27 * @throws SQLException 呼び出し元にcatchさせるためにスロー 28 */ 29 public void insert(UserDataDTO ud) throws SQLException{ 30 Connection con = null; 31 PreparedStatement st = null; 32 try{ 33 con = DBManager.getConnection(); 34 st = con.prepareStatement("INSERT INTO user_t(name,birthday,tell,type,comment,newDate) VALUES(?,?,?,?,?,?)"); 35 st.setString(1, ud.getName()); 36 st.setDate(2, new java.sql.Date(ud.getBirthday().getTime()));//指定のタイムスタンプ値からSQL格納用のDATE型に変更 37 st.setString(3, ud.getTell()); 38 st.setInt(4, ud.getType()); 39 st.setString(5, ud.getComment()); 40 st.setTimestamp(6, new Timestamp(System.currentTimeMillis())); 41 st.executeUpdate(); 42 System.out.println("insert completed"); 43 }catch(SQLException e){ 44 System.out.println(e.getMessage()); 45 throw new SQLException(e); 46 }finally{ 47 if(con != null){ 48 con.close(); 49 } 50 } 51 52 } 53 54 /** 55 * データの検索処理を行う。 56 * @param ud 対応したデータを保持しているJavaBeans 57 * @throws SQLException 呼び出し元にcatchさせるためにスロー 58 * @return 検索結果 59 */ 60 public UserDataDTO search(UserDataDTO ud) throws SQLException{ 61 Connection con = null; 62 PreparedStatement st = null; 63 try{ 64 con = DBManager.getConnection(); 65 66 // 67 String sql = "SELECT * FROM user_t"; 68 boolean flag = false; 69 if (!ud.getName().equals("")) { 70 sql += " WHERE name like ?"; 71 flag = true; 72 } 73 if (ud.getBirthday()!=null) { 74 if(!flag){ 75 sql += " WHERE birthday like ?"; 76 flag = true; 77 }else{ 78 sql += " AND birthday like ?"; 79 } 80 } 81 if (ud.getType()!=0) { 82 if(!flag){ 83 sql += " WHERE type like ?"; 84 }else{ 85 sql += " AND type like ?"; 86 } 87 } 88 st = con.prepareStatement(sql); 89 st.setString(1, "%"+ud.getName()+"%"); 90 st.setString(2, "%"+ new SimpleDateFormat("yyyy").format(ud.getBirthday())+"%"); 91 st.setInt(3, ud.getType()); 92 93 ResultSet rs = st.executeQuery(); 94 rs.next(); 95 UserDataDTO resultUd = new UserDataDTO(); 96 resultUd.setUserID(rs.getInt(1)); 97 resultUd.setName(rs.getString(2)); 98 resultUd.setBirthday(rs.getDate(3)); 99 resultUd.setTell(rs.getString(4)); 100 resultUd.setType(rs.getInt(5)); 101 resultUd.setComment(rs.getString(6)); 102 resultUd.setNewDate(rs.getTimestamp(7)); 103 104 System.out.println("search completed"); 105 106 return resultUd; 107 }catch(SQLException e){ 108 System.out.println(e.getMessage()); 109 throw new SQLException(e); 110 }finally{ 111 if(con != null){ 112 con.close(); 113 } 114 } 115 116 } 117 118 /** 119 * ユーザーIDによる1件のデータの検索処理を行う。 120 * @param ud 対応したデータを保持しているJavaBeans 121 * @throws SQLException 呼び出し元にcatchさせるためにスロー 122 * @return 検索結果 123 */ 124 public UserDataDTO searchByID(UserDataDTO ud) throws SQLException{ 125 Connection con = null; 126 PreparedStatement st = null; 127 try{ 128 con = DBManager.getConnection(); 129 130 String sql = "SELECT * FROM user_t WHERE userID = ?"; 131 132 st = con.prepareStatement(sql); 133 st.setInt(1, ud.getUserID()); 134 135 ResultSet rs = st.executeQuery(); 136 rs.next(); 137 UserDataDTO resultUd = new UserDataDTO(); 138 resultUd.setUserID(rs.getInt(1)); 139 resultUd.setName(rs.getString(2)); 140 resultUd.setBirthday(rs.getDate(3)); 141 resultUd.setTell(rs.getString(4)); 142 resultUd.setType(rs.getInt(5)); 143 resultUd.setComment(rs.getString(6)); 144 resultUd.setNewDate(rs.getTimestamp(7)); 145 146 System.out.println("searchByID completed"); 147 148 return resultUd; 149 }catch(SQLException e){ 150 System.out.println(e.getMessage()); 151 throw new SQLException(e); 152 }finally{ 153 if(con != null){ 154 con.close(); 155 } 156 } 157 158 } 159}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

YT0014

2020/06/11 01:17

エラーが発生する場合の条件で、コードに従って、SQL文字列をさくせいしてみてください。
guest

回答1

0

ベストアンサー

SQLの組み立て部分は特に問題はないのですが、PreparedStatementにて引数を指定する個数が、SQL組み立て時の条件に一致していないためエラーになっています。

例えばnameの値が空文字だった場合は、sql += " WHERE name like ?"; の部分は使われませんので、

st.setString(1, "%"+ new SimpleDateFormat("yyyy").format(ud.getBirthday())+"%"); st.setInt(2, ud.getType());

としなければなりません。つまり動的にSQLを作成した条件にあわせて、パラメータのバインドとその位置を変える必要があります。

投稿2020/06/30 00:06

A-pZ

総合スコア12011

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問