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

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

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

MVCモデルの一部であるModelはアプリケーションで扱うデータとその動作を管理するために扱います。

Spring

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

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

Thymeleaf

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

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

Q&A

解決済

1回答

2452閲覧

(Spring Gladle) ページ共通部分のフィールドの表示方法

mitulu

総合スコア2

Model

MVCモデルの一部であるModelはアプリケーションで扱うデータとその動作を管理するために扱います。

Spring

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

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

Thymeleaf

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

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

0グッド

1クリップ

投稿2020/10/22 07:32

編集2020/10/27 08:28

前提・実現したいこと

Spring Bootでヘッダー・フッターを実装したい
→ 共通のパーツを複数ページで使用したい。
(JSPでいうjsp:includeでパーツを表示させるみたいな。。)

共通化したいパーツは、Controllerからビューに値を渡すもので、

html

1<div th:replace="parts/header"></div>

Thymeleaf を使って共通パーツを配置したのですが、コントローラで指定したページ以外ではエラーが出ます… (下記エラー)
恐らくControllerを通っていないためビューに値が渡されていないものだと思うのですが…

方法として、Spring のInterception や AOPを使って Controllerが読み込まれる前に処理を入れる
という事を考えて実践したのですが、Model(オブジェクト?)をビューに値を渡す方法が分かりません…

どちらにせよ良いやり方が思いつかなかったため、方法があればご教示いただきたいです。。

発生している問題・エラーメッセージ

ERROR

1Whitelabel Error Page 2This application has no explicit mapping for /error, so you are seeing this as a fallback. 3 4Thu Oct 22 16:05:02 JST 2020 5There was an unexpected error (type=Internal Server Error, status=500). 6An error happened during template parsing (template: "class path resource [templates/mitulu.html]") 7org.thymeleaf.exceptions.TemplateInputException: An error happened during template parsing (template: "class path resource [templates/page.html]") 8 at org.thymeleaf.templateparser.markup.AbstractMarkupTemplateParser.parse(AbstractMarkupTemplateParser.java:241) 9 at org.thymeleaf.templateparser.markup.AbstractMarkupTemplateParser.parseStandalone(AbstractMarkupTemplateParser.java:100) 10 at org.thymeleaf.engine.TemplateManager.parseAndProcess(TemplateManager.java:666) 11 at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1098) 12 at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1072) 13 at org.thymeleaf.spring5.view.ThymeleafView.renderFragment(ThymeleafView.java:362) 14 at org.thymeleaf.spring5.view.ThymeleafView.render(ThymeleafView.java:189) 15 at org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1373) 16 at org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1118) 17 at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1057) 18 at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943) 19 at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) 20~~~ 21 at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) 22 at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130) 23 at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:630) 24 at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 25 at java.base/java.lang.Thread.run(Thread.java:832) 26Caused by: org.attoparser.ParseException: Error during execution of processor 'org.thymeleaf.spring5.processor.SpringInputGeneralFieldTagProcessor' (template: "parts/header" - line 21, col 42) 27 at org.attoparser.MarkupParser.parseDocument(MarkupParser.java:393) 28 at org.attoparser.MarkupParser.parse(MarkupParser.java:257) 29 at org.thymeleaf.templateparser.markup.AbstractMarkupTemplateParser.parse(AbstractMarkupTemplateParser.java:230) 30 ... 48 more 31Caused by: org.thymeleaf.exceptions.TemplateProcessingException: Error during execution of processor 'org.thymeleaf.spring5.processor.SpringInputGeneralFieldTagProcessor' (template: "parts/header" - line 21, col 42) 32 at org.thymeleaf.processor.element.AbstractAttributeTagProcessor.doProcess(AbstractAttributeTagProcessor.java:117) 33 at org.thymeleaf.processor.element.AbstractElementTagProcessor.process(AbstractElementTagProcessor.java:95) 34 at org.thymeleaf.util.ProcessorConfigurationUtils$ElementTagProcessorWrapper.process(ProcessorConfigurationUtils.java:633) 35 at org.thymeleaf.engine.ProcessorTemplateHandler.handleStandaloneElement(ProcessorTemplateHandler.java:918) 36 at org.thymeleaf.engine.StandaloneElementTag.beHandled(StandaloneElementTag.java:228) 37 at org.thymeleaf.engine.Model.process(Model.java:282) 38 at org.thymeleaf.engine.ProcessorTemplateHandler.handleOpenElement(ProcessorTemplateHandler.java:1587) 39 at org.thymeleaf.engine.TemplateHandlerAdapterMarkupHandler.handleOpenElementEnd(TemplateHandlerAdapterMarkupHandler.java:304) 40 at org.thymeleaf.templateparser.markup.InlinedOutputExpressionMarkupHandler$InlineMarkupAdapterPreProcessorHandler.handleOpenElementEnd(InlinedOutputExpressionMarkupHandler.java:278) 41 at org.thymeleaf.standard.inline.OutputExpressionInlinePreProcessorHandler.handleOpenElementEnd(OutputExpressionInlinePreProcessorHandler.java:186) 42 at org.thymeleaf.templateparser.markup.InlinedOutputExpressionMarkupHandler.handleOpenElementEnd(InlinedOutputExpressionMarkupHandler.java:124) 43 at org.attoparser.HtmlElement.handleOpenElementEnd(HtmlElement.java:109) 44 at org.attoparser.HtmlMarkupHandler.handleOpenElementEnd(HtmlMarkupHandler.java:297) 45 at org.attoparser.MarkupEventProcessorHandler.handleOpenElementEnd(MarkupEventProcessorHandler.java:402) 46 at org.attoparser.ParsingElementMarkupUtil.parseOpenElement(ParsingElementMarkupUtil.java:159) 47 at org.attoparser.MarkupParser.parseBuffer(MarkupParser.java:710) 48 at org.attoparser.MarkupParser.parseDocument(MarkupParser.java:301) 49 ... 50 more 50Caused by: java.lang.IllegalStateException: Neither BindingResult nor plain target object for bean name 'toppageSearch' available as request attribute 51 at org.springframework.web.servlet.support.BindStatus.<init>(BindStatus.java:153) 52 at org.springframework.web.servlet.support.RequestContext.getBindStatus(RequestContext.java:903) 53 at org.thymeleaf.spring5.context.webmvc.SpringWebMvcThymeleafRequestContext.getBindStatus(SpringWebMvcThymeleafRequestContext.java:227) 54 at org.thymeleaf.spring5.util.FieldUtils.getBindStatusFromParsedExpression(FieldUtils.java:306) 55 at org.thymeleaf.spring5.util.FieldUtils.getBindStatus(FieldUtils.java:253) 56 at org.thymeleaf.spring5.util.FieldUtils.getBindStatus(FieldUtils.java:227) 57 at org.thymeleaf.spring5.processor.AbstractSpringFieldTagProcessor.doProcess(AbstractSpringFieldTagProcessor.java:174) 58 at org.thymeleaf.processor.element.AbstractAttributeTagProcessor.doProcess(AbstractAttributeTagProcessor.java:74) 59 ... 66 more

