public String main2(@RequestParam(name="year", required=false) String year) {
//name : 파라미터 이름, required : 필수 여부
public String main2(String year) {
http://localhost/ch2/requestParam ---->> year=null
http://localhost/ch2/requestParam?year= ---->> year=""
http://localhost/ch2/requestParam?year ---->> year=""
//입력하지 않아도, 값이 비어 있어도 괜찮다
=======================================================================
public String main3(@RequestParam(name="year", required=true) String year) {
//필수로 입력해야한다
public String main3(@RequestParam String year) {
http://localhost/ch2/requestParam3 ---->> year=null 400 Bad Request.
// required=true라서 꼭 넣어줘야함. 클라이언트 에러
http://localhost/ch2/requestParam3?year ---->> year=""
//값이 넘어온 걸로 본다
=======================================================================
public String main8(@RequestParam(required=false) int year) {//필수 입력 x
// http://localhost/ch2/requestParam8
---->> 500 java.lang.IllegalStateException:
//아무것도 안 넣으면 null, null을 int로 변환할 수 없다
// http://localhost/ch2/requestParam8?year
---->> 400 Bad Request
//값을 안넣으면 빈 문자열"", 빈 문자열을 int로 바꿀 수 없다, 값을 잘못 넣은 클라이언트 잘못
- 필수 입력이 아닌 경우 defaultValue를 꼭 정의해야한다
- 필수 입력인 경우 예외 처리를 꼭 해줘서 올바른 값을 입력할 수 있도록 해야한다
@ExceptionHandler(Exception.class) public String catcher(Exception ex){ ex.printStackTrace(); return "yoilError";
public String main(@ModelAttribute("myDate") MyDate date, Model m) {
// 아래와 동일, 아래는 key부분 생략, 자동으로 첫 글자를 소문자로 바꿔서 지정해준다
public String main(@ModelAttribute MyDate date, Model m) {
// @ModelAttribute사용, 반환 타입은 String, 모델에 따로 저장할 필요가 없음
//@ModelAttribute 덕분에 MyDate를 저장안해도 됨. View로 자동 전달됨.
//"myDate"에 date 자동 저장
m.addAttribute("myDate", date); //필요없음
=============================================================
//반환타입에 적용, 함수의 호출 결과를 모델에 저장한다.
//key는 "yoil"
private @ModelAttribute("yoil") char getYoil(MyDate date) {
// "yoil"에 yoil 자동 저장
m.addAttribute("yoil", yoil);//필요없음
컨트롤러 메서드가 선언되어 있을 때 메서드를 url로 호출하면
Map형식으로 구성이 되면서 @ModelAttribute로 인해 모델에 값이 String으로 저장된다
해당 모델에 저장된 데이터들은 int형으로 저장되기 때문에 중간에 String 데이터를 int형으로 바꿔주는 작업이 필요하다
이때 WebDataBinder 가 사용된다
- 입력된 값들을 하나하나 읽어 타입이 다른 경우 타입을 변환하여 BindingResult에 저장한다
- 그 값이 해당 변수가 가질 수 있는 값인지, 예를 들어 month 값이 1부터 12 사이인지 검증하여 BindingResult에 저장한다
- BindingResult를 controller에 전달히여 그 값을 이용해서 처리를 한다
public String main(@ModelAttribute MyDate date, BindingResult result){