Chapter 26

Controller(情報更新)

kazpgm
kazpgm
2022.01.04に更新

自動作成されたControllerを説明する。

例:商品情報管理("/members/admin/shohin/shohin")

controller.admin.ShohinController.java

商品情報更新初期表示(mode=upd)

    //=======================================================
    // 商品情報更新
    //=======================================================
    /**
     * 商品情報更新表示処理
     * 商品情報更新を表示する処理
     *
     * @param products products
     * @param mode モード
     * @param page page
     * @param model モデル
     * @return 遷移先
     */

・サイドメニューの商品情報一覧(更新削除)をクリックすると、商品情報一覧画面が表示されます。
・商品情報一覧で、更新対象を選択し、変更ボタンを押下すると、JavaScriptのsubmitFrm3関数 によりサブミットされます。
・URL:/members/admin/shohin/shohinによりShohinController.javaにマッピングされ、mode=upd★upd-01により、shohinUpdメソッドにマッピングされます。shohinUpdメソッドは商品情報更新画面を表示します。★upd-02

    @PostMapping(params="mode=upd")

・リクエストパラメータproducts(商品CD)、mode、page(ページ番号)を受け取ります。
・Model:htmlで表示する値を渡すため、引数にModelを指定する。

    public String shohinUpd(
            @RequestParam("products") String products,
            @RequestParam("mode") String mode,
            @RequestParam("page") String page,
            Model model) {

・mode=updと、pageをmodelアトリビュートに設定している。

        model.addAttribute("mode", "upd");
        model.addAttribute("page", page);
        ShohinForm shohinForm = new ShohinForm();
        try {

・DBから商品CDをキーに商品情報を取得し商品情報Formに設定する。

            //商品情報を取得する
            shohinForm= shohinService.findByPkForShohinForm(products);

・商品情報Formの項目値(業種、大分類、中分類、小分類)をDBエレメントでチェックし、DBエレメント(業種、大分類、中分類、小分類)を商品情報Formに追加する。★upd-03
・補足:DBエレメントでチェック(checkAndEditLrgmidsmlForShohinFormメソッド)を、パラメータBindingResult=nullで読んでいるので、エラーは起きない。

            //大分類、中分類、小分類の、DBエレメントを作成する
            checkAndEditLrgmidsmlForShohinForm(shohinForm, null);
        } catch(Exception e){

・DB例外発生時はshohinServiceでrollbackされている。
・例外をキャッチし、"invalid pk"なら、successMessage="既に削除されています"をmodelアトリビュートに設定し、shohinListBackSubメソッド(商品情報リスト一覧表示サブ処理。DBデータ検索などを行っている)を実行する。
・パラメータの意味
 ・model:Model
 ・pageable:PageRequest.ofに、現在のページ番号と1画面の行数を渡して、Pageableオブジェクトを作成している
・補足:shohinListBackSubメソッドは、shohinSrchForm(商品情報検索条件Form)、srchOrderForm(商品情報タイトル行ソート順Form)をセッションスコープのsessionShohinSrchForm、sessionShohinSrchOrderFormから取得してDB検索に使用している。
・遷移先として、/resources/templates/members/admin/shohin/shohinList.html(商品情報一覧画面)をテンプレートファイルとする。
・"invalid pk"以外は、ログを書いて例外を投げる。画面はシステム共通例外発生画面になる。「システム共通例外発生画面」シート参照
・補足:Throwable.Errorは、ここでキャッチせずに、システム共通例外発生画面で処理している。

            if (e.getMessage() != null && e.getMessage().equals("invalid pk")) {
                model.addAttribute("successMessage", "『products』=" + products + "は既に削除されています");
            } else {
                e.printStackTrace();
                log.error("DBエラーが発生しました", e);
                throw e;
            }
            Pageable pageable = PageRequest.of(Integer.parseInt(page), pageableDefaultSize);
            shohinListBackSub(model, pageable);
            return "/members/admin/shohin/shohinList";
        }

・商品情報Formをmodelアトリビュートに設定している。

        model.addAttribute("shohinForm", shohinForm);

・遷移先として、/resources/templates/members/admin/shohin/shohinAmend.htmlをテンプレートファイルとする。★upd-02

        return "/members/admin/shohin/shohinAmend";
    }

商品情報更新登録ボタン押下(mode=upd_do)

    /**
     * 商品情報更新処理
     * 商品情報更新する処理
     *
     * @param shohinForm 商品情報登録
     * @param result チェック結果
     * @param mode モード
     * @param page page
     * @param model モデル
     * @return 遷移先
     */

