Spring 5プログラミング入門12章


MVC2


情報


スプリングが基本文字列またはメッセージを出力すると、JSPにハードコーディングが表示されます.
このような大きな繰り返しで使用されるハードコーディングを直接使用すると、同じ文字長を変更するときに問題が発生します.
ハードコーディングされたコードをすべて見つけて変更するからです.
(intellijでコードすると、直接全部見つけて交換するのは難しくありません.)
src/main/resourcesでメッセージフォルダを作成し、フォルダにタグを付けます.propertiesファイルを生成します.
	@Bean
	public MessageSource messageSource() {
		ResourceBundleMessageSource ms = 
				new ResourceBundleMessageSource();
		ms.setBasenames("message.label");
		ms.setDefaultEncoding("UTF-8");
		return ms;
	}
スプリング設定に追加します.
Property値としてメッセージを送信します.labelが提供され、メッセージパッケージに属するlabel propertyファイルからメッセージを読み出すように設定されます.
空のIDをMessageSourceに生成する必要があります.
<%@ taglib prefix="form"uri="http://www.springframework.org/tags/form "%>
<%@ taglib prefix="spring"uri="http://www.springframework.org/tags "%>
jsp上部にメッセージを入力し、として出力することができる.
国によってメッセージを指定することもできます.
labelko.properties
label_en.properties
Labelの後ろに言語形式の接尾辞を付けて、koは韓国語で、enは英語でいいです.

カスタムオブジェクトの検証とエラーコードの指定

public interface Validator {
	boolean supports(Class<?> clazz);
	void validate(@Nullable Object target, Errors errors);

}
Springでサポートされている検証オブジェクトのインタフェース.
supportsはbooleanタイプで、検証できるかどうかを教えてくれます.
targetは検証するデータを入力すればよく、errorにはエラー結果が含まれていればよい.
//컨트롤러 클래스
@Controller
public class RegisterController {

	private MemberRegisterService memberRegisterService;

	public void setMemberRegisterService(
			MemberRegisterService memberRegisterService) {
		this.memberRegisterService = memberRegisterService;
	}

	@RequestMapping("/register/step1")
	public String handleStep1() {
		return "register/step1";
	}

	@PostMapping("/register/step2")
	public String handleStep2(
			@RequestParam(value = "agree", defaultValue = "false") Boolean agree,
			Model model) {
		if (!agree) {
			return "register/step1";
		}
		model.addAttribute("registerRequest", new RegisterRequest());
		return "register/step2";
	}

	@GetMapping("/register/step2")
	public String handleStep2Get() {
		return "redirect:/register/step1";
	}

	@PostMapping("/register/step3")
	public String handleStep3(RegisterRequest regReq, Errors errors) {
		new RegisterRequestValidator().validate(regReq, errors);
		if (errors.hasErrors())
			return "register/step2";

		try {
			memberRegisterService.regist(regReq);
			return "register/step3";
		} catch (DuplicateMemberException ex) {
			errors.rejectValue("email", "duplicate");
			return "register/step2";
		}
	}

}
//검증 클래스
public class RegisterRequestValidator implements Validator {
	private static final String emailRegExp = 
			"^[_A-Za-z0-9-\\+]+(\\.[_A-Za-z0-9-]+)*@" +
			"[A-Za-z0-9-]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})$";
	private Pattern pattern;

	public RegisterRequestValidator() {
		pattern = Pattern.compile(emailRegExp);
		System.out.println("RegisterRequestValidator#new(): " + this);
	}

	@Override
	public boolean supports(Class<?> clazz) {
		return RegisterRequest.class.isAssignableFrom(clazz);
	}

	@Override
	public void validate(Object target, Errors errors) {
		System.out.println("RegisterRequestValidator#validate(): " + this);
		RegisterRequest regReq = (RegisterRequest) target;
		if (regReq.getEmail() == null || regReq.getEmail().trim().isEmpty()) {
			errors.rejectValue("email", "required");
		} else {
			Matcher matcher = pattern.matcher(regReq.getEmail());
			if (!matcher.matches()) {
				errors.rejectValue("email", "bad");
			}
		}
		ValidationUtils.rejectIfEmptyOrWhitespace(errors, "name", "required");
		ValidationUtils.rejectIfEmpty(errors, "password", "required");
		ValidationUtils.rejectIfEmpty(errors, "confirmPassword", "required");
		if (!regReq.getPassword().isEmpty()) {
			if (!regReq.isPasswordEqualToConfirmPassword()) {
				errors.rejectValue("confirmPassword", "nomatch");
			}
		}
	}

}
コントローラクラスで、supports()メソッドは、パラメータに渡されたclazzオブジェクトがRegisterRequestクラスに変換できるかどうかをチェックします.
REECTIFEmptyOrWhitespace-スペース、null、または空の文字列.
REECTIFEmpty-空または空
errors.hasErrors()メソッドを使用して、エラーが存在するかどうかを確認します.
グローバルオブジェクトの場合、プレゼンテーションを使用できる大規模なバージョンに応じて、検証範囲を指定できます.
彼はクマンドのPropertyにアニメーションを作成すればいいと言った.

バージョンごとに異なるので、使用したい説明をバージョンごとに検索したほうがいいです.