JSPにある複数の入力項目をServletからDBに登録
複数の入力項目を一つのボタンを使って同じテーブルにデータを登録させたいのですが、
作成する為のロジックがいまいち思いつきません。
前提
JSPの入力項目をServletを使用してDBに登録させるシステムを作っています。
ただ、複数の入力項目があったとき二回インサートさせる方法がいまいちよくわかりません。
JSPから受取る値は配列格納して受け取った分だけ繰り返してINSERTさせるイメージでしょうか?
下記のスクショから「5行目」は登録できますが、「6行目」から登録できません。
これは、Servetに送るNameの値が重複しているからでしょうか?
※「追加」ボタンを押下したら行が増える仕様
JSP
JSP/javascript
1<input type="submit" value="追加" name="" onclick="addListRow()"> 2 <form method="post" action="/DBConnection/list-servlet"> 3 追加: 4 5 <input type="submit" value="登録" name="ins"> 6 <table id="tbl" border=""> 7 <tr> 8 <th colspan="2">上下ボタン</th> 9 <th>ID</th> 10 <th>TODO</th> 11 <th>TIME LIMIT</th> 12 <th>削除ボタン</th> 13 </tr> 14 <c:forEach var="todo" items="${todoList}"> 15 <tr> 16 <td><input type="submit" value="↑上" onclick="upListRow()"></td> 17 <td><input type="submit" value="↓下" onclick="dwListRow()"></td> 18 <td><input type="text" value="${todo.id}"></td> 19 <td><input type="text" value="${todo.todo}"></td> 20 <td><input type="text" value="${todo.timeLimit}"></td> 21 <td></td> 22 </tr> 23 </c:forEach> 24 </table> 25 </form> 26 27 <script type="text/javascript"> 28 function addListRow() { 29 var objTBL = document.getElementById("tbl"); 30 if (!objTBL) { 31 return null; 32 } 33 // テーブルのレコードの数を取得(行数) 34 var count = objTBL.rows.length; 35 // レコードのセルの数を取得(列数) 36 37 // 最終行に新しい行を追加 38 var row = objTBL.insertRow(count); 39 // 列の追加 40 var c1 = row.insertCell(0); // 上ボタン 41 var c2 = row.insertCell(1); // 下ボタン 42 var c3 = row.insertCell(2); // ID 43 var c4 = row.insertCell(3); // TODO 44 var c5 = row.insertCell(4); // TIMELIMIT 45 var c6 = row.insertCell(5); // 削除ボタン 46 47 c1.innerHTML = '<input type="submit" value="↑上" id="upBtn" class="upBtn" onclick="upListRow()">'; 48 c2.innerHTML = '<input type="submit" value="↓下" id="dwBtn" class="dwBtn" onclick="dwListRow()">'; 49 c3.innerHTML = '<input type="text" class="inpval" value="" name="id" style="background-color:transparent;">'; 50 c4.innerHTML = '<input type="text" class="inpval" value="" name="todo" style="background-color:transparent;">'; 51 c5.innerHTML = '<input type="date" class="inpval" value="" name="timelimit" style="background-color:transparent;">'; 52 c6.innerHTML = '<input type="submit" value="削除" id="delBtn" class="delBtn" onclick="delListRow(this)">'; 53 }
コントローラー
Servlet
1 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 2 // 文字化け防止 3 request.setCharacterEncoding("UTF-8"); 4 5 if(request.getParameter("ins") != null) { 6 // フォームの値を受け取る 7 int id = Integer.parseInt(request.getParameter("id")); // ID 8 String todo = request.getParameter("todo"); // TODO 9 String timeLimit = request.getParameter("timelimit"); // TIMELIMIT 10 11 java.sql.Date sqlData = java.sql.Date.valueOf(timeLimit); 12 //SimpleDateFormat sdFormat = new SimpleDateFormat("yyyy-MM-dd"); 13 Date date = null; 14 try { 15 //date = sdFormat.parse(timeLimit); 16 // DB登録処理 17 TodoListDAO dao = new TodoListDAO(); 18 TodoDTO dto = new TodoDTO(); 19 dto.setId(id); 20 dto.setTodo(todo); 21 dto.setTimeLimit(sqlData); 22 23 dao.create(dto); 24 System.out.println("登録完了"); 25 RequestDispatcher dis = 26 request.getRequestDispatcher("/formSample.jsp"); 27 } 28 catch (ClassNotFoundException | SQLException e) { 29 // TODO 自動生成された catch ブロック 30 e.printStackTrace(); 31 } 32 33 34 } 35
INSERT処理
Java
1 // INSERT処理2 public boolean create(TodoDTO tododto) throws ClassNotFoundException, SQLException {3 // 実行するSQL文4 String sql = "INSERT INTO todo (id, todo, timelimit) VALUES(?,?,?)";5 6 // DB接続7 try (Connection con = DBConnection.getConnection();8 PreparedStatement pstmt = con.prepareStatement(sql)) {9 10 pstmt.setInt(1, tododto.getId());11 pstmt.setString(2, tododto.getTodo());12 pstmt.setDate(3, tododto.getTimeLimit());13 14 System.out.println("id1" + tododto.getId());15 System.out.println("TODO1" + tododto.getTodo());16 System.out.println("DATE1" + tododto.getTimeLimit());17 18 int result = pstmt.executeUpdate();19 System.out.println("resukt:" + result);20 if(result ==0) {21 return false;22 }23 // コミット24 con.commit();25 }26 return true;27 }28
DTO
DTO
1public class TodoDTO { 2 private int id; 3 private String todo; 4 private Date timeLimit; 5 6 public TodoDTO(int id, String todo, Date timeLimit) { 7 this.id = id; 8 this.todo = todo; 9 this.timeLimit = timeLimit; 10 } 11 12 public TodoDTO() { 13 } 14 15 public int getId() { 16 return id; 17 } 18 19 public void setId(int id) { 20 this.id = id; 21 } 22 23 public String getTodo() { 24 return todo; 25 } 26 27 public void setTodo(String todo) { 28 this.todo = todo; 29 } 30 31 public Date getTimeLimit() { 32 return timeLimit; 33 } 34 35 public void setTimeLimit(Date timeLimit) { 36 this.timeLimit = timeLimit; 37 } 38}
補足情報(FW/ツールのバージョンなど)
PosgreSQLを使用しています。

0 コメント