Chapter 34

Formクラス

kazpgm
kazpgm
2022.01.11に更新

自動作成されたFormクラスを説明する。

商品情報Formクラス(ShohinForm.java)

form.ShohinForm.java

package com.kaz01u.demo.form;

import java.io.Serializable;
import java.util.Date;
import java.util.LinkedHashMap;
import java.util.Map;
import javax.validation.constraints.AssertTrue;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.stereotype.Component;
import org.springframework.util.ObjectUtils;
import org.springframework.web.multipart.MultipartFile;
import com.kaz01u.demo.utils.Elements;
import com.kaz01u.demo.utils.Functions;
import com.kaz01u.demo.utils.ValidCheck;
import com.kaz01u.demo.validation.CheckHalfLetterDigitBig;
import com.kaz01u.demo.validation.CheckHalfStartEndSpace;
import com.kaz01u.demo.validation.CheckFull;
import com.kaz01u.demo.validation.CheckFullStartEndSpace;
import com.kaz01u.demo.validation.GroupOrder1;
import com.kaz01u.demo.validation.GroupOrder2;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

・@Data:対象クラス内のインスタンス変数に対してgetter/setterでアクセスすることを可能とする。
・@NoArgsConstructor:デフォルトコンストラクタを自動生成するため使う。
・@AllArgsConstructor:フィールドに対する初期化値を引数にとるコンストラクタを自動生成するため使う。
・@Component:当クラスをSpringのDIコンテナにbeanとして登録するため使う。

@Data
@NoArgsConstructor
@AllArgsConstructor
@Component
public class ShohinForm implements Serializable {
    
    /**
     * 
     */
    private static final long serialVersionUID = 1L;

・定義エクセルのI列が固定値エレメント(当クラスでは、公開区分)のとき自動作成されます。★01

    /**
     * publicFixELEMENTSメソッド
     * Elements.ELEMENTS(固定値)から指定したキーのエレメントを戻す
     * 
     * @param str ELEMENTSのキー
     * @param dflt ”▼選択してください"や"未選択"を設定する。設定しない場合""を指定する。
     * @return ELEMENTSキー毎のコード一覧(LinkedHashMap)
     */
    public LinkedHashMap<Object, String> publicFixELEMENTS(String str, String dflt) {
        return Functions.publicELEMENTS(str, dflt, Elements.ELEMENTS);
    }

・定義エクセルのI列がDBエレメント(当クラスでは、業種ID、大分類、中分類、小分類)のとき自動作成されます。★02

    /**
     * DBから作成するELEMENTS
     */
    private LinkedHashMap<String, Map<Object, String>> DbELEMENTS;

    /**
     * publicDbELEMENTSメソッド
     * ELEMENTS(DB値)から指定したキーのエレメントを戻す
     * 
     * @param str ELEMENTSのキー
     * @param dflt ”▼選択してください"や"未選択"を設定する。設定しない場合""を指定する。
     * @return ELEMENTSキー毎のコード一覧(LinkedHashMap)
     */
    public LinkedHashMap<Object, String> publicDbELEMENTS(String str, String dflt) {
        return Functions.publicELEMENTS(str, dflt, DbELEMENTS);
    }

・定義エクセルのC,D,G,I,J,L,M列からFormクラスが自動作成されている。★03
 但し、登録日時、更新日時は画面入力しないので、対象外です。
・全項目の必須チェック及びサイズチェックを「GroupOrder1」グループで行ったのち、全項目の属性を「GroupOrder2」グループでチェックするためGroup を使用しています。これは、Controllerクラスに「@Validated({GroupOrder1.class, GroupOrder2.class}) ShohinForm shohinForm」のように定義することで実現されます。
・補足:Controllerクラスで「@Validated({GroupOrder1.class}) ShohinForm shohinForm」とすると、GroupOrder2.classのチェックは行われないので注意
・@CheckHalfLetterDigitBig、@CheckHalfStartEndSpaceなどは、validationクラスChaptersを参照してください。

    //全項目の必須チェック及びサイズチェックを「GroupOrder1」グループで行ったのち、
    //全項目の属性を「GroupOrder2」グループでチェックする。

