自動作成された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);
}