前提・実現したいこと
SpringBootでwebアプリケーションを開発しています。
検索機能を実装したいのですが、うまく実装ができません。
404エラーが表示されますが原因がわかりません。
問題の箇所がわかる方がいらっしゃいましたら、ご教授いただきたいです。
参考にしたサイト
https://dev.classmethod.jp/articles/spring-data-jpa_search/
発生している問題・エラーメッセージ
404エラー
該当のソースコード
HTML
1<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 2<html xmlns:th="http://www.thymeleaf.org" 3 xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"> 4 <link th:href="@{/webjars/bootstrap/3.3.7-1/css/bootstrap.min.css}" rel="stylesheet"></link> 5 <script th:src="@{/webjars/jquery/1.11.1/jquery.min.js}"></script> 6 <script th:src="@{/webjars/bootstrap/3.3.7-1/js/bootstrap.min.js}"></script> 7<head> 8 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"></meta> 9</head> 10 <body> 11<div th:fragment="search_contents"> 12 <div class="page-header"> 13 <h1>商品検索画面</h1> 14 </div> 15 <form method="post" th:action="@{/search}" th:object="${searchForm}"> 16 <table> 17 <tr><td>商品コード : <input type="text" class="form-control" id="productCode" name="productCode" th:value="${productCode}"/></td></tr> 18 <tr><td>商品名 : <input type="text" class="form-control" id="productName" name="productName" th:value="${productName}"/></td></tr> 19 <tr><td>価格 : <input type="text" class="form-control" id="price" name="price" th:value="${price}"/></td></tr> 20 <tr><td><input type="submit" value="検索"/></td></tr> 21 </table> 22 </form> 23 <div th:if="${resultSize > 0}"><label th:text="${resultSize}"></label>件</div> 24 <table border="1" th:if="${resultSize > 0}"> 25 <tr> 26 <td>商品コード</td> 27 <td>商品名</td> 28 <td>価格</td> 29 </tr> 30 <tr th:each="data : ${result}"> 31 <td th:text="${product.productCode}"/> 32 <td th:text="${product.productName}"/> 33 <td th:text="${product.price}"/> 34 </tr> 35 </table> 36 </div> 37 </body> 38</html> 39
HTML
1<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 2<html xmlns:th="http://www.thymeleaf.org" 3 xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"> 4<head> 5<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"></meta> 6 7<!-- Bootstrapの設定 --> 8<link th:href="@{/webjars/bootstrap/3.3.7-1/css/bootstrap.min.css}" 9 rel="stylesheet"></link> 10<script th:src="@{/webjars/jquery/1.11.1/jquery.min.js}"></script> 11<script th:src="@{/webjars/bootstrap/3.3.7-1/js/bootstrap.min.js}"></script> 12 13<!-- CSSの読込 --> 14<link th:href="@{/css/home.css}" rel="stylesheet"></link> 15 16<title>Home</title> 17</head> 18<!-- =====ヘッダー(ナビゲーションバー)===== --> 19<body> 20 <!-- ===== ヘッダー(ナビゲーションバー) ===== --> 21 <nav class="navbar navbar-inverse navbar-fixed-top"> 22 <div class="container-fluid"> 23 <div class="navbar-header"> 24 <a class="navbar-brand" href="#">WEBアプリ演習</a> 25 </div> 26 </div> 27 <!-- ===== サイドバー ===== --> 28 <div class="container-fluid"> 29 <div class="row"> 30 <div class="col-sm-2 sidebar"> 31 <ul class="nav nav-pills nav-stacked"> 32 <li role="presentation"><a th:href="@{'/productList'}">商品管理</a> 33 </li> 34 </ul> 35 <ul class="nav nav-pills nav-stacked"> 36 <li role="presentation"><a th:href="@{'/search'}">商品検索</a> 37 </li> 38 </ul> 39 <ul class="nav nav-pills nav-stacked"> 40 <li role="presentation"><a th:href="@{'/signup'}">商品登録</a> 41 </li> 42 </ul> 43 </div> 44 </div> 45 </div> 46 <!-- ===== コンテンツ ===== --> 47 <div class="container-fluid"> 48 <div class="row"> 49 <div class="col-sm-10 col-sm-offset-2 main"> 50 <div th:include="__${contents}__"></div> 51 </div> 52 </div> 53 </div> 54</html>
Controller
1package com.example.demo.controller; 2 3import java.util.List; 4 5import org.springframework.beans.factory.annotation.Autowired; 6import org.springframework.ui.Model; 7import org.springframework.web.bind.annotation.GetMapping; 8import org.springframework.web.bind.annotation.RequestMapping; 9import org.springframework.web.bind.annotation.RequestMethod; 10import org.springframework.web.bind.annotation.RequestParam; 11import org.springframework.web.servlet.ModelAndView; 12 13import com.example.demo.domain.model.Product; 14import com.example.demo.domain.repository.ProductDao; 15import com.example.demo.domain.service.ProductService; 16 17public class SearchController { 18 @Autowired 19 private ProductDao ProductDao; 20 21 @Autowired 22 private ProductService productService; 23 24 @GetMapping("search") 25 public String find() { 26 return "search"; 27 } 28 29 //検索画面のGET用メソッド 30 @GetMapping("/search") 31 public String getHome(Model model) { 32 //コンテンツ部分に検索画面を表示するための文字列を登録 33 model.addAttribute("contents", "/search :: search_contents"); 34 35 return "homeLayout"; 36 } 37 38 @RequestMapping(value = "search", method = RequestMethod.POST) 39 public ModelAndView search(ModelAndView mav, 40 @RequestParam("productCode") String productCode, 41 @RequestParam("productName") String productName, 42 @RequestParam("price") int price) { 43 mav.setViewName("search"); 44 mav.addObject("productCode", productCode); 45 mav.addObject("productName", productName); 46 mav.addObject("price", price); 47 List<Product> result = ProductService.search(productCode, productName, price); 48 mav.addObject("result", result); 49 mav.addObject("resultSize", result.size()); 50 return mav; 51 } 52}
該当のソースコード
repository
1package com.example.demo.domain.repository; 2 3import java.util.List; 4 5import org.springframework.dao.DataAccessException; 6 7import com.example.demo.domain.model.Product; 8 9public interface ProductDao { 10 11 // Productテーブルにデータを1件insert. 12 public int insertOne(Product product) throws DataAccessException; 13 14 // Productテーブルのデータを1件取得 15 public Product selectOne(String productCode) throws DataAccessException; 16 17 // Productテーブルの全データを取得. 18 public List<Product> selectMany() throws DataAccessException; 19 20 // Productテーブルを1件更新. 21 public int updateOne(Product product) throws DataAccessException; 22 23 // Productテーブルを1件削除. 24 public int deleteOne(String productCode) throws DataAccessException; 25 26 public static List<Product> findAll() { 27 return null; 28 } 29 30} 31 32
該当のソースコード
model
1package com.example.demo.domain.model; 2 3import lombok.Data; 4 5@Data 6public class SignupForm { 7 8 private String productCode; 9 private String productName; 10 private int price; 11}
該当のソースコード
jdbc
1package com.example.demo.domain.jdbc; 2 3import java.util.ArrayList; 4import java.util.List; 5import java.util.Map; 6 7import org.springframework.beans.factory.annotation.Autowired; 8import org.springframework.dao.DataAccessException; 9import org.springframework.jdbc.core.JdbcTemplate; 10import org.springframework.stereotype.Repository; 11 12import com.example.demo.domain.model.Product; 13import com.example.demo.domain.repository.ProductDao; 14 15@Repository 16public class ProductDaoJdbcImpl implements ProductDao { 17 18 @Autowired 19 JdbcTemplate jdbc; 20 21 //Productテーブルのデータを1件insert 22 @Override 23 public int insertOne(Product product) throws DataAccessException { 24 //1件登録 25 int rowNumber = jdbc.update("insert into product(productCode," 26 + " productName," 27 + " price)" 28 + " values(?, ?, ?)", product.getProductCode(), product.getProductName(), product.getPrice()); 29 30 return rowNumber; 31 } 32 33 @Override 34 // Productテーブルのデータを1件取得 35 public Product selectOne(String productCode) throws DataAccessException { 36 Map<String, Object> map = jdbc.queryForMap("select * from product" + " where productCode = ?", productCode); 37 38 //結果返却用の変数 39 Product product = new Product(); 40 41 //取得したデータを結果返却用の変数にセットしていく 42 product.setProductCode((String) map.get("productCode")); //商品コード 43 product.setProductName((String) map.get("productName")); //商品名 44 product.setPrice((int) map.get("price")); //値段 45 46 return product; 47 } 48 49 @Override 50 // Productテーブルのデータを全件取得. 51 public List<Product> selectMany() throws DataAccessException { 52 List<Map<String, Object>> getList = jdbc.queryForList("SELECT * FROM product"); 53 //結果返却用の変数 54 List<Product> productList = new ArrayList<Product>(); 55 //取得したデータを結果返却用のListに格納していく 56 for (Map<String, Object> map : getList) { 57 //Productインスタンスの生成 58 Product product = new Product(); 59 60 //Productインスタンスに取得したデータをセットする 61 product.setProductCode((String) map.get("productCode")); //商品コード 62 product.setProductName((String) map.get("productName")); //商品ID 63 product.setPrice((Integer) map.get("price")); //商品ID 64 65 //結果返却用のListに追加 66 productList.add(product); 67 } 68 return productList; 69 } 70 71 @Override 72 // Productテーブルを1件更新. 73 public int updateOne(Product product) throws DataAccessException { 74 //1件更新 75 int rowNumber = jdbc.update("update product" 76 + " set" 77 + " productName = ?," 78 + " price = ?" 79 + " where productCode = ?", product.getProductName(), product.getPrice(), product.getProductCode()); 80 81 return rowNumber; 82 } 83 84 @Override 85 // Productテーブルを1件削除. 86 public int deleteOne(String productCode) throws DataAccessException { 87 //1件削除 88 int rowNumber = jdbc.update("delete from product where productCode = ?", productCode); 89 return rowNumber; 90 } 91} 92
回答2件
あなたの回答
tips
プレビュー