    @Size(min = 0, max = 10, groups={GroupOrder1.class})
    @CheckHalfLetterDigitBig(groups={GroupOrder2.class})
    @CheckHalfStartEndSpace(groups={GroupOrder2.class})
    private String products = "";

    @NotBlank(groups={GroupOrder1.class})
    @Size(min = 0, max = 50, groups={GroupOrder1.class})
    @CheckFull(groups={GroupOrder2.class})
    @CheckFullStartEndSpace(groups={GroupOrder2.class})
    private String productsname = "";

    //DbELEMENTSでのチェックはControllerで行う
    @NotNull(groups={GroupOrder1.class})
    private Long biztypeCd;

    //DbELEMENTSでのチェックはControllerで行う
    @NotBlank(groups={GroupOrder1.class})
    private String categoryCd = "";

    //DbELEMENTSでのチェックはControllerで行う
    @NotBlank(groups={GroupOrder1.class})
    private String subcategoryCd = "";

    //DbELEMENTSでのチェックはControllerで行う
    @NotBlank(groups={GroupOrder1.class})
    private String extracategoryCd = "";

    @NotBlank(groups={GroupOrder1.class})
    private String openkbn1 = "1";

・定義エクセルのI列が固定値エレメント(当クラスでは、公開区分)のとき自動作成されます。★04
・Controllerクラスの@Validatedのとき、当メソッド(@AssertTrueをつけたisXXXXメソッド)も動いてチェックされます。HTMLテンプレートで、#fields.hasErrors('checkOpenkbn1')} 、th:errors="*{checkOpenkbn1}"(isを取って先頭小文字にしたものが項目名になる)が使えます。

    @AssertTrue(message="『公開区分』を正しく入力してください", groups={GroupOrder2.class})
    public boolean isCheckOpenkbn1() {
        return ValidCheck.isCheckElements("OPN_KBN", openkbn1);
    }
}

商品情報一括登録更新Formクラス(ShohinInsUpdListForm.java)

form.ShohinInsUpdListForm.java

package com.kaz01u.demo.form;

import java.io.Serializable;
import java.util.LinkedList;
import java.util.List;
import javax.validation.Valid;
import org.springframework.stereotype.Component;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

・@Data:対象クラス内のインスタンス変数に対してgetter/setterでアクセスすることを可能とする。
・@NoArgsConstructor:デフォルトコンストラクタを自動生成するため使う。
・@AllArgsConstructor:フィールドに対する初期化値を引数にとるコンストラクタを自動生成するため使う。
・@Component:当クラスをSpringのDIコンテナにbeanとして登録するため使う。

@Data
@NoArgsConstructor
@AllArgsConstructor
@Component
public class ShohinInsUpdListForm implements Serializable {
    /**
     * 
     */
    private static final long serialVersionUID = 1L;

・商品情報Formクラス(ShohinForm.java)をリストで保持する。

    /**
     * 商品情報一括登録リスト
     */
    @Valid
    private List<ShohinForm> shohinFormList = new LinkedList<ShohinForm>();
}

商品情報検索条件Formクラス(ShohinSrchForm.java)

form.ShohinSrchForm.java

package com.kaz01u.demo.form;

import java.io.Serializable;
import java.util.Date;
import java.util.LinkedHashMap;
import java.util.Map;
import javax.validation.constraints.AssertTrue;
import javax.validation.constraints.Size;
import org.springframework.context.annotation.Scope;
import org.springframework.context.annotation.ScopedProxyMode;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.stereotype.Component;
import org.springframework.util.ObjectUtils;
import com.kaz01u.demo.utils.Elements;
import com.kaz01u.demo.utils.Functions;
import com.kaz01u.demo.utils.ValidCheck;
import com.kaz01u.demo.validation.CheckHalfLetterDigitBig;
import com.kaz01u.demo.validation.CheckHalfStartEndSpace;
import com.kaz01u.demo.validation.CheckFull;
import com.kaz01u.demo.validation.CheckFullStartEndSpace;
import com.kaz01u.demo.validation.GroupOrder1;
import com.kaz01u.demo.validation.GroupOrder2;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

