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

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

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

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

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

Spring Boot

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

Q&A

解決済

1回答

3215閲覧

Spring Boot 画面遷移がうまくいきません

cocoa0927

総合スコア1

Java

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

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

Spring Boot

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

0グッド

0クリップ

投稿2021/08/12 03:45

前提・実現したいこと

初めて質問します、よろしくお願いします。
Java、Spring Bootを学習中の者です。
サンプルを元に住所録の作成をしています。

①edit画面の登録から追加や更新処理
②list画面の削除から削除処理
上記を実現したいのですが、どちらもエラーになってしまいます。

①は画面遷移、データの追加処理ともにエラーになります。
②はデータ削除処理はできますが、画面遷移でエラーになります。

発生している問題・エラーメッセージ

エラーメッセージ

Whitelabel Error Page This application has no explicit mapping for /error, so you are seeing this as a fallback. Thu Aug 12 11:44:19 JST 2021 There was an unexpected error (type=Not Found, status=404). No message available

該当のソースコード

User.java

package com.example.demo; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.Table; import lombok.Getter; import lombok.Setter; @Entity @Getter @Setter @Table(name = "user") public class User { @Id @GeneratedValue(strategy = GenerationType.AUTO) @Column private int id; private String name; private String address; private String tel; }

UserRepository.java

package com.example.demo; import org.springframework.data.jpa.repository.JpaRepository; public interface UserRepository extends JpaRepository<User, Long>{ public User findById(int id); public void deleteById(int id); }

DemoController.java

package com.example.demo; import java.util.List; import javax.annotation.PostConstruct; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.servlet.ModelAndView; @Controller public class DemoController { @Autowired UserRepository repos; /* 一覧画面(初期画面)への遷移 */ @GetMapping public ModelAndView list() { ModelAndView mav = new ModelAndView(); List<User> list = repos.findAll(); mav.setViewName("users/list"); mav.addObject("data", list); return mav; } /* 新規画面への遷移 */ @GetMapping("/add") ModelAndView add() { ModelAndView mav = new ModelAndView(); User data = new User(); mav.addObject("formModel", data); mav.setViewName("users/new"); return mav; } /* 編集画面への遷移 */ @GetMapping("/edit") ModelAndView edit(@RequestParam int id) { ModelAndView mav = new ModelAndView(); User data = repos.findById(id); mav.addObject("formModel", data); mav.setViewName("users/new"); return mav; } /* 更新処理 */ @PostMapping @Transactional(readOnly = false) public ModelAndView save( @ModelAttribute("formModel") User user) { repos.saveAndFlush(user); return new ModelAndView("redirect:users/list"); } /* 削除処理 */ @PostMapping("/delete") @Transactional(readOnly = false) public ModelAndView delete(@RequestParam int id) { repos.deleteById(id); return new ModelAndView("redirect:users/list"); } /* 初期データ作成 */ @PostConstruct public void init() { User user1 = new User(); user1.setName("島根 花子"); user1.setAddress("島根県松江市浜乃木1-2-3"); user1.setTel("0852-12-1234"); repos.saveAndFlush(user1); user1 = new User(); user1.setName("大阪 太郎"); user1.setAddress("大阪府豊中市本町1-2-3"); user1.setTel("06-123-7777"); repos.saveAndFlush(user1); } }

list.html

<!DOCTYPE html> <html xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8"> <title>Users List</title> <style> table { border-collapse:collapse; } .col_name {width: 100px;} .col_address {width: 500px;} .col_tel {width: 200px;} </style> </head> <body> <h1>住所録</h1> <table border="1"> <tr> <th class="col_name">名前</th> <th class="col_address">住所</th> <th class="col_tel">電話番号</th> <th></th> <th></th> </tr> <tr th:each="obj : ${data}"> <td th:text="${obj.name}"></td> <td th:text="${obj.address}"></td> <td th:text="${obj.tel}"></td> <td> <form action="/edit" method="get"> <input type="submit" value="編集"> <input type="hidden" name="id" th:value="${obj.id}"> </form> </td> <td> <form action="/delete" method="post"> <input type="submit" value="削除"> <input type="hidden" name="id" th:value="${obj.id}"> </form> </td> </tr> </table> <hr> <form action="/add"> <input type="submit" value="新規追加"> </form> </body> </html>

new.html

<!DOCTYPE html> <html xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8"> <title>Insert title here</title> <style> table { border-collapse:collapse; } .col_name {width: 100px;} .col_data {width: 500px;} form {display: inline;} </style> </head> <body> <h1>住所録登録</h1> <form method="post" action="/create" th:object="${formModel}"> <input type="hidden" name="id" th:value="*{id}" /> <table border="1"> <tr> <th class="col_name">名前</th> <td class="col_data"> <input type="text" name="name" th:value="*{name}" size="20" maxlength="20"> </td> </tr> <tr> <th>住所</th> <td> <input type="text" name="address" th:value="*{address}" size="40" maxlength="40"> </td> </tr> <tr> <th>電話番号</th> <td> <input type="text" name="tel" th:value="*{tel}" size="15" maxlength="15"> </td> </tr> </table> <hr> <input type="submit" value="登 録"> </form> <form action="/"> <input type="submit" value="戻 る"> </form> </body> </html>

pom.xml

<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.5.3</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.example</groupId> <artifactId>demo_DB_2</artifactId> <version>0.0.1-SNAPSHOT</version> <name>demo_DB_2</name> <description>Demo project for Spring Boot</description> <properties> <java.version>11</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jdbc</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> <optional>true</optional> </dependency> <dependency> <groupId>com.h2database</groupId> <artifactId>h2</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <excludes> <exclude> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </exclude> </excludes> </configuration> </plugin> </plugins> </build> </project>

試したこと

更新処理の@PostMapping()に("/create")をつけてみると画面遷移はいかずホーム画面でページ更新するとデータの追加処理ができてましたが、まだ原因がわかってない為、模索中です。

ご回答のほどよろしくお願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

データの追加処理と、画面遷移がルートで定義してあるので、以下のように修正すると動くようになります。

new.htmlのpost先を、"/"にします。

html

1<h1>住所録登録</h1> 2<form method="post" th:action="@{/}" th:object="${formModel}"> 3<!-- new.htmlの上記を修正 ​-->

Java側のリダイレクト先を、"/"にします。

java

1// redirectを修正 2@PostMapping 3@Transactional(readOnly = false) 4public ModelAndView save(@ModelAttribute("formModel") User user) { 5 repos.saveAndFlush(user); 6 return new ModelAndView("redirect:/"); 7} 8 9@PostMapping("/delete") 10@Transactional(readOnly = false) 11public ModelAndView delete(@RequestParam int id) { 12 repos.deleteById(id); 13 return new ModelAndView("redirect:/"); 14}

投稿2021/08/13 12:02

KT001

総合スコア643

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

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

cocoa0927

2021/08/16 00:08

うまく動作する事ができました。 @{/}やredirect:/についての認識不足や修正力についてもっと落とし込めるようにしていきたいと思います。 ご回答して頂きありがとうございました!
KT001

2021/08/16 11:43

最初は分かりづらいんですが、@PostMappingと定義した場合、@PostMapping("/")と同等というのがポイントになります。 リダイレクトも、@GetMapping("/")への移動なので、redirect:/で移動する形になります。 使っていけば慣れると思うので、解決して良かったです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問