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

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

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

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

Spring

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

Thymeleaf

Thymeleaf(タイムリーフ)とは、Java用のテンプレートエンジンで、特定のフレームワークに依存せず使用することが可能です。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

1回答

213閲覧

thymeleafの仕組みについて

karakorum

総合スコア20

Java

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

Spring

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

Thymeleaf

Thymeleaf(タイムリーフ)とは、Java用のテンプレートエンジンで、特定のフレームワークに依存せず使用することが可能です。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

1クリップ

投稿2024/02/04 00:35

##機能概要
入力フォーム(input.html)の空白チェックをしているだけの機能です。

###疑問点
controllerクラスのindexメソッドの引数にShainFormを入れないとエラーが起きます。
理由は判明しており、input.htmlのformタグ内でShainFormの値を参照してエラーメッセージを表示させようとしているためです。(th:errors="${shainForm.number})
ここで疑問なのが、なぜcontrollerクラスのindexメソッドの引数にShainFormを入れる必要があるのか、ということです。eclipseのデバッグ機能で確認すると、inputメソッドの呼び出し自体はうまくいっており、htmlを表示する処理でエラーが起こっているようです。
ここの理由を教えていただきたいです。
よろしくお願いします。

###ソース

Formクラス

1package com.example.demo; 2import org.hibernate.validator.constraints.NotEmpty; 3import lombok.Data; 4@Data 5public class ShainForm { 6 @NotEmpty(message="社員Noを入力してください") 7 private String number; 8}

Controllerクラス

1package com.example.demo; 2import org.springframework.stereotype.Controller; 3import org.springframework.ui.Model; 4import org.springframework.validation.BindingResult; 5import org.springframework.validation.annotation.Validated; 6import org.springframework.web.bind.annotation.RequestMapping; 7 8@Controller 9public class ShainController { 10 11 @RequestMapping("/input") 12 public String index(ShainForm shainForm) { 13 return "input.html"; 14 } 15 16 @RequestMapping("/output") 17 public String result(@Validated ShainForm shainForm,BindingResult bindingResult, Model model) { 18 if(bindingResult.hasFieldErrors()) { 19 return "input.html"; 20 } 21 String name = "コントローラー太郎"; 22 model.addAttribute("number", shainForm.getNumber()); 23 model.addAttribute("name", name); 24 return "output.html"; 25 } 26}

HTML

1<!DOCTYPE html> 2<html xmlns:th="http://www.thymeleaf.org"> 3<head> 4 <meta charset="UTF-8"> 5 <title>入力画面</title> 6</head> 7<body> 8 <h1>NoDIパターン</h1> 9 <form method="post" action="output.html" th:action="@{output}"> 10 <p>社員Noを入れてください(3桁の半角数字)</p> 11 <input type="text" name="number"> 12 <p style="color:red;" th:errors="${shainForm.number}">社員No.を入れて</p> 13 <input type="submit" value="送信"> 14 </form> 15</body> 16</html>

###発生するエラー

Caused by: org.attoparser.ParseException: Error during execution of processor 'org.thymeleaf.spring6.processor.SpringErrorsTagProcessor' (template: "input.html" - line 14, col 25) Caused by: org.thymeleaf.exceptions.TemplateProcessingException: Error during execution of processor 'org.thymeleaf.spring6.processor.SpringErrorsTagProcessor' (template: "input.html" - line 14, col 25) Caused by: java.lang.IllegalStateException: Neither BindingResult nor plain target object for bean name 'shainForm' available as request attribute java.lang.IllegalStateException: Neither BindingResult nor plain target object for bean name 'shainForm' available as request attribute

###環境
Java:17
eclipse:Version: 2023-12 (4.30.0)

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

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

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

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

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

guest

回答1

0

ベストアンサー

indexメソッドの引数にShainFormを入れないとエラーになるのは、shainForm=nullとなってしまいshainForm.numberが参照できないためです。

(1) indexメソッドを、省略しないで書くと以下のようになります。

java

1@RequestMapping("/input") 2public String index(@ModelAttribute ShainForm shainForm, Model model) { 3 model.addAttribute("shainForm", shainForm); 4 return "input.html"; 5}

(2) @ModelAttributeを使うと、データバインディングによってmodelにデータが入るため、modelは省略できます。

java

1@RequestMapping("/input") 2public String index(@ModelAttribute ShainForm shainForm) { 3 return "input.html"; 4}

(3) @ModelAttributeも省略できるため、全て省略するとご提示頂いたコードになります。

java

1@RequestMapping("/input") 2public String index(ShainForm shainForm) { 3 return "input.html"; 4} 5// 上記の場合、Thymeleaf側でshainForm.number=ブランクとして参照できます

上記理由により、(1)~(3)は全て同じ処理になります。ただし、引数を削除した場合は、shainFormが存在しない(=null)ため、shainFormのオブジェクトが参照できません。

java

1@RequestMapping("/input") 2public String index() { 3 return "input.html"; 4} 5// 上記の場合、Thymeleaf側でshainForm.numberが参照できません

投稿2024/02/04 03:07

KT001

総合スコア618

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

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

karakorum

2024/02/05 07:19

回答ありがとうございます。 省略されているという観点がありませんでした!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問