riku__02
@riku__02

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

Spring boot でのログイン画面とユーザ登録画面のレイアウトの質問

Q&A

Closed

解決したいこと

Spring解体新書という書籍で6章部分を実施中です。

ログイン画面とユーザ登録画面のレイアウトが上手くいっていません。
解決方法を教えて下さい。

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

■ログイン画面
image.png
■新規登録画面
image.png

■本来描写したい画面
IMG_4683.JPEG

該当するソースコード

■login.html

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<meta>
<meta charset="UTF-8"></meta>
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<!--CSS読込-->
<link rel="stylesheet" th:href="@{/webjars/bootstrap/css/bootstrap.min.css}">
<link rel="stylesheet" th:href="@{/css/login/login.css}">
<!--JS読込-->
<script th:src="@{/webjars/jquery/jquery.min.js}" defer></script>
<script th:src="@{/webjars/bootstrap/css/bootstrap.min.js}" defer></script>
<title>ログイン</title>
</head>

<body class="bg-light">
	<div class="text-center">
		<form method="post" th:action="@{/login}" class="form-login">
			<h2>ログイン</h2>
			<!--ユーザID-->
			<div class="form-group">
				<label for="userId" class="sr-only">userId</label>
				<input type="text" class="form-control" placeholder="ユーザーID" name="userId">
			</div>
			<!--パスワード-->
			<div class="form-group">
				<label for="password" class="sr-only">password</label>
				<input type="text" class="form-control" placeholder="パスワード" name="password">
			</div>
			<input type="submit" value="ログイン" class="btn btn-primary"/>
		</form>
		<a th:href="@{/user/signup}">新規登録はこちら</a>
	</div>
</body>

■login.css

.form-login {
	width: 100%;
	max-width: 330px;
	padding: 15px;
	margin: auto;
}

■signup.html

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<meta>
<meta charset="UTF-8">
</meta>
<meta name="viewport" content="width=device-width, initail-scale=1, shrink-to-fit=no">
<!--CCS読込-->
<link rel="stylesheet" th:href="@{/webjars/bootstrap/css/bootstrap.min.css}">
<link rel="stylesheet" th:href="@{/css/login/login.css}">
<!--JS読込-->
<script th:src="@{/webjars/jquery/jquery.min.js}" defer></script>
<script th.src="@{/webjars/bootstrap/css/bootstrap.min.js}" defer></script>
<title>ユーザ登録</title>
</head>

<body class="bg-light">
	<div class="text-center">
		<form id="signup-form" method="post" action="/user/signup" class="form-signup">
			<h1 class="text-center">ユーザ登録</h1>
			<!--ユーザID-->
			<div class="form-group">
				<label for="userId">ユーザId</label>
				<input type="text" class="form-control">
			</div>
			<!--パスワード-->
			<div class="form-group">
				<label for="password">パスワード</label>
				<input type="text" class="form-control">
			</div>
			<!--ユーザー名-->
			<div class="form-group">
				<label for="userName">ユーザー名</label>
				<input type="text" class="form-control">
			</div>
			<!--誕生日-->
			<div class="form-group">
				<label for="birthday">誕生日</label>
				<input type="text" class="form-control">
			</div>
			<!--年齢-->
			<div class="form-group">
				<label for="age">年齢</label>
				<input type="text" class="form-control">
			</div>
			<!--性別-->
			<div class="form-group">
				<div th:each="item : ${genderMap}" class="form-check-inline">
					<input type="radio" class="form-check-input" th:value="${item.value}">
					<label class="form-check-label" th:text="${item.key}"></label>
				</div>
			</div>
			<!--登録ボタン-->
			<input type="submit" value="ユーザ登録" class="btn btn-primary w-100 mt-3" />
			</div>
		</form>
</body>
</html>

■signup.css

.form-signup {
	width: 100%;
	max-width: 330px;
	padding: 15px;
	margin: auto;
}

自分で試したこと

