実現したいこと
登録画面のフォームに値を入力し、非同期通信でデータを登録する。
最近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を用いた非同期でのやり方があまりなかったので質問させていただきます
補足
特になし
確認なのですが
> 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">へは
フォームが正しく送信できているのは確認済みでしょうか。
>> public String registBtn(@ModelAttribute final RegistForm RegistForm, Model model) {
>
> (私が知らないだけかもしれませんが) @ModelAttributeアノテーションで、この使い方は見かけないのですが正しいのでしょうか。
もし、こういう記述方法があるなら私も知っておきたいですね。
ただ、"RegistForm"という識別子がクラス名、変数名、Thymeleafテンプレートのformのオブジェクト名で全て同じになっていて問題が出そうな気もするので、この点に関しては区別して分けた方が良い気はします。
フォームとボタンを下記のような形で変更し、ボタンを押下すれば
コントローラーの「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="登録"/>
> フォームとボタンを下記のような形で変更し、ボタンを押下すれば
> コントローラーの「registData(accountRegistForm); //ここでRegistFormの値を取得したい」の部分で値を受け取ることは可能です。
? すみませんが、コメントの意図が不明です。そのように修正するのが正しく、現時点で質問文中に記載されているのは間違い、と言うことですか? もしそうであれば、質問文を修正するなり追記するなり、解決してしまったのであれば自己解決で閉じるなどしてください。
ああ、今、コメントの意図が分かりました。input type="submit"のボタンでの動作確認は、そのように修正するとことで済んでいる、と言うことですか?
Java はわからないのですが、その JavaScript は、data がないので、ヘッダ以外の何のデータも送信していないように見えます。
ああ、今、コメントの意図が分かりました。input type="submit"のボタンでの動作確認は、そのように修正するとことで済んでいる、と言うことですか?
→その通りです。
ただ今回は、ajaxを用いた非同期処理でコントローラーにデータを送り、処理を実行したいということです。
こちら、th:object="${RegistForm}"自体は正確に動いているでしょうか。dodox86さんのおっしゃる通り、@ModelAttribute("RegistForm")の間違いのように思われますが…。
省略すると、使えるのは先頭小文字のregistFormになるので、以下は全てregistFormになります。
@ModelAttribute RegistForm RegistForm
@ModelAttribute("registForm") RegistForm RegistForm
RegistForm RegistForm //省略しても@ModelAttributeが付きます
このままだと*{accountName}で値を取得する時に、Whitelabel Error Pageになります。また、Ajaxの処理についてはSpring側を把握すると、作れるようになると思いますので応援してます。