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

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

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

Spring Framework は、Javaプラットフォーム向けのオープンソースアプリケーションフレームワークです。 Java Platform上に、 Web ベースのアプリケーションを設計するための拡張機能が数多く用意されています。

Q&A

2回答

7594閲覧

Spring tool suite の画面遷移時に404エラーが発生する

ganbaruman

総合スコア10

Spring

Spring Framework は、Javaプラットフォーム向けのオープンソースアプリケーションフレームワークです。 Java Platform上に、 Web ベースのアプリケーションを設計するための拡張機能が数多く用意されています。

0グッド

0クリップ

投稿2019/07/19 02:52

Springスタータープロジェクトでプロジェクトを新規作成

login.htmlにある送信ボタンを押すとLoginController.javaが動作してmenu.htmlに画面遷移
というシンプルな機能を作っています。

ディレクトリ構造は
src/main/java/renshu/controller/LoginController.java
src/main/resources/static/login.html
src/main/resources/templates/menu.html
となっています。

送信ボタンを押すと

Whitelabel Error Page
This application has no explicit mapping for /error, so you are seeing this as a fallback.

Fri Jul 19 11:27:29 JST 2019
There was an unexpected error (type=Not Found, status=404).
No message available

とエラーが表示されます

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 http://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.1.6.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.example</groupId> <artifactId>TestA-1</artifactId> <version>0.0.1-SNAPSHOT</version> <name>TestA-1</name> <description>Demo project for Spring Boot</description> <properties> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>

login.htmlの記述は以下です

<!DOCTYPE html> <html lang="ja" xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8"> <div id="form"> <form action="/login" method="GET" > <button class="col-xs-2 btn btn-primary mx-auto">送信ボタン</button> </form> </div>

LoginController.javaは以下です。

package renshu.controller; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; /** * * */ @Controller @RequestMapping("/resources") public class LoginController { @RequestMapping(path = "/login", method = RequestMethod.GET) public String login( Model model) { return "menu.html"; } }

困っている点、不明点としましては、
・正しいディレクトリ構成になっているのか?
・リクエストマッピング等のパス定義は正しいものか?
です

読んだ参考書等は
Spring徹底入門
Spring解体新書
です

404エラーなため、ディレクトリ構成やパスの書き方が正しくないのだろうかと思い色々なディレクトリ構成やパスの書き方を試してみましたがうまくいきませんでした。もしくはpom.xml等で必要な設定がされていないのでしょうか?
質問が基本中の基本の部分で恐縮なのですが、どなたかご教授の方よろしくお願いします。

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

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

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

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

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

m.ts10806

2019/07/19 03:10

action="/resources/login" にするとどうなりますか? プロジェクトのコンテキストパスとってきたほうが良さそうだけど↓ @{/resources/login}
ganbaruman

2019/07/19 03:37

login.html LoginController.java それぞれを指摘いただいた記述に修正したのですが投稿に乗せた同じエラーでした
m.ts10806

2019/07/19 03:56

LoginControllerは修正する必要ないと思いますが・・。
ganbaruman

2019/07/19 04:02

すいませんわかってなくて login.htmlを <form action="/resources/login" method="GET" > こう記述するということであってますか? @{/resources/login}こっちの方は <form th:action="@{/resources/login}" method="GET" > という事ですか?
m.ts10806

2019/07/19 04:03

両方あってます。
ganbaruman

2019/07/19 04:06

<form action="/resources/login" method="GET" > こっちは同じエラー <form th:action="@{/resources/login}" method="GET" > こっちが画面が切り替わらず http://localhost:8080/login.html? URLが上記のようになります
m.ts10806

2019/07/19 04:07

@{/resources/login} の場合、ブラウザ「ソースを表示」で見たときにどうなってますか?
ganbaruman

2019/07/19 04:09

<div id="form"> <form th:action="@{/resources/login}" method="GET" > <button class="col-xs-2 btn btn-primary mx-auto">送信ボタン</button> </form> </div> >ブラウザ「ソースを表示」で見たときにどうなってますか? 上記になります。
m.ts10806

2019/07/19 04:11

