likemii
@likemii (mii)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

【Springフレームワーク】設定したパスに画面遷移するとBootstrapが効かなくなる現象について

解決したいこと

現在Springフレームワークを使用し、QiitaのようなWebアプリケーションを作成しております。
そこで以下の現象が発生しました。

①コントローラークラスで「localhost:8080/test/index」にてインデックス用のHTMLが表示されるように設定しているが、「localhost:8080」の状態で勝手にインデックス用のHTMLが表示されてしまう。(この画面上ではBootstrapが効いている)

②コントローラークラスで設定したパスを指定し、「localhost:8080/test/index」と入力すると画面遷移するがBootstrapが効かない状態で表示される。

使用しているツールは以下の通りです。
・Mac
・SpringToolSuite4(MyBatis/Gradle)

今までビルドツールはMavenを使用しておりました。
また、MyBaitsを使うのも今回が初めてなので設定方法に不備があるかもしれません。

説明わかりづらい点あるかと思いますが、解決方法をご教示いただきたいです。

発生している問題・エラー

「localhost:8080」の表示
2021-12-10 11.34のイメージ.jpg
「localhost:8080/test/index」の表示(こちらのパスで上記用に表示されるよう設定したい)
2021-12-10 11.38のイメージ.jpg

該当するソースコード

TestController.java

package com.example.demo.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
@RequestMapping("/test")
public class TestController {

    @RequestMapping("/index")
    public String index() {
        return "index";
    }

    @RequestMapping("/login")
    public String userLogin() {
        return "user-login";
    }
}

index.html(ログイン時のパスのみ指定しています)

<!DOCTYPE html>
<html lang="ja" xmlns:th="http://www.thymeleaf.org">
 <head>
   <meta charset="utf-8">
   <meta http-equiv="X-UA-Compatible" content="IE=edge">
   <meta name="viewport" content="width=device-width, initial-scale=1">
   <title>QuestionBoxへようこそ</title>
   <!-- BootstrapのCSS読み込み -->
   <link href="css/bootstrap.min.css" rel="stylesheet">
   <!-- BootstrapのJS読み込み -->
   <script src="js/bootstrap.min.js"></script>
 </head>
 <body>
  <!-- ヘッダー -->
  <nav class="navbar navbar-expand-sm navbar-dark bg-dark mb-3 sticky-top">
   <a class="navbar-brand" href="#">QuestionBox</a>
    <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarNav4" aria-controls="navbarNav4" aria-expanded="false" aria-label="Toggle navigation">
     <span class="navbar-toggler-icon"></span>
    </button>
      <div class="collapse navbar-collapse justify-content-end" id="navbarNav4">
       <ul class="navbar-nav">
        <li class="nav-item active">
         <a class="nav-link" href="#">登録</a>
        </li>
        <li class="nav-item">
         <a class="nav-link" th:href="@{/test/login}">ログイン</a>
        </li>
        <li class="nav-item">
         <a class="nav-link" href="#">サイトについて</a>
        </li>
       </ul>
      </div>
  </nav>
  <!-- フッター -->
  <footer class="footer">
   <div class="container text-center">
    <p class="text-muted">©︎miyacle</p>
   </div>
  </footer>
   <!-- jQueryの読み込み -->
   <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
 </body>
</html>

自分で試したこと

・コントローラーを全文コメントアウトしても「localhost:8080」の状態では勝手にindex.htmlが表示される。
 ⇒「/test/index」では表示されないためコントローラークラスは動作している

0

1Answer

②については、

   <!-- BootstrapのCSS読み込み -->
   <link href="css/bootstrap.min.css" rel="stylesheet">

で CSS を相対パスで読み込んでいるからです。

localhost:8080/ を開いたとき、相対パス css/bootstrap.min.csslocalhost:8080/css/bootstrap.min.css を指します。

他方、 localhost:8080/test/index を開いたとき、相対パス css/bootstrap.min.csslocalhost:8080/test/css/bootstrap.min.css を指します。この場所には CSS が存在しないために Bootstrap が効かなくなります。

解決するには絶対パスに変えて

   <!-- BootstrapのCSS読み込み -->
   <link href="/css/bootstrap.min.css" rel="stylesheet">

としてください。この指定はどのページを開いたかにかかわらず localhost:8080/css/bootstrap.min.css を指します。

Bootstrap の JS 読み込みも同様に絶対パスに変えてください。

1Like

Comments

  1. @likemii

    Questioner

    今回もご回答頂きありがとうございます。無事解決することができました。

Your answer might help someone💌