なぜ検索結果が表示されないのか、原因と対処法がわからず
前に進めない状態に陥てしまいました。
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}
回答1件
あなたの回答
tips
プレビュー