書籍とソースは相違ないです。。
ですがうまくいきません。原因等あればアドバイス頂きたいです。
よろしくお願いいたします。

0

4Answer

  1. タイトルは質問内容の趣旨を書いてください。
    1. 「Spring boot勉強中での質問」では質問内容が一切わかりません。
  2. 「書籍とはほぼ相違ない」とのことですが、完全に一致させてください。
    1. 自然言語とは異なり、プログラミング言語では1文字でも相違があれば処理結果が大きく変わることがあります。そんな中で少し違う(=ほぼ相違ない)プログラムを書いて動かなければ、少し違う部分に原因があるんじゃない?としか思いません。少なくとも完全一致させたと胸を張って言える状態にしてください。その状態でも往々にして完全一致していませんので。
  3. html内で使われている form-group について、定義されている部分が見当たりませんので、それが原因かと。
1Like

Comments

  1. @riku__02

    Questioner

    @midoribiさんご指摘ありがとうございます。
    Qiitaに使い慣れていないかつ、質問の仕方がよくなかったです。
    言葉にも気をつけます。また修正いたします。
    3についてみてみます。

  2. html内で使われている form-group について、定義されている部分が見当たりませんので、それが原因かと。

    form-group は bootstrap 4 (質問者さんが使っているのは 3 または 4 と想像) にあります。その他 bg-light, text-center なども bootstrap 4 にあります。

    bootsrarp.jpg

  3. 上記のhtml及びcssの記述が書籍の通りという前提であれば、bootstrapの読み込みに問題がありそうと言えそうです

先のスレッド、

によると、上の質問の画像の「本来描写したい画面」ではなくて、以下の画像のようになるのが期待している結果なのですよね。先のスレッドでは期待通りになったのであれば、それはどうやって出したのですか?

68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f313034313133382f31306336636334302d373633382d313433382d643864662d6233376166343863306335652e706e.png

何にせよ、外部 css ファイルが読み込まれてないのが原因だと思いますので、パスが間違ってないか、ブラウザのキャッシュの問題はないか等調べてください。そこは質問者さんでないと分かりません。


【追記】

質問者さんの回答のコメントにも書きましたが、最初の質問に書いてあった、

<link rel="stylesheet" th:href="@{/webjars/bootstrap/css/bootstrap.min.css}">
<link rel="stylesheet" th:href="@{/css/login/login.css}">

が最終的にブラウザに送信される html にどのように変換されるのかが問題で、ブラウザに送信される html ソースでは href に設定されるパスが正しくないのが原因だと思います。

bootstrap.css は cdn から取得し、login.css はインラインで書いたらどうなるか、試しにやってみることをお勧めします。

具体例は以下の通りです。Bootstrap.css は v4.2.1 を cdn より取得しています (v5.x では望む結果と少々異なるので)。使われているクラス bg-light, text-center, form-group, sr-only, btn, btn-primary はすべて Bootstrap.css v4.2.1 に定義されています。login.css は head タグ内にインラインで書いています。

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title></title>
    <link href="https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/css/bootstrap.css" rel="stylesheet" />
    <style type="text/css">
        .form-login {
            width: 100%;
            max-width: 330px;
            padding: 15px;
            margin: auto;
        }
    </style>
</head>
<body class="bg-light">
    <div class="text-center">
        <form method="post" class="form-login">
            <h2>ログイン</h2>
            <!--ユーザID-->
            <div class="form-group">
                <label for="userId" class="sr-only">userId</label>
                <input type="text" class="form-control"
                    placeholder="ユーザーID" name="userId" />
            </div>
            <!--パスワード-->
            <div class="form-group">
                <label for="password" class="sr-only">password</label>
                <input type="text" class="form-control"
                    placeholder="パスワード" name="password" />
            </div>
            <input type="submit" value="ログイン" class="btn btn-primary" />
        </form>
        <a href="/resister">新規登録はこちら</a>
    </div>
</body>
</html>

結果は:

bootstrap4.jpg

