Chapter 24

Controller(情報登録)

kazpgm
kazpgm
2022.01.04に更新

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

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

controller.admin.ShohinController.java

商品情報登録初期表示(mode=ins)

    //=======================================================
    // 商品情報登録
    //=======================================================
    /**
     * 商品情報登録表示処理
     * 商品情報登録を表示する処理
     *
     * @param shohinForm 商品情報登録
     * @param mode モード
     * @param model モデル
     * @return 遷移先
     */

・サイドメニューの商品情報一括登録をクリックすると、JavaScriptのsubmitFrm5関数 によりサブミットされます。
・URL:/members/admin/shohin/shohinによりShohinController.javaにマッピングされ、mode=insにより、shohinInsメソッドにマッピングされます。shohinInsメソッドは商品情報登録画面を初期表示します。★ins-01

    @PostMapping(params="mode=ins")

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

    public String shohinIns(@RequestParam("mode") String mode,
            Model model) {

・mode=ins、mode=ins_doのメソッドで共通に使用しているメソッドを呼ぶ。

        shohinInsSub(model);

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

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

    /**
     * shohinInsSubメソッド
     * 商品情報登録を表示する処理のサブモジュール
     * 
     * @param model モード
     */

・mode=ins、mode=ins_doのメソッドで共通に使用しているメソッドです。

    private void shohinInsSub(Model model) {
        ShohinForm shohinForm = new ShohinForm();
        //DBエレメントを取得する

・insList同様に、DBエレメントを使用している場合、以下DBエレメント取得ロジックが自動作成されます。
・insList同様に、商品情報Formの場合、業種ID、大分類、中分類、小分類のプルダウンがDBエレメントを使用します。

        LinkedHashMap<String, Map<Object, String>> dbELEMENTS = new LinkedHashMap<String, Map<Object, String>>();
        LinkedHashMap<String, Map<Object, String>> dbELEMENTS1;

・insList同様に、業種情報を対象に、業種マップをDBエレメントに追加するという処理。★ins-03
・パラメータの意味
 ・getAllFlg=false:非公開は取得しない。なのだけど、公開フラグを持ってないので、公開フラグを選択するロジックはないので、設定値は無視される。
  補足:テーブルに公開フラグがない場合でもgetAllFlgパラメータは存在する。
 ・lrgMapKey="biztypeCd":dbELEMENTSに、キー"biztypeCd"で、業種マップ(キー:業種ID、データ:業種ID + ":" +業種名)を登録する。

        dbELEMENTS1 = dbElementsService.getDbEleAryLrgmidsmlBiztype(false,  
                        "biztypeCd");
        dbELEMENTS.putAll(dbELEMENTS1);

・insList同様に、大分類情報、中分類情報、小分類情報を対象に、大分類が選択されていないときは、大分類マップのみ、大分類が選択されてれば、さらに、中分類マップ、中分類が選択されていればさらに、小分類マップをDBエレメントに追加するという処理。★ins-04
・パラメータの意味
 ・getAllFlg=false:非公開は取得しない。
  補足:テーブルに公開フラグがない場合でもgetAllFlgパラメータは存在する。
 ・categoryCd=null:設定値に関係なく、大分類情報全データ取得し、大分類マップを作成する。nullはまだ大分類が選択されていないということ。
 ・categoryCdFlg=true:categoryCd値がDBにある時、trueとする。categoryCdFlg=trueかつ、categoryCdがnull以外の時、中分類情報全データ取得し、中分類マップを作成する。
 ・subcategoryCd=null:中分類を設定する。nullはまだ中分類が選択されていないということ。
 ・subcategoryCdFlg=true:中分類がDBにある時、trueとする。subcategoryCdFlg=trueかつ、subcategoryCdがnull以外の時、小分類情報全データ取得し、小分類マップを作成する
 ・lrgMapKey="categoryCd":dbELEMENTSに、キー"categoryCd"で、大分類マップ(キー:大分類、データ:大分類+ ":" +大分類名)を登録する。
 ・midMapKey="subcategoryCd":dbELEMENTSに、キー"subcategoryCd"で、中分類マップ(キー:中分類、データ:中分類+ ":" +中分類名)を登録する。

        dbELEMENTS1 = dbElementsService.getDbEleAryLrgmidsmlCategory(false, null, true, 
                        null, true, 
                        "categoryCd", "subcategoryCd", "extracategoryCd");
        dbELEMENTS.putAll(dbELEMENTS1);

・shohinForm(商品情報Form)にDBエレメントを設定する。

        shohinForm.setDbELEMENTS(dbELEMENTS);

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

        model.addAttribute("shohinForm", shohinForm);

・モード("ins")を、modelアトリビュートに設定している。

        model.addAttribute("mode", "ins");
    }

商品情報登録登録ボタン押下(mode=ins_do)

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

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

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

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

            @RequestParam("mode") String mode,
            Model model) {
        //エラーになったときのモードを設定

・モード("ins")を、modelアトリビュートに設定している。

        model.addAttribute("mode", "ins");

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

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

・ins同様に、遷移先として、/resources/templates/members/admin/hohin/shohinRegister.htmlをテンプレートファイルとする。

            setAddNumMapForAttribute(model, shohinInsUpdListForm);
            return "/members/admin/shohin/shohinRegister";
        }
        String products="";
        try {
            //主キー作成

・DBシーケンスから商品CDを作成する。★ins_do-02
・パラメータの意味
 ・"shohin":テーブル名
 ・shohinProductsLen:主キーの長さ。定義ファイルのVARCHAR(10)から設定
 ・"あり":"あり":Aあり、"なし":Aなし(シーケンス (A+yymmdd+数字)のA)
 ・6: yymmddのとき6,yyyymmddのとき8、使わないとき0(シーケンス (A+yymmdd+数字))の日付(yymmdd、yyyymmdd、なし)

            products = seqService.getDbSeq("shohin", shohinProductsLen, "あり", 6);

・商品情報DBを登録する。
・パラメータの意味
 ・products:作成した商品CD
 ・shohinForm.getProductsname()~shohinForm.getOpenkbn1():画面入力値(商品名~公開区分)

            shohinService.register( products, 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;
        }
        Shohin shohin = null;
        try {
            //メールのために商品情報を取得する

・登録した主キーで商品情報を読み込む。これにより商品情報Entityに、BiztypeCdObj、CategoryCdObj、SubcategoryCdObj、ExtracategoryCdObjがDBから設定される。

            shohin = shohinService.findByPk(products);
            if (shohin == null) {

・DB読み込み出来なかったときは、ログを出して、RuntimeExceptionを投げる。画面はシステム共通例外発生画面になる。

                log.error("shohin not found:pk products={}", products);
                throw new RuntimeException("invalid pk");
            }

・メールを投げる。
・パラメータの意味
 ・appProperties.getMailTo():src\main\resources\application.propertiesに登録したTOメールアドレス。
 ・appProperties.getMailFrom():src\main\resources\application.propertiesに登録したFromメールアドレス
 ・"登録メール":Subject
 ・shohin:商品情報Entity

            shohinService.send(appProperties.getMailTo(), appProperties.getMailFrom(), "登録メール", shohin);
        } catch(Exception e){

・例外をキャッチしたら、ログを書く。
・"errorMessage"にエラーを書いてmodelアトリビュートに設定する。
・ins同様に、遷移先として、/resources/templates/members/admin/shohin/shohinRegister.htmlをテンプレートファイルとする。
・補足:メール送信エラー時はすでにDBコミット済みなので、例外を発生させない。

            e.printStackTrace();
            log.error("メール送信でエラーが発生しました。(但し、商品情報は登録完了済みです)", e);
            model.addAttribute("errorMessage", "エラーが発生しました。(但し、商品情報は登録完了済みです)");
            return "/members/admin/shohin/shohinRegister";
        }

・mode=ins、mode=ins_doのメソッドで共通に使用しているメソッドを呼ぶ。

        shohinInsSub(model);

・DB更新OK時は、successMessageをmodelアトリビュートに設定している。★ins_do-03

        model.addAttribute("successMessage", "商品情報登録が完了しました");

・ins同様に、遷移先として、/resources/templates/members/admin/shohin/shohinRegister.htmlをテンプレートファイルとする。

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

    /**
     * checkAndEditLrgmidsmlForShohinFormメソッド
     * 大分類、中分類、小分類をチェックし、DBエレメントを作成する
     * 
     * @param shohinForm フォーム
     * @param result result。指定しないときはnullとすること。
     */
    private void checkAndEditLrgmidsmlForShohinForm(ShohinForm shohinForm, BindingResult result) {
        checkAndEditLrgmidsmlForShohinForm(shohinForm, result, "");
    }
    /**
     * checkAndEditLrgmidsmlForShohinFormメソッド
     * 大分類、中分類、小分類をチェックし、DBエレメントを作成する
     * 
     * @param shohinForm フォーム
     * @param result result。指定しないときはnullとすること。
     * @param prefixes リスト配列に当オブジェクトがある時のprefixes。指定しないときは空文字とすること。
     */
    private void checkAndEditLrgmidsmlForShohinForm(ShohinForm shohinForm, BindingResult result, String prefixes) {
        boolean biztypeCdFlg = true;
        boolean categoryCdFlg = true;
        boolean subcategoryCdFlg = true;
        boolean extracategoryCdFlg = true;

・biztypeをチェックしbiztypeCdFlgを設定。存在しないときはエラーメッセージを設定する。

       //『大分類』がbiztypeテーブルにあればtrue(削除されているものは取得しない)
        if (!dbElementsService.isCheckBiztypeCd(shohinForm.getBiztypeCd(), false)) {
            biztypeCdFlg = false;
            if (result != null) {
                result.rejectValue(prefixes + "biztypeCd", "validation.category", new String[] {"『業種id』"}, "");    
            }

        }

・categoryをチェックしcategoryCdFlgを設定。存在しないときはエラーメッセージを設定する。

        //『大分類』がcategoryテーブルにあればtrue(削除されているものは取得しない)
        if (!dbElementsService.isCheckCategoryCd(shohinForm.getCategoryCd(), false)) {
            categoryCdFlg = false;
            if (result != null) {
                result.rejectValue(prefixes + "categoryCd", "validation.category", new String[] {"『大分類』"}, "");    
            }

        }

・subcategoryをチェックしsubcategoryCdFlgを設定。存在しないときはエラーメッセージを設定する。

        //『中分類』がsubcategoryテーブルにあればtrue(削除されているものは取得しない)
        if (!dbElementsService.isCheckSubcategoryCd(shohinForm.getCategoryCd(), 
            shohinForm.getSubcategoryCd(), false, categoryCdFlg)) {
            subcategoryCdFlg = false;
            if (result != null) {
                result.rejectValue(prefixes + "subcategoryCd", "validation.category", new String[] {"『中分類』"}, "");            
            }

        }

・extracategoryをチェックしextracategoryCdFlgを設定。存在しないときはエラーメッセージを設定する。

        //『小分類』がextracategoryテーブルにあればtrue(削除されているものは取得しない)
        if (!dbElementsService.isCheckExtracategoryCd(shohinForm.getCategoryCd(), 
            shohinForm.getSubcategoryCd(), shohinForm.getExtracategoryCd(), false, subcategoryCdFlg)) {
            extracategoryCdFlg = false;
            if (result != null) {
                result.rejectValue(prefixes + "extracategoryCd", "validation.category", new String[] {"『小分類』"}, "");            
            }

        }

・DBエレメントを使用している場合、以下DBエレメント取得ロジックが自動作成されます。
・商品情報Formの場合、業種ID、大分類、中分類、小分類のプルダウンがDBエレメントを使用します。

        //DBエレメントを取得する
        LinkedHashMap<String, Map<Object, String>> dbELEMENTS = new LinkedHashMap<String, Map<Object, String>>();
        LinkedHashMap<String, Map<Object, String>> dbELEMENTS1;

・業種情報を対象に、業種マップをDBエレメントに追加するという処理。
・パラメータの意味
 ・getAllFlg=false:非公開は取得しない。なのだけど、公開フラグを持ってないので、公開フラグを選択するロジックはないので、設定値は無視される。
  補足:テーブルに公開フラグがない場合でもgetAllFlgパラメータは存在する。
 ・lrgMapKey="biztypeCd":dbELEMENTSに、キー"biztypeCd"で、業種マップ(キー:業種ID、データ:業種ID + ":" +業種名)を登録する。

        dbELEMENTS1 = dbElementsService.getDbEleAryLrgmidsmlBiztype(false, 
                        "biztypeCd");
        dbELEMENTS.putAll(dbELEMENTS1);

・大分類情報、中分類情報、小分類情報を対象に、大分類が選択されていないときは、大分類マップのみ、大分類が選択されてれば、さらに、中分類マップ、中分類が選択されていればさらに、小分類マップをDBエレメントに追加するという処理。
・パラメータの意味
 ・getAllFlg=false:非公開は取得しない。
  補足:テーブルに公開フラグがない場合でもgetAllFlgパラメータは存在する。
 ・categoryCd=shohinForm.getCategoryCd():設定値に関係なく、大分類情報全データ取得し、大分類マップを作成する。
 ・categoryCdFlg=先のロジックで設定:categoryCd値がDBにある時、trueとする。categoryCdFlg=trueかつ、categoryCdがnull以外の時、中分類情報全データ取得し、中分類マップを作成する。
・subcategoryCd=shohinForm.getSubcategoryCd():中分類を設定する。nullはまだ中分類が選択されていないということ。
・subcategoryCdFlg=先のロジックで設定:中分類がDBにある時、trueとする。subcategoryCdFlg=trueかつ、subcategoryCdがnull以外の時、小分類情報全データ取得し、小分類マップを作成する。
・lrgMapKey="categoryCd":dbELEMENTSに、キー"categoryCd"で、大分類マップ(キー:大分類、データ:大分類+ ":" +大分類名)を登録する。
・midMapKey="subcategoryCd":dbELEMENTSに、キー"subcategoryCd"で、中分類マップ(キー:中分類、データ:中分類+ ":" +中分類名)を登録する。
・smlMapKey="extracategoryCd":dbELEMENTSに、キー"extracategoryCd"で、小分類マップ(キー:小分類、データ:小分類+ ":" +小分類名)を登録する。

        dbELEMENTS1 = dbElementsService.getDbEleAryLrgmidsmlCategory(false, shohinForm.getCategoryCd(), categoryCdFlg, 
                        shohinForm.getSubcategoryCd(), subcategoryCdFlg, 
                        "categoryCd", "subcategoryCd", "extracategoryCd");
        dbELEMENTS.putAll(dbELEMENTS1);
        shohinForm.setDbELEMENTS(dbELEMENTS);
    }