SpringBoot + Thymeleaf로 상관 확인

Springboot의 Bean Validation을 사용하여 항목 간의 상관 검사를 구현합니다.

이 기사에서는 기간을 입력하는 페이지에서 종료일이 시작일보다 작은 경우를 확인해 봅니다.

상관 검사를 할 때 @AssertTrue 어노테이션 사용

1. 환경
Eclipse 4.7(Oxygen)
자바 8
springBootVersion = '1.5.13.BUILD-SNAPSHOT'

2. 구성
├─java
│  └─com
│      └─stone
│          └─check
│                  HeloController.java
│                  SampleCheckApplication.java
│                  SampleForm.java
│                  ServletInitializer.java
└─resources
    │  application.properties
    ├─static
    └─templates
            index.html
            top.html

3.form

SampleForm.java
import javax.validation.constraints.AssertTrue;
import lombok.Data;
@Data
public class SampleForm {
    private int startdate;
    private int enddate;
    @AssertTrue(message="開始日は終了日以前を入力してください。")
    public boolean isDateValid() {
        if (enddate >= startdate) return true;
        return false;
    }
}

포인트
@AssertTrue 어노테이션을 붙여 boolean 형의 메소드를 작성합니다. 메소드의 최초는 「is」를 붙여 둡니다.

4.Controller

HeloController.java
import javax.validation.Valid;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@Controller
public class HeloController {

    @RequestMapping(value = "/", method = RequestMethod.GET)
    public String index(
            @ModelAttribute("form") SampleForm form,
            Model model){
        form.setStartdate(20180401);
        form.setEnddate(20180401);
        return "index";
    }
    @RequestMapping(value = "/check", method = RequestMethod.POST)
    public String check(
            @ModelAttribute("form") @Valid SampleForm form,
            BindingResult result, Model model) {
        if (result.hasErrors()) {
            model.addAttribute("errmsg", "エラーがあります。修正してください。");
            return "index";
        }
        return "top";
    }
}

첫 페이지(index.html)에서 기간을 입력하고 오류가 있는 경우 페이지에 오류를 설정하고 다시 그리며 오류가 없으면 다음 페이지(top.html)로 전환합니다.

포인트

화면이 Post 되었을 경우의 메소드의 인수의 폼 오브젝트에 「 @Valid 」 어노테이션을 붙여, BindingResult 클래스로 validation 를 바인드 합니다.
@ModelAttribute("form") @Valid SampleForm form,
            BindingResult result

5.thymeleaf
(1)index.html

index.html
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org">
    <head>
        <title>Springboot</title>
        <meta charset="utf-8" />
    </head>
    <body>
        <form th:object="${form}" th:action="@{/check}" th:method="post">
            <!-- 入力に何かのエラーがあった場合のメッセージを表示する。 -->
            <p th:if="${errmsg} != null" th:text="${errmsg}" style="color:red;"></p>
            <label>開始日</label>
            <input type="text" th:field="*{startdate}"/>
            <label>終了日</label>
            <input type="text" th:field="*{enddate}"/>
            <!-- 期間チェックのエラーメッセージを表示する。 -->
            <p th:if="${#fields.hasErrors('dateValid')}" th:errors="*{dateValid}" style="color:red;"></p>
            <button type="submit">チェック</button>
        </form>
    </body>
</html>

포인트
전반적인 오류는 컨트롤러에 설정된 "errmsg"의 값을 표시합니다.
기간 체크 에러는, @asserttrue 의 메소드명의 is 이후의 항목명이 변수명이 되어 있습니다. (이번은, isDateValid로 했으므로 「dateValid」라고 하는 에러 변수명에 에러가 들어가 있습니다.

(2) top.html

top.html
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org">
    <head>
        <title>Springboot</title>
        <meta charset="utf-8" />
    </head>
    <body>
        <p>チェックOKです。</p>
    </body>
</html>

실행해 보겠습니다.



종료일을 시작일보다 작게 해 보았습니다.



올바른 입력으로 해 봅시다.


상관 체크의 구현은 다른 방법도 여러 가지 있는 것 같습니다만, @assertrue 가 제일 간단하다고 생각합니다.

좋은 웹페이지 즐겨찾기