1Like

Comments

  1. @riku__02

    Questioner

    @SurferOnWwwさんご指摘アドバイスありがとうございます。
    タイトル等で一目でわかるように今後ご指摘を活かしていきます。

    外部 css ファイルが読み込まれてないのが原因とのことありがとうございます。
    指摘箇所に関する部分を一旦見直してみます。

  2. 上の私の質問、

    上の質問の画像の「本来描写したい画面」ではなくて、以下の画像のようになるのが期待している結果なのですよね。先のスレッドでは期待通りになったのであれば、それはどうやって出したのですか?

    に答えていただけませんか? 特に「それはどうやって出したのですか?」という点。質問をスルーされると話が通じなくなります。

  3. 質問者さんの回答欄下のコメントにも書きましたが、最初の質問に書いてあった、

    <link rel="stylesheet" th:href="@{/webjars/bootstrap/css/bootstrap.min.css}">
    <link rel="stylesheet" th:href="@{/css/login/login.css}">
    

    が最終的にブラウザに送信される html にどのように変換されるのかが問題で、ブラウザに送信される html ソースでは href に設定されるパスが正しくないのが原因だと思いますよ。

    bootstrap.css は cdn から取得し、login.css はインラインで書いたらどうなるか、試しにやってみることをお勧めします。

    具体例は後で上の回答欄に追記しておきます。

  4. @riku__02

    Questioner

    @SurferOnWwwさん
    お答えできておらず申し訳ございません。
    すいません。質問の意味が理解できました。
    本来描写したい画面と以下のキャプチャは成功例としては同じものでした。
    image.png
    しかしこのキャプチャはネット上で調べていく中で見つけて取得した成功例のキャプチャであり、自分が実際に表示させているものではありませんでした。(この書籍(Spring解体新書)を進めていっている内容でしたが詳しく実装内容までは書いていませんでした。)

    紛らわしい記載をしていたことが原因です。
    今後は成功例としてのキャプチャは書籍から取ったキャプチャのみ記載しようと思います。

@riku__02 さん
https://qiita.com/riku__02/questions/f3ec7bfec6c1565fdf92
こちらの質問で共有いただいたbuild.gradleを確認したところ、
依存関係の書き方が間違っているので、bootstrapの依存関係が追加されたことになっていません。したがって、htmlにCSS読み込み・JS読込の記述をしても、教材通りのレイアウトになっていないと思われます。

正しくない部分

image.png
Mavenの書き方が混在しているような記述になってます。

thymeleafを例に挙げて説明します。

Mavenでは、pom.xmlに以下のように依存関係を書きますね。

	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-thymeleaf</artifactId>
		</dependency>
        ...
	</dependencies>

Gradleでは、build.gradleに以下のように依存関係を書く必要があります。

dependencies {
	implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
    ...
}
0Like

