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

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

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

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

MyBatis

MyBatisはJavaや.NET Frameworkでなどで使用できる、SQL文や、ストアドプロシージャをオブジェクトと紐付けるO/Rマッピングフレームワークです。

Thymeleaf

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

Q&A

2回答

289閲覧

[Spring MyBatis thymeleaf]Ajaxを使った非同期処理でform内容を取得する方法

takesty

総合スコア3

Spring

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

MyBatis

MyBatisはJavaや.NET Frameworkでなどで使用できる、SQL文や、ストアドプロシージャをオブジェクトと紐付けるO/Rマッピングフレームワークです。

Thymeleaf

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

0グッド

1クリップ

投稿2025/03/24 06:52

実現したいこと

登録画面のフォームに値を入力し、非同期通信でデータを登録する。
最近springの勉強を始めたので初歩的な質問で申し訳ありませんが、ご教授いただければ幸いです。
情報が少なければ追記しますのでよろしくお願いします。

発生している問題・分からないこと

formの内容が取得できない

該当のソースコード

Java

1@Controller 2@RequestMapping("/data") 3public class AccountRegistController { 4 5 @GetMapping(path = "/regist") 6 public String registBtn(@ModelAttribute final RegistForm RegistForm, Model model) { 7 registData(accountRegistForm); //ここでRegistFormの値を取得したい 8 } 9 10}

HTML

1<form th:object="${RegistForm}" th:method="post"> 2<table class="list2" width="500px" align="left"> 3 <tr align="left"> 4 <td th:text="${labelAccountName}">アカウント名</td> 5 <td> 6 <input class="text" type="text" th:field="*{accountName}" /> 7 </td> 8 </tr> 9 <td width="95%" style="text-align:right"> 10 <input type="button" class="button" onclick="Regist();"th:value="登録"/> 11 </td> 12</table> 13</form>

JavaScript

1function Regist() { 2 $.ajax({ 3 url: '/data/regist', 4 method: 'GET', 5 success: function(response) { 6 let content = $(response); 7 8 // エラーメッセージを更新 9 $("#errrMessages").html(content.filter("#errrMessages").html()); 10 11 } 12 }) 13}

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

submitするパターンはいくつかあったのですがajaxを用いた非同期でのやり方があまりなかったので質問させていただきます

補足

特になし

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

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

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

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

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

dodox86

2025/03/25 00:18

確認なのですが > public String registBtn(@ModelAttribute final RegistForm RegistForm, Model model) { (私が知らないだけかもしれませんが) @ModelAttributeアノテーションで、この使い方は見かけないのですが正しいのでしょうか。 https://spring.pleiades.io/spring-framework/reference/web/webmvc/mvc-controller/ann-methods/modelattrib-method-args.html thymeleafテンプレートのhtmlを見ると <form th:object="${RegistForm}" th:method="post"> となっているので、@ModelAttribute("RegistForm" Model model) の間違いだったりしませんか? 2. Ajaxとか非同期でのフォームの送信は置いておいて、まず普通にhtmlのformのsubmitで<form th:object="${RegistForm}" th:method="post">へは フォームが正しく送信できているのは確認済みでしょうか。
dodox86

2025/03/25 00:31

>> public String registBtn(@ModelAttribute final RegistForm RegistForm, Model model) { > > (私が知らないだけかもしれませんが) @ModelAttributeアノテーションで、この使い方は見かけないのですが正しいのでしょうか。 もし、こういう記述方法があるなら私も知っておきたいですね。 ただ、"RegistForm"という識別子がクラス名、変数名、Thymeleafテンプレートのformのオブジェクト名で全て同じになっていて問題が出そうな気もするので、この点に関しては区別して分けた方が良い気はします。
takesty

2025/03/25 00:46

フォームとボタンを下記のような形で変更し、ボタンを押下すれば コントローラーの「registData(accountRegistForm); //ここでRegistFormの値を取得したい」の部分で値を受け取ることは可能です。 <form th:object="${RegistForm}" th:method="post"> ↓ <form th:object="${RegistForm}" th:action="@{/data/regist}"th:method="post"> <input type="button" class="button" onclick="Regist();"th:value="登録"/> ↓ <input type="submit" class="button" th:value="登録"/>
dodox86

2025/03/25 01:22

> フォームとボタンを下記のような形で変更し、ボタンを押下すれば > コントローラーの「registData(accountRegistForm); //ここでRegistFormの値を取得したい」の部分で値を受け取ることは可能です。 ? すみませんが、コメントの意図が不明です。そのように修正するのが正しく、現時点で質問文中に記載されているのは間違い、と言うことですか? もしそうであれば、質問文を修正するなり追記するなり、解決してしまったのであれば自己解決で閉じるなどしてください。
dodox86

2025/03/25 01:25

ああ、今、コメントの意図が分かりました。input type="submit"のボタンでの動作確認は、そのように修正するとことで済んでいる、と言うことですか?
Lhankor_Mhy

2025/03/25 02:59

Java はわからないのですが、その JavaScript は、data がないので、ヘッダ以外の何のデータも送信していないように見えます。
takesty

2025/03/25 03:06

ああ、今、コメントの意図が分かりました。input type="submit"のボタンでの動作確認は、そのように修正するとことで済んでいる、と言うことですか? →その通りです。  ただ今回は、ajaxを用いた非同期処理でコントローラーにデータを送り、処理を実行したいということです。
KT001

2025/03/25 14:20

こちら、th:object="${RegistForm}"自体は正確に動いているでしょうか。dodox86さんのおっしゃる通り、@ModelAttribute("RegistForm")の間違いのように思われますが…。 省略すると、DIに登録されるのは先頭小文字のregistFormになるので、以下は全てregistFormになります。 @ModelAttribute RegistForm RegistForm @ModelAttribute("registForm") RegistForm RegistForm RegistForm RegistForm //省略しても@ModelAttributeが付きます このままだと*{accountName}で値を取得する時に、Whitelabel Error Pageになりそうですが、別のコードで初期表示している感じでしょうか?
guest

回答2

0

Jqueryの機能だと思うのですが、
formの入力をシリアライズしたりオブジェクト化する機能があります。
色々調べてみるといいかもしれません。

params = $('form').serialize();

https://qiita.com/tk3fftk/items/22bf451f3051804b142d

successをもつオブジェクトを渡す方法は確かに古い方法ですが、非同期メソッドの処理の流れや、実際にこの古い方法では何をしているのか(具体的に言うとsuccessを持つオブジェクトを引数に渡している)という点が理解出来ているのであれば、特に方法は気にしなくていいと思います。

(質問に記載がないけれど、jQueryでデータを持たす方法は基礎だと思うので割愛)


追記。
調べてみると思ったより情報が少なかったので、ナレッジになればいいと思い投稿することにしました。
コードはAIに書いてもらいました。
GetバージョンとPostバージョンを両方書くのが面倒だったので、自動で内容が変わるようにしています。
*下記のコードはすべて動作未検証です。問題があれば回答を編集していきます。

バニラjsだとこんな感じ
FormDataというクラスがあるようです。

引用
FormData
https://developer.mozilla.org/ja/docs/Web/API/XMLHttpRequest_API/Using_FormData_Objects
GET送信について
https://developer.mozilla.org/ja/docs/Web/API/FormData

js

1const form = document.querySelector("form"); 2const formData = new FormData(form); 3const method = form.method.toUpperCase(); // フォームの method を取得 (大文字変換) 4const url = form.action 5 6if (method === "GET") { 7 const params = new URLSearchParams(formData).toString(); 8 url += `?${params}`; 9} 10 11// fetch オプションを作成 12const options = { method }; 13if (method === "POST") { 14 options.body = formData; 15} 16 17// fetch 実行(thenを使用) 18fetch(url, options) 19 .then(response => response.json()) 20 .then(data => console.log(data)) 21 .catch(error => console.error("Error:", error)) 22 .finally(() => console.log("done"));

jQueryだとこんな感じ
(serializeArrayを使うように指示しました)

js

1const $form = $("form"); 2const method = $form.attr("method"); // デフォルトは POST 3const url = $form.attr("action"); // `action` の URL を取得 4const data = $form.serializeArray(); 5 6$.ajax({ 7 url: url, 8 method: method, 9 data: data 10}) 11.done(function(response) { 12 console.log(response); 13}) 14.fail(function(jqXHR, textStatus, errorThrown) { 15 console.error("Error:", textStatus, errorThrown); 16}) 17.always(function() { 18 console.log("done"); 19});

jQueryでsuccessを使用する

js

1const $form = $("form"); 2const method = $form.attr("method"); // デフォルトは POST 3const url = $form.attr("action"); // `action` の URL を取得 4const data = $form.serializeArray() 5 6$.ajax({ 7 url: url, 8 method: method, 9 data: data, 10 success: function(response) { 11 console.log(response); 12 }, 13 error: function(jqXHR, textStatus, errorThrown) { 14 console.error("Error:", textStatus, errorThrown); 15 }, 16 complete: function() { 17 console.log("done"); 18 } 19});

ちなみに、ほかの投稿で上がっているsuccessの使用についての意見はコメントにある通り、メソッドの話です。
うまくまとめているサイトがありました。
https://freelance-jak.com/technology/jquery/1276/

そしてもう一つ、
successをオプションとして渡すことよりdoneのほうがいい点については
successをオプションとして渡すとその中でしか処理を書けないので、doneでチェーンすれば、チェーンで次へ次へと書けるという点が挙げられます。
あるfetchをした後にべつのfetchをしたいという場合、doneのメソッド内でreturnで返せば次の処理を書けますが、successの使用ではどんどんネストするしかないためコールバック地獄と呼ばれるものになります。
まあ、でも基本的にはそんなコードを書くことはないので、その特徴さえ知っていれば(理解できているのであれば)特に気にしなくていいと思います。
もちろん、良い方法に合わせているほうが後からコード追加するときだとか開発中にスムーズにコードをかけるんですけど。
実際に開発初期に色々と整理していると、何も悩まずに開発ができるのでスムーズです。

投稿2025/03/25 04:14

編集2025/03/26 06:28
utm.

総合スコア676

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

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

0

まずjavascriptがjQueryに依存されているようです。
適切なjQueryライブラリを読み込んでください。
$.ajaxのsuccess処理は相当古い書き方で非推奨です。すくなくともdoneでチェーンしてください

なお基本XHRの処理はもうjQueryではなくfetchの方が一般的です。

投稿2025/03/24 08:34

yambejp

総合スコア117422

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

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

takesty

2025/03/25 00:38

function Regist() { $.ajax({ url:"/data/regist", type:"GET", }).done(function(){ // エラーメッセージを更新 $("#errrMessages").html(content.filter("#errrMessages").html()); }); } このような記載にするということでしょうか。
yambejp

2025/03/25 01:05

jQueryがマストなのでしょうか? javaから何が戻る仕様かわからないのでなんともいえませんが 「done(function(data){」でうけとったdataを利用することになります $.ajax内でdataTypeの指定もした方がよいでしょう
Lhankor_Mhy

2025/03/25 04:36

横からすみません。 > $.ajaxのsuccess処理は相当古い書き方で非推奨です。 これは誤解があるかもしれません。非推奨となったのは、jqXHR.success() であって、$.ajax() などのオプションである success は非推奨ではないはずです。 古い書き方であるのは間違いないと思いますが。 https://jquery.com/upgrade-guide/3.0/#breaking-change-special-case-deferred-methods-removed-from-jquery-ajax
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.32%

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

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

質問する

関連した質問