該当のソースコード

parts/header.html

<div class="searchbox"> <form th:method="get" th:action="@{/user/Search}" th:object="${toppageSearch}"> <input type="text" class="searchform" th:field="*{searchword}" placeholder="検索ワード"> <input type="submit" value="検索"> </form> </div>

Toppage.html

<html xmlns:th="http://www.thymeleaf.org"> <body> <div th:replace="parts/header"></div> <div class="container"> </div> </body> </html>

参照元のController

@Controller @SessionAttributes({"toppageSearch", "categorylist"}) //追加 public class ToppageController extends AllController { @ModelAttribute("toppageSearch") ToppageSearch setupForm() { return new ToppageSearch(); } @ModelAttribute("categorylist") List<Category> setuplist() { ~~~~ return categorylist; } @RequestMapping(value = "/Toppage", method = RequestMethod.GET) public String displayTop(Model model) { ...

参照先のController

@Controller @SessionAttributes({"toppageSearch", "categorylist"}) //追加 public class AA { @RequestMapping("/mitulu") public String mitulu() { return "mitulu"; } } ...

(/Toppageでは動作します。)

補足情報(FW/ツールのバージョンなど)

Eclipse IDE
Spring Boot
Gladle

(追記) 解決方法

別ファイルにクラスを用意して継承させました。
AllController.java

public abstract class AllController { @ModelAttribute("toppageSearch") ToppageSearch setupForm() { return new ToppageSearch(); } @ModelAttribute("categorylist") List<Category> setuplist() { ~~~~ return categorylist; }

参照先のController

@Controller public class Mitulu extends AllController {

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

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

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

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

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

guest

回答1

0

ベストアンサー

予想されているとおり、共通でテンプレートとして置換しているparts/header.htmlにて、${toppageSearch}をth:objectへ格納しているが、toppageSearchオブジェクトがControllerないしはWebアプリケーション内で格納されていないため、後続の*{searchword}にてnullから参照しようとしてエラーになります。

状態管理をしっかり設計する必要はあるのですが、

java

1 @SessionAttributes 2 ToppageSearch setupForm() { 3 return new ToppageSearch(); 4 }

これを、@SessionAttributesにすることで、一度ToppageControllerへアクセスするとセッション属性に ToppageSearchが格納されるため、複数画面~Controllerで共有できるでしょう。

投稿2020/10/22 14:07

編集2020/10/23 02:11
A-pZ

総合スコア12011

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

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

mitulu

2020/10/23 01:43 編集

SessionAttributeを使うのですね…! 参考になります。。 しかしそのままModelAttributeをSessionAttribute にすると、Eclipse上で ''' 注釈 @SessionAttribute はこのロケーションでは使用できません ''' と出ます… @SessionAttributes にしても変わらないエラーです。 ''' @Controller @SessionAttributes("setupForm") ''' とするとコンパイルはできますが、別のページで表示できません…
A-pZ

2020/10/23 02:14

別のページを表示する際のControllerにて同じ宣言をしていますでしょうか?
mitulu

2020/10/26 09:00

参照先のコードに追加したら動きました。ありがとうございます。(コードを追記) ただ、この方法だとトップページを進んでからでないとアクセスできません… 諦めて同じコードを別のコントローラーに書くべきですかね…
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問