Comments

  1. なので、jqueryを依存関係に追加したい場合は、以下のような書き方になる、といった具合です。

    dependencies {
        implementation 'org.webjars:jquery:3.5.1'
    

@eno49conan さん色々と丁寧にありがとうございます。
別質問のところで回答頂いたMavenにするために一旦プロジェクトを作成しなおしました。
pom.xmlの方が良く聞くのでこちらを利用したいと思い、、
Gradleに関してアドバイス頂いたのに申し訳ございません。
キャプチャと実ソースを添付させて頂きます。レイアウトは変わりませんでした。。

image.png

<?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>3.3.4</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>
	<groupId>com.example</groupId>
	<artifactId>SpringBootSample_1</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>SpringBootSample_1</name>
	<description>Demo project for Spring Boot</description>
	<url/>
	<licenses>
		<license/>
	</licenses>
	<developers>
		<developer/>
	</developers>
	<scm>
		<connection/>
		<developerConnection/>
		<tag/>
		<url/>
	</scm>
	<properties>
		<java.version>21</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-jdbc</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>
	    <!--jquery-->
	    <dependency>
			<groupId>org.webjars</groupId>
			<artifactId>jquery</artifactId>
			<version>3.5.1</version>
		</dependency>
	    <!--bootstrap-->
	    <dependency>
			<groupId>org.webjars</groupId>
			<artifactId>jquery</artifactId>
			<version>3.5.1</version>
		</dependency>
			    <!--webjars-locator-->
	    <dependency>
			<groupId>org.webjars</groupId>
			<artifactId>webjars-locator</artifactId>
			<version>0.40</version>
		</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>

0Like

Comments

  1. dependenciesの部分ですが、jqueryが2つありますよ(bootstrapがない)

  2. @riku__02

    Questioner

    @eno49conanさん
    申し訳ございません。このような凡ミスには気をつけます。。
    以下のように変更しましたが、変化はなしでした。

    <?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>3.3.4</version>
    		<relativePath/> <!-- lookup parent from repository -->
    	</parent>
    	<groupId>com.example</groupId>
    	<artifactId>SpringBootSample_1</artifactId>
    	<version>0.0.1-SNAPSHOT</version>
    	<name>SpringBootSample_1</name>
    	<description>Demo project for Spring Boot</description>
    	<url/>
    	<licenses>
    		<license/>
    	</licenses>
    	<developers>
    		<developer/>
    	</developers>
    	<scm>
    		<connection/>
    		<developerConnection/>
    		<tag/>
    		<url/>
    	</scm>
    	<properties>
    		<java.version>21</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-jdbc</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>
    	    <!--jquery-->
    	    <dependency>
    			<groupId>org.webjars</groupId>
    			<artifactId>jquery</artifactId>
    			<version>3.5.1</version>
    		</dependency>
    	    <!--bootstrap-->
    	    <dependency>
    			<groupId>org.webjars</groupId>
    			<artifactId>bootstrap</artifactId>
    			<version>4.5.3</version>
    		</dependency>
    	    <!--webjars-locator-->
    	    <dependency>
    			<groupId>org.webjars</groupId>
    			<artifactId>webjars-locator</artifactId>
    			<version>0.40</version>
    		</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>
    
    
  3. キャッシュの削除・サーバー再起動、でも変わりませんか?

  4. 最初の質問に書いてあった、

    <link rel="stylesheet" th:href="@{/webjars/bootstrap/css/bootstrap.min.css}">
    <link rel="stylesheet" th:href="@{/css/login/login.css}">
    

    が最終的にブラウザに送信される html にどのように変換されるのですか? 上のコメントの「以下のように変更しました」のコードがそれにどう影響するのか分かりませんけど、何にせよ問題は href に設定されるパスが正しくないことに尽きると思うのですが?

  5. @riku__02

    Questioner

    @eno49conan さん
    前回に引き続きありがとうございました。
    無事にcssファイルが読み込まれ、例のように表示することが出来ました。。
    現場にてpom.xmlを修正した後は再起動すべきと学んだことを失念しており、更新のみで実施していました。。
    新規登録画面がめいいっぱい表示されているので少し改善は必要そうです。
    しかし前進できました。。本当にありがとうございます。

    image.png
    image.png

  6. 無事にcssファイルが読み込まれ、例のように表示することが出来ました。。

    了解です!

    新規登録画面がめいいっぱい表示されているので少し改善は必要そうです。

    これはsignup.html login.cssを読み込んでいるのが、原因だと思いますよ。signup.cssじゃないですか?
    (提供いただいたコードの感じを見ると)

  7. @riku__02

    Questioner

    @eno49conanさん
    なぜ私はこんな所に気づかないのでしょうね、、申し訳ございません。
    ご指摘の通りでした。
    image.png

    変更したところ新規登録画面も期待通り表示することが出来ました!
    image.png
    私はまだまだ未熟なため、例のように実施できたということが大変嬉しいです。学習を続けていきます。ありがとうございました。。
    今後ともご指導よろしくお願いいたします。

Your answer might help someone💌