・登録ボタンを押下すると、JavaScriptのdo_Submit_Clk1関数 によりサブミットされます。
・URL:/members/admin/shohin/shohinによりShohinController.javaにマッピングされ、mode=upd_doにより、shohinUpdDoメソッドにマッピングされます。shohinUpdDoメソッドは商品情報をDBに登録します。★upd_do-01
・「ShohinForm shohinForm」に(@Validated({GroupOrder1.class, GroupOrder2.class}) をつけているので、ShohinFormのチェックを行います。チェックはまず、Fromクラスに書かれたGroupOrder1.classグループ(必須チェック、桁数チェック)が行われ、OKの時GroupOrder2.classグループ(属性チェック)が行われます。
・エラーはBindingResultに設定されます。
・画面内容はshohinFormにセットされる。

    @PostMapping(params="mode=upd_do")
    public String shohinUpdDo(@Validated({GroupOrder1.class, GroupOrder2.class})  ShohinForm shohinForm,
            BindingResult result,

・リクエストパラメータmode、page(ページ番号)を受け取ります。
・Model:htmlで表示する値を渡すため、引数にModelを指定する。

            @RequestParam("mode") String mode,
            @RequestParam("page") String page,
            Model model) {

・mode=updをmodelアトリビュートに設定している。
・pageをmodelアトリビュートに設定している。

        //エラーになったときのモードを設定
        model.addAttribute("mode", "upd");
        model.addAttribute("page", page);

・商品情報更新画面内容(shohinForm)の入力値(業種、大分類、中分類、小分類)をDBエレメントでチェックし、DBエレメント(業種、大分類、中分類、小分類)をShohinFormに追加する。
・補足:パラメータBindingResultを設定している。これによりエラー時はBindingResultにエラーメッセージが設定される。
・但し、実際には、プルダウンリストから、業種、大分類、中分類、小分類を選択するので、エラーにならない。

        //大分類、中分類、小分類をチェックし、DBエレメントを作成する
        checkAndEditLrgmidsmlForShohinForm(shohinForm, result);
        //主キーをチェックする。
        checkPkForShohinForm("u", shohinForm, result);
        if (result.hasErrors()) {

・エラーの時は、
 ・遷移先として、/resources/templates/members/admin/shohin/shohinAmend.htmlをテンプレートファイルとする。

            shohinService.setDbEleObjForShohinForm(shohinForm);
            return "/members/admin/shohin/shohinAmend";
        }
        
        try {

・商品情報DBを更新する。
・パラメータの意味
 ・shohinForm.getProducts()~shohinForm.getOpenkbn1():画面入力値(商品CD~公開区分)

            shohinService.update(shohinForm.getProducts(), shohinForm.getProductsname(), shohinForm.getBiztypeCd(), shohinForm.getCategoryCd(), shohinForm.getSubcategoryCd(), shohinForm.getExtracategoryCd(), shohinForm.getOpenkbn1());
        } catch(Exception e){

・DB例外発生時はshohinServiceでrollbackされている。例外をキャッチしたら、ログを書いて例外を投げる。画面はシステム共通例外発生画面になる。「システム共通例外発生画面」シート参照
・補足:Throwable.Errorは、ここでキャッチせずに、システム共通例外発生画面で処理している。

            e.printStackTrace();
            log.error("DBエラーが発生しました", e);
            throw e;
        }

・PageRequest.ofに、現在のページ番号と1画面の行数を渡して、Pageableオブジェクトを作成している

        Pageable pageable = PageRequest.of(Integer.parseInt(page), pageableDefaultSize);

・DB更新OK時は、successMessage="更新が完了しました"をmodelアトリビュートに設定している。★upd_do-02

        model.addAttribute("successMessage", "商品情報更新(" + "『products』=" + shohinForm.getProducts() + ")が完了しました");

・shohinListBackSubメソッド(商品情報リスト一覧表示サブ処理。DBデータ検索などを行っている)を実行する。
・パラメータの意味
 ・model:Model
 ・pageable:作成したpageableオブジェクト
・補足:shohinListBackSubメソッドは、shohinSrchForm(商品情報検索条件Form)、srchOrderForm(商品情報タイトル行ソート順Form)をセッションスコープのsessionShohinSrchForm、sessionShohinSrchOrderFormから取得してDB検索に使用している。

        shohinListBackSub(model, pageable);

・遷移先として、/resources/templates/members/admin/shohin/shohinList.html(商品情報一覧画面)をテンプレートファイルとする。

        return "/members/admin/shohin/shohinList";
    }