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

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

ただいまの
回答率

87.34%

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

受付中

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 4,307

score 10

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等で必要な設定がされていないのでしょうか?
質問が基本中の基本の部分で恐縮なのですが、どなたかご教授の方よろしくお願いします。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • m.ts10806

    2019/07/19 13:19

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

    キャンセル

  • ganbaruman

    2019/07/19 13:24

    階層の提示とはディレクトリの構造の事でしたら以下です
    src/main/resources/static/login.html
    src/main/resources/templates/menu.html

    問題になっているプロジェクトは画面遷移以外の機能は省いてます

    それともソースコードの事でしょうか?

    キャンセル

  • m.ts10806

    2019/07/19 13:33

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

    キャンセル

回答 2

+1

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

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

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

@RequestMapping("/resources")
public class LoginController {

    @RequestMapping(path = "/login", method = RequestMethod.GET)
    public String login ../* コード省略*/
}

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

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

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

となる。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/07/19 12:36

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

    キャンセル

0

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

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

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RequestMapping("/resources")
@RestController
public class SampleController {

    @GetMapping("/login")
    public String sample() {
        return "menu";
    }
}

と定義しているので、 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 17:34

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

    キャンセル

  • 2019/07/19 17: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" >の方にすると
    同じエラーになりました。

    キャンセル

  • 2019/07/20 23:56

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

    キャンセル

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

  • ただいまの回答率 87.34%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る