본문 바로가기
웹/Spring, Django

[Spring]Request Parameter/Validation

by stubborngastropod 2023. 5. 11.
728x90

Request Parameter

request parameter로 속성을 담아서 /confirm url로 전송. 입력 부분을 Form으로 대체 가능

package com.example.demo.controller;

import com.example.demo.form.Form;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;

import java.time.LocalDate;

@Controller
public class RequestParamController {
    @GetMapping("show")
    public String showView() {
        return "entry";
    }

//    @PostMapping("confirm")
//    public String confirmView(
//            Model model, @RequestParam String name, @RequestParam Integer age,
//            @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) @RequestParam LocalDate birth
//    ) {
//        model.addAttribute("name", name);
//        model.addAttribute("age", age);
//        model.addAttribute("birth", birth);
//
//        return "confirm";
//        }
    @PostMapping("confirm")
    public String confirmView(Form f) {
        return "confirm2";
        }
    }
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>INPUT</title>
</head>
<body>
<form th:action="@{/confirm}" method="post">
    <div>
        <label for="name">NAME: </label>
        <input type="text" name="name">
    </div>
    <div>
        <label for="age">AGE: </label>
        <input type="number" name="age" min="1" max="100">
    </div>
    <div>
        <label for="birth">BIRTH: </label>
        <input type="date" name="birth">
    </div>
    <input type="submit" value="SUBMIT">
</form>
</body>
</html>
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>CONFIRM</title>
</head>
<body>
  <ul>
    <li>NAME: [[${name}]]</li>
    <li>AGE: [[${age}]]</li>
    <li>BIRTH: [[${birth}]]</li>
  </ul>
</body>
</html>

<!-- ---------------------- -->

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
  <meta charset="UTF-8">
  <title>CONFIRM WITH TITLE</title>
</head>
<body>
<ul>
  <li>NAME: [[${form.name}]]</li>
  <li>AGE: [[${form.age}]]</li>
  <li>BIRTH: [[${form.birth}]]</li>
</ul>
</body>
</html>

url에 따른 페이지 반환

package com.example.PathVariableSample.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;

@Controller
public class PathVariableController {
    @GetMapping("show")
    public String showView() {
        return "show";
    }

    @GetMapping("/function/{no}")
    public String selectFunction(@PathVariable Integer no) {
        String view = null;
        switch (no) {
            case 1:
                view = "pathvariable/function1";
                break;
            case 2:
                view = "pathvariable/function2";
                break;
            case 3:
                view = "pathvariable/function3";
                break;
        }
        return view;
    }

    @PostMapping(value = "send", params = "a")
    public String showAView() {
        return "submit/a";
    }
    @PostMapping(value = "send", params = "b")
    public String showBView() {
        return "submit/b";
    }
    @PostMapping(value = "send", params = "c")
    public String showCView() {
        return "submit/c";
    }

}
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>SHOW</title>
</head>
<body>
<div>
    <h3><a th:href="@{/function/1}">FUNCTION 1</a></h3>
    <h3><a th:href="@{/function/2}">FUNCTION 2</a></h3>
    <h3><a th:href="@{/function/3}">FUNCTION 3</a></h3>

    <form th:action="@{/send}" method="post">
        <input type="submit" value="BUTTON A" name="a">
        <input type="submit" value="BUTTON B" name="b">
        <input type="submit" value="BUTTON C" name="c">
    </form>
</div>
</body>
</html>

Request Parameter에 따라 위 구조의 뷰 파일로 이동한다.

Validation

입력 내용이 요건에 만족하는지 타당성을 확인하는 입력 체크. 단일 항목 검사/상관 항목 검사로 나뉨

  • 입력 체크를 위한 어노테이션: Bean Validation, Hibernate Validator 등
package com.example.demo.form;

import lombok.Data;
import org.hibernate.validator.constraints.Range;

import javax.validation.constraints.NotNull;

@Data
public class CalcForm {
    @NotNull
    @Range(min=1,max=10)
    private Integer leftNum;

    @NotNull
    @Range(min=1,max=10)
    private Integer rightNum;
}
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title th:text="#{title.entry}">INPUT</title>
</head>
<body>
<form th:action="@{/calc}" method="post" th:object="${calcForm}">
    <ul th:if="${#fields.hasErrors('*')}">
        <li th:each="err:${#fields.errors('*')}" th:text="${err}"></li>
    </ul>
    <div>
        <input type="text" th:field="*{leftNum}">
        +
        <input type="text" th:field="*{rightNum}">
    </div>
    <button type="submit" th:text="#{button.send}"></button>
</form>
</body>
</html>
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>CONFIRM</title>
</head>
<body>
  <h2>RESULT</h2>
<h3>[[${calcForm.leftNum}]]+[[${calcForm.rightNum}]]=[[${result}]]</h3>
</body>
</html>

위의 계산 프로그램에서 어노테이션에 의한 에러메시지는 resources의 messages.properties, ValidationsMessages.properties에서 관리한다.

// messages.properties
title.entry = 입력 화면
button.send = 계산

calcForm.leftNum = 왼쪽
calcForm.rightNum = 오른쪽
//ValidationMessages.properties
javax.validation.constraints.NotNull.message={0}: 숫자를 입력해주세요
org.hibernate.validator.constraints.Range.message={0}: {min}~{max} 범위의 숫자를 입력해주세요.

typeMismatch.java.lang.Integer={0}은 정수를 입력해주세요.

유효성 검사 성공 여부에 따라 properties 파일에 저장된 에러메시지가 출력된다.

자신이 원하는 제약을 만들어 커스텀 유효성 검사기를 사용할 수도 있다.

//CalcValidator.java
package com.example.demo.validator;

import com.example.demo.form.CalcForm;
import org.springframework.stereotype.Component;
import org.springframework.validation.Errors;

import org.springframework.validation.Validator;
//org.springframework의 라이브러리를 import하도록 주의

@Component
public class CalcValidator implements Validator {
    @Override
    public boolean supports(Class<?> clazz) {
        return CalcForm.class.isAssignableFrom(clazz);
    }

    @Override
    public void validate(Object target, Errors errors) {
        CalcForm form = (CalcForm) target;

        if (form.getLeftNum() != null && form.getRightNum() != null) {
            if (!((form.getLeftNum() % 2 == 1) && (form.getRightNum() == 0))) {
                errors.reject("com.example.demo.validator.CalcValidator.message");
            }
        }
    }
}
//컨트롤러에 추가
@Autowired
    CalcValidator calcValidator;

    @InitBinder("calcForm")
    public void initBinder(WebDataBinder webDataBinder){
        webDataBinder.addValidators(calcValidator);
    }
//messages.properties
com.example.demo.validator.CalcValidator.message=왼쪽에는 홀수를, 오른쪽에는 짝수를 입력해주세요.

 

validator의 조건에 따라 위와 같은 에러 메시지가 출력된다.

유효성 검사는 순서에 관계없이 무작위로 출력되는데, 이를 관리해주기 위해서 @GroupSequence 어노테이션을 사용할 수 있다.

728x90

' > Spring, Django' 카테고리의 다른 글

[Spring]Service  (1) 2023.05.15
[Spring]Application-CRUD  (0) 2023.05.12
[Spring]Thymeleaf 문법, Layout  (0) 2023.05.10
[Spring]JDBC/MVC Model  (0) 2023.05.09
[Spring]DI/AOP  (0) 2023.05.04

댓글