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

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

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

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

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

Q&A

解決済

1回答

777閲覧

STSで新規登録と編集ができない

nijima

総合スコア27

Java

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

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

0グッド

0クリップ

投稿2022/01/24 09:45

編集2022/01/24 09:49

https://www.sys-link.jp/technical/SpringBoot/SpringBoot4-5.html
上記の学習サイトを参考にSTSで新規投稿機能と編集機能、削除機能、新規投稿一覧機能を作成したのですが、
編集機能と削除機能がうまく機能しません。
編集機能は、編集画面には入れるのですが、編集をすると図1のようなエラーがでます。
また、削除機能も同様に、削除をすると図1のエラーが出ます。階層構造は図2のようになっております。
(編集画面は、id=1の場合、http://localhost:8080/edit?id=1
新規登録画面はhttp://localhost:8080/add? などのURLになっております)
Controller,Viewなどは下記のように記述いたしました。

(図1)
図1

(図2)
イメージ説明

DemoController.java

1package com.example.demo; 2 3import org.springframework.beans.factory.annotation.Autowired; 4import org.springframework.stereotype.Controller; 5import org.springframework.web.bind.annotation.GetMapping; 6import org.springframework.web.bind.annotation.PostMapping; 7import org.springframework.transaction.annotation.Transactional; 8import org.springframework.web.bind.annotation.RequestParam; 9import org.springframework.web.bind.annotation.ModelAttribute; 10import org.springframework.web.servlet.ModelAndView; 11 12import java.util.List; 13import javax.annotation.PostConstruct; 14 15@Controller 16public class DemoController { 17 18 @Autowired 19 UserRepository repos; 20 21 /* 一覧画面(初期画面)への遷移 */ 22 @GetMapping 23 public ModelAndView list() { 24 ModelAndView mav = new ModelAndView(); 25 List<User> list = repos.findAll(); 26 mav.setViewName("users/list"); 27 mav.addObject("data", list); 28 return mav; 29 } 30 31 /* 新規画面への遷移 */ 32 @GetMapping("/add") 33 ModelAndView add() { 34 ModelAndView mav = new ModelAndView(); 35 User data = new User(); 36 mav.addObject("formModel", data); 37 mav.setViewName("users/new"); 38 return mav; 39 } 40 41 /* 編集画面への遷移 */ 42 @GetMapping("/edit") 43 ModelAndView edit(@RequestParam int id) { 44 ModelAndView mav = new ModelAndView(); 45 User data = repos.findById(id); 46 mav.addObject("formModel", data); 47 mav.setViewName("users/new"); 48 return mav; 49 } 50 51 /* 更新処理 */ 52 @PostMapping() 53 @Transactional(readOnly=false) 54 public ModelAndView save( 55 @ModelAttribute("formModel") User user) { 56 repos.saveAndFlush(user); 57 return new ModelAndView("redirect:users/list"); 58 } 59 60 /* 削除処理 */ 61 @PostMapping("/delete") 62 @Transactional(readOnly=false) 63 public ModelAndView delete(@RequestParam int id) { 64 repos.deleteById(id); 65 return new ModelAndView("redirect:users/list"); 66 } 67 68 /* 初期データ作成 */ 69 @PostConstruct 70 public void init() { 71 User user1 = new User(); 72 user1.setName("島根 花子"); 73 user1.setAddress("島根県松江市浜乃木1-2-3"); 74 user1.setTel("0852-12-1234"); 75 repos.saveAndFlush(user1); 76 77 user1 = new User(); 78 user1.setName("大阪 太郎"); 79 user1.setAddress("大阪府豊中市本町1-2-3"); 80 user1.setTel("06-123-7777"); 81 repos.saveAndFlush(user1); 82 } 83}

list.html

1<!DOCTYPE html> 2<html> 3<head> 4<meta charset="UTF-8"> 5<title>Users List</title> 6<style> 7table { 8 border-collapse: collapse; 9} 10.col_name {width: 100px;} 11.col_address {width: 500px;} 12.col_tel {width: 200px;} 13</style> 14</head> 15<body> 16<h1>住所録</h1> 17<table border="1"> 18 <tr> 19 <th class="col_name">名前</th> 20 <th class="col_address">住所</th> 21 <th class="col_tel">電話番号</th> 22 <th></th> 23 <th></th> 24 </tr> 25 <tr th:each="obj : ${data}"> 26 <td th:text="${obj.name}"></td> 27 <td th:text="${obj.address}"></td> 28 <td th:text="${obj.tel}"></td> 29 <td> 30 <form action="/edit" method="get"> 31 <input type="submit" value="編集"> 32 <input type="hidden" name="id" th:value="${obj.id}"> 33 </form> 34 </td> 35 <td> 36 <form action="/delete" method="post"> 37 <input type="submit" value="削除"> 38 <input type="hidden" name="id" th:value="${obj.id}"> 39 </form> 40 </td> 41 </tr> 42</table> 43<hr> 44<form action="/add"> 45 <input type="submit" value="新規追加" /> 46</form> 47</body> 48</html> 49

new.html

1<!DOCTYPE html> 2<html> 3<head> 4<meta charset="UTF-8"> 5<title>Insert title here</title> 6<style> 7table { 8 border-collapse: collapse; 9} 10.col_name {width:200px;} 11.col_data {width:400px;} 12form {display: inline;} 13</style> 14</head> 15<body> 16<h1>住所録登録</h1> 17<form method="post" action="/create" th:object="${formModel}"> 18<input type="hidden" name="id" th:value="*{id}"> 19<table border="1"> 20 <tr> 21 <th class="col_name">名前</th> 22 <td class="col_data"> 23 <input type="text" name="name" th:value="*{name}" size="20" 24 maxlength= "20" /> 25 </td> 26 </tr> 27 <tr> 28 <th>住所</th> 29 <td> 30 <input type="text" name="address" th:value="*{address}" size="40" 31 maxlength="40" /> 32 </td> 33 </tr> 34 <tr> 35 <th>電話番号</th> 36 <td> 37 <input type="text" name="tel" th:value="*{tel}" size="15" 38 maxlength= "15" /> 39 </td> 40 </tr> 41</table> 42<hr> 43<input type="submit" value="登 録" /> 44</form> 45<form action="/"> 46 <input type="submit" value="戻 る" /> 47</form> 48</body> 49</html>

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

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

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

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

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

m.ts10806

2022/01/24 09:50

コンソールにエラー詳細でてませんか?
guest

回答1

0

ベストアンサー

POST http://localhost:8080/create 404」

Postでcreateというマッピングは提示されたコントローラにないですね。
save()メソッドのPostMappingに付けたかったんでしょうか。
●●Mappingの引数に何も入れなければルートパスが適用されます。
あと、コンテキストパスが入る可能性も加味するとThymeleafでリンクを入れる際も
@{/create}のようにされたほうが環境依存なくせると思います。

投稿2022/01/24 10:55

m.ts10806

総合スコア80854

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

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

nijima

2022/01/24 11:23

ご回答、誠にありがとうございます。 saveメソッド内にcreateをいれればよかったのでしょうか。 また編集の更新と新規投稿は同じcreateメソッドとして扱えるのでしょうか? 私がJava歴3日程でして、、、浅い質問で申し訳ありません。
m.ts10806

2022/01/24 11:31

>saveメソッド内にcreateをいれればよかったのでしょうか。 いえ、「マッピング」の話です。 ●●Mappingアノテーションは「指定のURLに指定のリクエストメソッドでアクセスがあった場合にそのメソッドを実行対象とする」ための機能・注釈です。 なので、送信したいリクエストURLがあるのなら、それを待ち受けるURLマッピングをしなければなりません(このあたりSpringのドキュメント見た方が良いです) >また編集の更新と新規投稿は同じcreateメソッドとして扱えるのでしょうか? 作り次第です。 どのように更新しているかにもよります。 できるかどうかだと大抵いは「できる(そのように組めば)」となります。 いずれにしてもまずはメソッド分けてもきちんと要件通り動かすことからです。 >Java歴3日で 「Java」が3日なら、まずはJava基礎からきっちりやすことを強くすすめます。そのあとにサーブレット。フレームワークを利用するのはWebをしっかり理解してからです。
nijima

2022/01/24 12:09

お勉強になりました。ご丁寧にご指導いただきありがとうございました。
nijima

2022/01/24 13:07

/* 更新処理 */ @PostMapping("/create") @Transactional(readOnly=false) public ModelAndView save( @ModelAttribute("formModel") User user) { repos.saveAndFlush(user); return new ModelAndView("redirect:users/list"); } (別件でエラーが出てますが)上記で解決できそうです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問