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

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

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

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

Spring

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

Thymeleaf

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

Q&A

解決済

2回答

5569閲覧

Thymeleafのフォームから送信された値がControllerで取得できない

makoyang

総合スコア20

Java

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

Spring

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

Thymeleaf

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

0グッド

0クリップ

投稿2020/01/14 01:52

編集2020/01/14 08:24

お世話になります。
初めてSpring MVC、Thymeleafを使用するので色々お聞きしてしまっていますが、識者の方々、ご教授いただければ幸いと思います。

実現したいこと

Thymeleafのフォームから送信した値をJavaで参照したい。

該当のソースコード

main.html

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 <form th:action="@{send.xhtml}" th:object="${MainFormData}" action="#" method="post" enctype="multipart/form-data"> 9 <select th:field="*{bumon}"> 10 <option th:each="element : ${bumonMap}" th:value="${element.key}">[[${element.value}]]</option> 11 </select> 12 <select th:field="*{tenpo}"> 13 <option th:each="element : ${tenpoMap}" th:value="${element.key}">[[${element.value}]]</option> 14 </select> 15 <input th:field="*{image}" type="file" accept="image/*"> 16 <input type="submit" value="送信"> 17 </form> 18</body> 19</html>

MainCtrl.java

java

1@Controller 2public class MainCtrl { 3 4 @Autowired 5 private MainFormIf mainFormIf; 6 7 @ModelAttribute("MainFormData") 8 public MainFormIf setupBind() { 9 return this.mainFormIf; 10 } 11 12 @RequestMapping("/send") 13 public String send(@ModelAttribute("MainFormData") MainFormIf mainFormData) { 14 System.out.println(mainFormData.getBumon()); 15 System.out.println(mainFormData.getTenpo()); 16 17 return "main"; 18 } 19}

MainForm.java

java

1@Component 2public class MainForm implements MainFormIf { 3 4 private String bumon = ""; 5 6 private String tenpo = ""; 7 8 private MultipartFile image; 9 10 /* 以下、accessorが続きます */ 11}

MainFormIf.java

java

1public interface MainFormIf { 2 3 String getBumon(); 4 5 void setBumon(String bumon); 6 7 String getTenpo(); 8 9 void setTenpo(String tenpo); 10 11 MultipartFile getImage(); 12 13 void setImage(MultipartFile image); 14}

web.xml

xml

1<?xml version="1.0" encoding="UTF-8"?> 2<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 3 xmlns="http://xmlns.jcp.org/xml/ns/javaee" 4 xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" 5 id="WebApp_ID" version="3.1"> 6 7 <!-- 一部のみ抜粋 --> 8 9 <servlet-mapping> 10 <servlet-name>dispatcherServlet</servlet-name> 11 <url-pattern>*.xhtml</url-pattern> 12 </servlet-mapping> 13 14</web-app>

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

MainCtrl.javaの@RequestMapping("/send")の箇所でMainFormから送信されてきたmainFormDataに何も入っていない状態です。(MainForm.htmlの時点ではth:valueに値はセットされているのですが)

###開発環境

  • OS Windows10 professional x64
  • IDE Eclipse 4.8 Photon
  • Thymeleaf 3.0.2.RELEASE
  • 言語 Java
  • TOMCAT 9.0.30
  • Java 12
  • プロジェクト形式 Marvenプロジェクト

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

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

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

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

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

guest

回答2

0

html

1th:action="@{send.xhtml}"

では、send.xhtml へリクエストが飛んでしまいます。

投稿2020/01/14 01:56

A-pZ

総合スコア12011

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

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

makoyang

2020/01/14 02:06

すいません、説明不足でした。 web.xmlで少しマッピングのパターンを変更しています。 (web.xmlのソースを追加しました。) 一応、デバッグではControllerの@RequestMapping("/send")に来るところまでは確認できています。
A-pZ

2020/01/14 02:21

なるほど…。 ところで、Controllerにて @Autowired private MainFormIf mainFormIf; @ModelAttribute("MainFormData") public MainFormIf setupBind() { return this.mainFormIf; } @RequestMapping("/send") public String send(@ModelAttribute("MainFormData") MainForm mainFormData) と、 @ModelAttributeを指定してMainFormDataを、Formからの入力ではなく、 @Autowired で取得しているから 中身がないのではないかと思うのですが、@Autowired しなければならない理由はありますか?これがあるため、中身がないのではないでしょうか。
makoyang

2020/01/14 02:51

Thymeleafでフォームから送信する時にコントローラ側ににth:object="${MainFormData}"の入れ物(実態)が必要だと思っていました。ですので@Autowiredにしています。(説明が適切か自信がない...) ちなみに@Autowiredを抜いてみたのですが、Webサイトアクセス時に以下のエラーが出ます。 11:47:42.326 [http-nio-8080-exec-2] ERROR org.thymeleaf.TemplateEngine - [THYMELEAF][http-nio-8080-exec-2] Exception processing template "main": An error happened during template parsing (template: "ServletContext resource [/main.html]") (以下省略)
A-pZ

2020/01/14 03:33

> ですので@Autowiredにしています それは目的が異なります。 Controller経由でThymeleafで値を表示したいのであれば、Controllerの引数に対象のクラス(MainFormData)を用意するか、またはControllerの戻り値を文字列(遷移するHTML)ではなく、ModelAndView にして、Thymeleafで表示するオブジェクトを明示的に宣言するべきです。
makoyang

2020/01/14 04:35

ええと、すいません。 今回は「コントローラ経由でThymeleafに値を表示」ではなくて「Thymeleafで入力された値をコントローラで処理」です。 もしかして私は何か根本的に間違っているのでしょうか... ちなみにデータバインド周りは https://arimodoki.mydns.jp/promenade/s_bind.html こちらを参考にしていました。
A-pZ

2020/01/15 01:38

では具体的に指摘すると、Controllerクラスに@AutowiredでFormを追加してしまっているので、リクエストパラメータなどの内容を一切無視したコードになってしまっています、ということです。 そもそもFormに@Componentを付ける理由も異なります。 エラーが出ている原因は、Thymeleafで表示するためのFormの値がControllerからわたっていないから、であり、 リクエストパラメータの値を無視しているのは、Controllerにて、Formが@Autowiredされているから、です。
makoyang

2020/01/15 05:19

色々とご教授有難うございます! 頂いた回答も参考になんとか解決する事ができました。
guest

0

自己解決

以下を追加したところ正常にPOSTパラメタの内容が参照できるようになりました。

applicationContext.xml

xml

1 <bean id="multipartResolver" 2 class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> 3 <!-- ファイルアップロードの最大サイズ(byte単位)を指定する (-1:制限なしはNG) --> 4 <property name="maxUploadSize" value="5242880" /> 5 </bean>

投稿2020/01/15 05:18

makoyang

総合スコア20

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問