・@Data:対象クラス内のインスタンス変数に対してgetter/setterでアクセスすることを可能とする。
・@NoArgsConstructor:デフォルトコンストラクタを自動生成するため使う。
・@AllArgsConstructor:フィールドに対する初期化値を引数にとるコンストラクタを自動生成するため使う。
・@Component:当クラスをSpringのDIコンテナにbeanとして登録するため使う。

@Data
@NoArgsConstructor
@AllArgsConstructor
@Component
public class ShohinSrchForm implements Serializable {
    /**
     * 
     */
    private static final long serialVersionUID = 1L;

・定義エクセルのI列が固定値エレメント(当クラスでは、公開区分)のとき自動作成されます。
・重要:検索条件入力用なので、N列(検索項目順)に入力があるもののみ自動作成されます。

    /**
     * publicFixELEMENTSメソッド
     * Elements.ELEMENTS(固定値)から指定したキーのエレメントを戻す
     * 
     * @param str ELEMENTSのキー
     * @param dflt ”▼選択してください"や"未選択"を設定する。設定しない場合""を指定する。
     * @return ELEMENTSキー毎のコード一覧(LinkedHashMap)
     */
    public LinkedHashMap<Object, String> publicFixELEMENTS(String str, String dflt) {
        return Functions.publicELEMENTS(str, dflt, Elements.ELEMENTS);
    }

・定義エクセルのI列がDBエレメント(当クラスでは、業種ID、大分類、中分類、小分類)のとき自動作成されます。
・重要:検索条件入力用なので、N列(検索項目順)に入力があるもののみ自動作成されます。

    /**
     * DBから作成するELEMENTS
     */
    private LinkedHashMap<String, Map<Object, String>> DbELEMENTS;

    /**
     * publicDbELEMENTSメソッド
     * ELEMENTS(DB値)から指定したキーのエレメントを戻す
     * 
     * @param str ELEMENTSのキー
     * @param dflt ”▼選択してください"や"未選択"を設定する。設定しない場合""を指定する。
     * @return ELEMENTSキー毎のコード一覧(LinkedHashMap)
     */
    public LinkedHashMap<Object, String> publicDbELEMENTS(String str, String dflt) {
        return Functions.publicELEMENTS(str, dflt, DbELEMENTS);
    }

・定義エクセルのC,D,G,I,J,N,O列からFormクラスが自動作成されている。
・重要:当Formは検索条件入力用なので、N列(検索項目順)に入力があるもののみを対象にして、自動作成されます。商品情報はすべての項目を検索条件にしているので、すべてのN列に値が入っているけど、通常は検索したい項目にだけN列に番号を入れてください。)
・ShohinFormと違い、登録日時、更新日時でもN列にあれば条件入力するので自動作成されます。
・全項目の必須チェック及びサイズチェックを「GroupOrder1」グループで行ったのち、全項目の属性を「GroupOrder2」グループでチェックするためGroup を使用しています。これは、Controllerクラスに「@Validated({GroupOrder1.class, GroupOrder2.class}) ShohinSrchForm shohinSrchForm」のように定義することで実現されます。
補足:Controllerクラスで「@Validated({GroupOrder1.class}) ShohinSrchForm shohinSrchForm」とすると、GroupOrder2.classのチェックは行われないので注意
・@CheckHalfLetterDigitBig、@CheckHalfStartEndSpaceなどは、validationクラスChaptersを参照してください。

    //全項目の必須チェック及びサイズチェックを「GroupOrder1」グループで行ったのち、
    //全項目の属性を「GroupOrder2」グループでチェックする。

    @Size(min = 0, max = 10, groups={GroupOrder1.class})
    @CheckHalfLetterDigitBig(groups={GroupOrder2.class})
    @CheckHalfStartEndSpace(groups={GroupOrder2.class})
    private String products = "";

    @Size(min = 0, max = 50, groups={GroupOrder1.class})
    @CheckFull(groups={GroupOrder2.class})
    @CheckFullStartEndSpace(groups={GroupOrder2.class})
    private String productsname = "";

    //DbELEMENTSでのチェックはControllerで行う
    private Long biztypeCd = null;

    //DbELEMENTSでのチェックはControllerで行う
    private String categoryCd = "";

    //DbELEMENTSでのチェックはControllerで行う
    private String subcategoryCd = "";

    //DbELEMENTSでのチェックはControllerで行う
    private String extracategoryCd = "";

