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

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

ただいまの
回答率

89.70%

Thymeleafでバリデーション

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 1,955

iijima

score 10

前提・実現したいこと

入力したデータが間違っていた場合、送信ボタンを押した際に再度同じ画面が表示されエラーメッセージが表示される。

発生している問題

同じ画面に戻そうとするとエラーが発生してしまう。

コード

全体を記述すると長くなってしまうため、必要だと思われる部分のみ記述しております。
他にも必要な部分がございましたら、指摘お願いします。

<form th:action="@{/登録確認画面}" method="POST"  th:object="${form}">

<label>ログインID</label>
<input type="text" name="txtLoginId" th:value="*{txtLoginId}" />
<span th:if="${#fields.hasErrors('txtLoginId')}" th:errors="*{txtLoginId}"></span>
// 登録画面呼び出し用
    @RequestMapping(value="/登録画面",method=RequestMethod.GET)
    public ModelAndView 登録画面(ModelAndView mav,@ModelAttribute("form") ValidForm form ) {

        // 対象テンプレートの呼び出し
        mav.setViewName("/登録画面");

        return mav;
    }

    @RequestMapping(value="/RegistUser",method=RequestMethod.POST)
    public ModelAndView RegistUser(ModelAndView mav,@ModelAttribute("form") @Valid ValidForm form,BindingResult result) {

        if(result.hasErrors()) {
            mav.setViewName("/登録画面");
            return mav;
        } else {
            mav.setViewName("/登録確認画面");
        }

        return mav;
    }

// 登録確認画面呼び出し用
       @RequestMapping(value="/ConfirmRegistUser")

       public ModelAndView ConfirmRegistUser(ModelAndView mav,
                    @RequestParam("txtLoginId") String loginId,
                    @Valid ValidForm form,BindingResult result                  
                    ){                           
                           if(result.hasErrors()) {
                                      mav.setViewName("/登録画面");
                                      return mav;
                           } else {
                                     mav.setViewName("/登録確認画面");
                           }
       }


             // リクエストした値を ConfirmRegistUser に渡す
             mav.addObject("loginId",loginId);
public class ValidForm {

    /*
     *  ログインID
     */
    @NotBlank(message="ログインを入力してください。")
    @Pattern(regexp="^[a-z0-9]{7,16}$",message="ログインID:半角英数字の7~16文字で入力してください。")
    private String txtLoginId;

    public String getTxtLoginId() {
        return txtLoginId;
    }

    public void setTxtLoginId(String txtLoginId) {
        this.txtLoginId = txtLoginId;
    }

試したこと

登録確認画面の呼び出しの際に、値がなくエラーが発生していたので、if文を使ってnullをはじくようにしてみましたが、そうすると何も入力しない状態でも登録確認画面へ遷移できてしまった。

補足情報

java version "1.8.0_152"
Java(TM) SE Runtime Environment (build 1.8.0_152-b16)
Java HotSpot(TM) 64-Bit Server VM (build 25.152-b16, mixed mode)
STS RELEASE 3.9.0

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

check解決した方法

0

まず、登録確認画面以外のメソッドをGETに合わせ、登録確認画面はPOSTに設定しました。

その後、java画面を以下のように修正しました。

@RequestMapping(value="/登録画面",method=RequestMethod.GET)
public ModelAndView 登録画面(ModelAndView mav,@ModelAttribute("form") ValidForm form) {

        //対象テンプレートの呼び出し
        mav.setViewName("/登録画面");

        return mav;
    }


// 登録確認画面呼び出し用
       @RequestMapping(value="/登録確認画面")
 public ModelAndView 登録確認画面(ModelAndView mav,
                    @RequestParam("txtLoginId") String loginId,@ModelAttribut('form&),@Valid ValidForm form,
                     BindingResult result                  
                    ){                           
                           if(result.hasErrors()) {
                                      mav.setViewName("/登録画面");
                                      return mav;
                           } else {
                                     mav.setViewName("/登録確認画面");
                           }
       }


             // リクエストした値を ConfirmRegistUser に渡す
             mav.addObject("loginId",loginId);

問題としては、登録確認画面で ValidForm でチェックをするのを忘れていたためでした。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 89.70%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる