Chapter 25

Controller(情報詳細表示)

kazpgm
kazpgm
2021.12.29に更新

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

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

controller.admin.ShohinController.java

商品情報詳細表示(mode=detail)

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

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

    @PostMapping(params="mode=detail")

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

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

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

        model.addAttribute("page", page);
        Shohin shohin = null;
        try {

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

            //商品情報を取得する
            shohin = shohinService.findByPk(products);
            if (shohin == null) {

・DB読み込み出来なかったときは、ログを出し、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(商品情報一覧画面)をテンプレートファイルとする。

                log.error("shohin not found:pk products={}", products);
                model.addAttribute("successMessage", "『products』=" + products + "は既に削除されています");
                Pageable pageable = PageRequest.of(Integer.parseInt(page), pageableDefaultSize);
                shohinListBackSub(model, pageable);
                return "/members/admin/shohin/shohinList";
            }

・DBエレメント(業種、大分類、中分類、小分類)のEntityオブジェクト(BiztypeCdObj、CategoryCdObj、SubcategoryCdObj、ExtracategoryCdObj)は、商品情報EntityのJPAによるリレーション(@NotFound(action=NotFoundAction.IGNORE) 、@ManyToOne、@JoinColumn)で取得している。★detail-02
・取得できないときはオブジェクトがnulllになるので、画面表示の時、NullPointerExceptionが起きないようnewしている。

            //大分類、中分類、小分類が見つからなかった場合
            if (ObjectUtils.isEmpty(shohin.getBiztypeCdObj())) {
                shohin.setBiztypeCdObj(new Biztype());
            }
            if (ObjectUtils.isEmpty(shohin.getCategoryCdObj())) {
                shohin.setCategoryCdObj(new Category());
            }
            if (ObjectUtils.isEmpty(shohin.getSubcategoryCdObj())) {
                shohin.setSubcategoryCdObj(new Subcategory());
            }
            if (ObjectUtils.isEmpty(shohin.getExtracategoryCdObj())) {
                shohin.setExtracategoryCdObj(new Extracategory());
            }
            
        } catch(Exception e){

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

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

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

        model.addAttribute("shohin", shohin);

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

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