ん、thymeleafの構文が効いてないみたいですね。 そもそもlogin.htmlはどのように表示されてますか?
ganbaruman

2019/07/19 04:15

>そもそもlogin.htmlはどのように表示されてますか? login.htmlをhttp://localhost:8080/login.htmlで表示させた時は? という意味なら <form action="/resources/login" method="GET" >と同じ表示です ブラウザ「ソースを表示」でという意味なら <form action="/resources/login" method="GET" >との差は th:action="@{/resources/login}"ここの部分だけです
m.ts10806

2019/07/19 04:19

ブラウザの「ソースを表示」(Chromeなら右クリック「ページのソースを表示」)なので、thymeleafやJavaのコードがそのまま出ることはないと思います。 確かに同じですが、望ましいのはthymeleafの構文のほうですね。 あとGETでしたら http://localhost:8080/resources/login  で直接アクセスできそうに思います。
m.ts10806

2019/07/19 04:19

いすれにしてもmenu.html含めてHTMLの階層も提示必要に思います
ganbaruman

2019/07/19 04:24

階層の提示とはディレクトリの構造の事でしたら以下です src/main/resources/static/login.html src/main/resources/templates/menu.html 問題になっているプロジェクトは画面遷移以外の機能は省いてます それともソースコードの事でしょうか?
m.ts10806

2019/07/19 04:33

でしたらactionに指定した情報はそのままでテンプレート読み込み部分を return "/menu"; でいけそうに思います。
guest

回答2

0

1. テンプレート機能の誤り

menu.html を返却した場合は templates/menu.html.html が必要になる
※ 要は拡張子が不要

2. パスマッピングの誤り

java

1@RequestMapping("/resources") 2public class LoginController { 3 4 @RequestMapping(path = "/login", method = RequestMethod.GET) 5 public String login ../* コード省略*/ 6}

となってるのでアクセスするのは

https://${server.addr}:${server.port}[/${context.path}]/resources/login

コンテキストパス未指定時
http://localhost:8080/resources/login

となる。

投稿2019/07/19 03:12

編集2019/07/19 08:32
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

ganbaruman

2019/07/19 03:36

returnの部分の事ですよね? return "menu";で試しても見たのですが、同じエラーでした。
guest

0

/static/login.html からControllerへのリクエストするURLのパスの誤りか、ないしはパスとThymeleafテンプレートの配置場所の関係に誤りがあります。

login.htmlを表示するURLは、http://localhost:8080/login.html として、ここからLoginControllerを呼び出すためのパスは、

java

1import org.springframework.web.bind.annotation.GetMapping; 2import org.springframework.web.bind.annotation.RequestMapping; 3import org.springframework.web.bind.annotation.RestController; 4 5@RequestMapping("/resources") 6@RestController 7public class SampleController { 8 9 @GetMapping("/login") 10 public String sample() { 11 return "menu"; 12 } 13} 14

と定義しているので、 http://localhost:8080/resources/login になります。

つまり、login.htmlからこのControllerへリクエストするには、 resources/login を指定します。

さらにThymeleafのテンプレートは、Controller クラス に記載している@RequestMappingのパスが、テンプレートパスの一部になります(変更は可能です)から、

return "menu" で示した menu.html は、

src/main/resorces/templates/resources/menu.html

に配置すれば良いです。

投稿2019/07/19 06:46

A-pZ

総合スコア12011

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

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

退会済みユーザー

退会済みユーザー

2019/07/19 08:34

URLから勝手に追加してくれましたっけ? テンプレートパスのサブディレクトリ
ganbaruman

2019/07/19 08:35

ご指摘の通りに修正すると、 login.htmlの部分を <form th:action="@{/resources/login}" method="GET" > にし menu.htmlをsrc/main/resorces/templates/resources/menu.htmlに配置しました。 実行すると画面が切り替わらず、http://localhost:8080/login.html?に なりました login.htmlの記述を <form action="/resources/login" method="GET" >の方にすると 同じエラーになりました。
A-pZ

2019/07/20 14:56

login.html は、Thymeleafの管理におかれていないので、@を利用したURLの変換は適用されません。 actionのURLを確認してください。/ から開始していません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問