・定義エクセルのI列が固定値エレメント(当クラスでは、公開区分)のとき自動作成されます。
・公開区分のJ列が、”検索チェックボックス”なので、このような配列入力値のチェックPGMが自動作成されている。もしも、J列が、”検索・入力プルダウン”ならValidCheck.isCheckElements("OPN_KBN", openkbn1);のみのチェックになる。
・Controllerクラスの@Validatedのとき、当メソッド(@AssertTrueをつけたisXXXXArrayメソッド)も動いてチェックされます。HTMLテンプレートで、#fields.hasErrors('checkOpenkbn1Array')} 、th:errors="*{checkOpenkbn1Array}"(isを取って先頭小文字にしたものが項目名になる)が使えます。

    private String[] openkbn1Array = {""};
    @AssertTrue(message="『公開区分』を正しく入力してください", groups={GroupOrder1.class})
    public boolean isCheckOpenkbn1Array() {
        boolean checkFlg = true;
        for (String openkbn1 : openkbn1Array) {
            if (!ObjectUtils.isEmpty(openkbn1)) {
                checkFlg = ValidCheck.isCheckElements("OPN_KBN", openkbn1);
                if (!checkFlg) {
                    break;
                }
            }
        }
        return checkFlg;
    }

・登録日時のO列が”FromTo”なので、変数名が、項目ID + From、 項目ID + Toとなる。
・J列が"タイムスタンプ”なので、@DateTimeFormatでチェックしている。補足:@DateTimeFormatはgroups指定はできない。
・O列が”FromTo”なので、相関チェック用、isCheck + 項目ID + From + 項目ID + Toメソッドが自動作成されている。
・J列が"タイムスタンプ”なので、相関チェックに「ValidCheck.isCheckDateFromTo」メソッドを使用している。
・補足:J列がBIGINTなら「ValidCheck.isCheckNumFromTo」メソッド、以外は「ValidCheck.isCheckStrFromTo」メソッドになる。

    @DateTimeFormat(pattern = "yyyy/MM/dd")
    private Date insdtFrom;

    @DateTimeFormat(pattern = "yyyy/MM/dd")
    private Date insdtTo;

    @AssertTrue(message="『登録日時To』は『登録日時From』以上を入力してください", groups={GroupOrder2.class})
    public boolean isCheckInsdtFromInsdtTo() {
        return ValidCheck.isCheckDateFromTo(insdtFrom, insdtTo);
    }

    @DateTimeFormat(pattern = "yyyy/MM/dd")
    private Date updtFrom;

    @DateTimeFormat(pattern = "yyyy/MM/dd")
    private Date updtTo;

    @AssertTrue(message="『更新日時To』は『更新日時From』以上を入力してください", groups={GroupOrder2.class})
    public boolean isCheckUpdtFromUpdtTo() {
        return ValidCheck.isCheckDateFromTo(updtFrom, updtTo);
    }
}

タイトル行ソート順Formクラス(SrchOrderForm.java)

form.SrchOrderForm.java

package com.kaz01u.demo.form;

import java.io.Serializable;
import org.springframework.context.annotation.Scope;
import org.springframework.context.annotation.ScopedProxyMode;
import org.springframework.stereotype.Component;
import com.kaz01u.demo.validation.CheckSortOrder;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

・@Data:対象クラス内のインスタンス変数に対してgetter/setterでアクセスすることを可能とする。
・@NoArgsConstructor:デフォルトコンストラクタを自動生成するため使う。
・@AllArgsConstructor:フィールドに対する初期化値を引数にとるコンストラクタを自動生成するため使う。
・@Component:当クラスをSpringのDIコンテナにbeanとして登録するため使う。

@Data
@NoArgsConstructor
@AllArgsConstructor
@Component

・Controllerクラス・商品情報リスト一覧表示(ソート順押下)処理(mode=list_up_dwn)で指定する、sortItemName(ソート項目)
・sortOrder(ソート順)、updMode(更新するリスト一覧画面か、更新しないリスト一覧画面かのモード)を持っているFromクラス。
・SrchOrderFormクラスはすべての情報共通です。セッションスコープのSrchOrderFormは各情報ごとのクラス(商品情報のセッションスコープはSessionShohinSrchOrderForm.java)になります。
・@CheckSortOrderは、validationクラスChaptersを参照してください。

public class SrchOrderForm implements Serializable {
    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    private String sortItemName = "";
    
    @CheckSortOrder
    private String sortOrder = "";

    private String updMode = "lstMode";
}

セッションスコープ・商品情報検索条件Formクラス(SessionShohinSrchForm.java)

form.SessionShohinSrchForm.java

package com.kaz01u.demo.form;

import java.io.Serializable;
import org.springframework.context.annotation.Scope;
import org.springframework.context.annotation.ScopedProxyMode;
import org.springframework.stereotype.Component;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

・@Data:対象クラス内のインスタンス変数に対してgetter/setterでアクセスすることを可能とする。
・@NoArgsConstructor:デフォルトコンストラクタを自動生成するため使う。
・@AllArgsConstructor:フィールドに対する初期化値を引数にとるコンストラクタを自動生成するため使う。
・@Component:当クラスをSpringのDIコンテナにbeanとして登録するため使う。
・@Scope:当クラスをセッションスコープのBeanにするため使う。
・当クラスは、ControllerクラスでInjectされている。
・補足:Controllerクラスで、sessionスコープのBeanのメソッド呼び出しを行うと、セッションに格納されているオブジェクトが返却される。セッションにオブジェクトが格納されていない場合は、新たに生成されたオブジェクトが返却され、セッションにも格納される。

@Data
@NoArgsConstructor
@AllArgsConstructor
@Component
@Scope(value= "session", proxyMode = ScopedProxyMode.TARGET_CLASS)
public class SessionShohinSrchForm implements Serializable {
    /**
     * 
     */
    private static final long serialVersionUID = 1L;

・商品情報検索条件Formクラス(ShohinSrchForm.java)を変数にもつ。

    private ShohinSrchForm shohinSrchForm;
}

セッションスコープ・商品情報タイトル行ソート順Formクラス(SessionShohinSrchOrderForm.java)

form.SessionShohinSrchOrderForm.java

package com.kaz01u.demo.form;

import java.io.Serializable;
import org.springframework.context.annotation.Scope;
import org.springframework.context.annotation.ScopedProxyMode;
import org.springframework.stereotype.Component;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

・@Data:対象クラス内のインスタンス変数に対してgetter/setterでアクセスすることを可能とする。
・@NoArgsConstructor:デフォルトコンストラクタを自動生成するため使う。
・@AllArgsConstructor:フィールドに対する初期化値を引数にとるコンストラクタを自動生成するため使う。
・@Component:当クラスをSpringのDIコンテナにbeanとして登録するため使う。
・@Scope:当クラスをセッションスコープのBeanにするため使う。
・当クラスは、ControllerクラスでInjectされている。
・補足:Controllerクラスで、sessionスコープのBeanのメソッド呼び出しを行うと、セッションに格納されているオブジェクトが返却される。セッションにオブジェクトが格納されていない場合は、新たに生成されたオブジェクトが返却され、セッションにも格納される。

@Data
@NoArgsConstructor
@AllArgsConstructor
@Component
@Scope(value= "session", proxyMode = ScopedProxyMode.TARGET_CLASS)
public class SessionShohinSrchOrderForm implements Serializable {
    /**
     * 
     */
    private static final long serialVersionUID = 1L;

・タイトル行ソート順Formクラス(SrchOrderForm.java)を変数にもつ。

    private SrchOrderForm srchOrderForm;
}