본문 바로가기

Server Oriented/Spring

스프링 Controller Step 2, request 파라미터 수용(매핑시)

(웹브라우저 주소창에 입력 및 실행되면)

웹서버 URL 호출시의 파라미터를 전달받는 것.

 

<a th:href="@{/aaa/varN}">클릭</a>

@GetMapping("/aaa/{var}")

public String methodA(String var){ ... }

- 하나의 변수로 인정

- methodA 에서 int var 하였으면, 수치로 인식. 수치가 입력되지 않으면 에러

 

<a th:href="@{/aaa/var1N/var2N}">클릭</a>

@GetMapping("/aaa/{var1}/{var2}")

public String methodA(

  @PathVariable String var1,

  @PathVariable String var2

){ ... }

- 변수 여럿이면 파라미터도 여럿

- @GetMapping 에 기술된 var1 과 var2 의 순서와 다르게

  methodA 에 String var2, String var1 과 같이 하여도

  명칭으로 매칭을 함

- GetMapping 에서 변수 처리한 명칭과 다른 파라미터명을 지정하려면,

   @PathVariable("var1") String param1 과 같이 처리


<a th:href="@{/aaa?k1=v1&k2=v2}">클릭</a>

또는

<form th:action="@{/aaa}"><!-- method="get" 과 method 를 기술하지 않은 것은 동일 -->

 <input name="k1" value="v1">

 <input name="k2" value="v2">

 <label><input type="radio" name="k3" value="v3-1">v3-1</label>

 <label><input type="radio" name="k3" value="v3-2">v3-2</label>

 <select name="k4">

  <option value="v4-1">v4-1</option>

  <option value="v4-2">v4-2</option>

 </select>

 <label><input type="checkbox" name="k5" value="v5-1></lable>

 <label><input type="checkbox" name="k5" value="v5-2></lable>

 <textarea name="k6">v6</textarea>

 <input type="submit" value="클릭"><!-- <button type="submit">클릭</button> 과 동일 -->

</form>

@GetMapping("/aaa")

public String methodA(String k1, String k2){ ... }

- form 태그 안에 있는 input name (또는 th:href 의 key) 과 methodA 의 parameter 명이 같으면 연결.

- form 태그 안에 있는 input name (또는 th:href 의 key) 이라도 methodA 에 파라미터가 없으면 연결되지 않음

- form 태그 안에 있는 input name (또는 th:href 의 key) 이 기술된 위치나,

  methodA 에서 기술된 파라미터의 순서와 무관, 오로지 name(key) 가지고 매칭

- 명칭의 대소문자를 구분하여 매칭하므로 다르면 매칭되지 않음

- v1 이 숫자값 이라도 methodA 에서 String 으로 정의되면 String 으로 인식.

- methodA String 파라미터에 해당하는 항목이 form 태그 안에 없으면 null 로 세팅

- methodA int 파라미터에 해당하는 항목이 form 태그 안에 기술되지 않았거나, 값이 숫자가 아니면 에러

- methodA 에서 String k3 정의했으면, k3 에 'v3-1' 이나 'v3-2' 등 선택한 값이 들어온다

- methodA 에서 String k4 정의했으면, k4 에 'v4-1' 이나 'v4-2' 등 선택한 값이 들어온다

- <select name="k4 multiple> ... </select> 이었을 때..

methodA 에서 String 으로 받았으면 'v4-1, v4-2' 으로 세팅,

methodA 에서 String[] arr 로 받았으면 arr[0] 에 첫번째 선택값, arr[1] 에 두번째 선택값 세팅,

methodA 에서 ArrayList<String> arr 로 받으면, null 은 아닌데 size()==0. (내가 뭘 잘 못 했나..)

List<String> 으로 받으면 인터페이스인 List 로는 Error.

이 때 null 인 경우에 대한 처리가 필요

- checkbox 가 체크되지 않은 채로 넘어오면 null, 선택된 채로 넘어오면 checkbox 의 value 에 세팅했던 값이 넘어옴.

- checkbox 의 name 이 동일하면서 여러개가 세팅된 경우, select multiple 과 동일한 결과

- input 태그 값이 true/false 인 경우, methodA 에서 boolean 으로 값을 받아올 수 있음

- textarea 도 String 으로 파라미터 매칭하여 사용


<form th:action="@{/aaa}" method="post">

 <input name="k1" value="v1">

 <input name="k2" value="v2">

 <input type="submit" value="클릭">

</form>

@PostMapping("/aaa")

public String methodA(String k1, String k2){ ... }

- post 라는 것을 빼면, 위에 설명된 내용과 동일

- PathVariable 은 생략 가능


<form th:action="@{/aaa}" method="post">

 <input type="text" name="in1">

 <input type="password" name="in2">

 <input type="submit" value="클릭">

</form>

@PostMapping("/aaa")

public String methodA(ClassA ins){

  log.info(ins.getIn1());

  log.info(ins.getIn2());

}

class ClassA{

  String in1;

  String in2;

}

- Class 로 파라미터를 받더라도, ins 가 null 값인 경우가 생김

 

<form th:action="@{/aaa}" method="post">

 <input type="text" name="in1">

 <input type="password" name="in2">

 <input type="text" name="in3">

 <input type="submit" value="클릭">

</form>

@PostMapping("/aaa")

public String methodA(ClassA ins, int in3){

  log.info(ins.getIn1());

  log.info(ins.getIn2());

  log.info(ins.getIn3()); // in3 파라미터와 동일 값

  log.info(in3); // ins.getIn3() 와 동일 값

}

class ClassA{

 

  String in1;

  String in2;

  int in3;

}

- 명칭 매칭이 정상적이면 methodA 의 파라미터 순서와 상관 없이 명칭으로만 매칭.

- public String methodA(int in3, ClassA ins){ ... } 도 상기와 동일. 순서 무관.

- ClassA.in3 를 String 으로 정의하고, methodA(String in3, ClassA ins) 와 같이 세팅해도 됨.


<input name="ccc.ddd">

이라면

@public methodA(ClassB b){

  ClassC c = b.getCcc()

  log.info(c.getDdd());

}

class ClassB{

  private ClassC ccc;

}

class ClassC{

  private String ddd;

}

 

<input name="c[0].d1">

<input name="cs[0].d2">

<input name="cs[1].d1">

<input name="cs[1].d2">

이라면

@public methodA(ClassB b){

  List<ClassC> cs = b.getC()

  if(c!=null{

    for(int i=0,s=cs.size(); i<s; i++){

      ClassC c = cs.get(i);

      log.info(c.getD1());

      log.info(c.getD2());

    }

  }

 

}

class ClassB{

  private List<ClassC> c;

}

class ClassC{

  private String d1;

  private String d2;

}


<form th:action="@{/aaa}" method="post">

 <input name="date1" value="20221004"><!-- yyyyMMdd 패턴 -->

 ...

</form>

@PostMapping("/aaa")

public String methodA(ClassA ins, String date1){

  log.info(ins.getDate1());  // 2022-10-04 형식. DateTimeFormat 이 패턴대로 인식해서 LocalDate 대로

  log.info(date1);                 // 20221004 형식. form 태그에 입력된 그대로

}

@Getter @Setter @ToString

class ClassA{

  @DateTimeFormat(pattern="yyyyMMdd")

  private LocalDate date1;

}

- class 에 일자 패턴 정의

 

public String methodA(ClassA ins, @DateTimeFormat(pattern="yyyyMMdd") LocalDate date1){

  log.info(ins.getDate1());  // 20221004 형식.  form 태그에 입력된 그대로

  log.info(date1);                 // 2022-10-04 형식. DateTimeFormat 이 패턴대로 인식해서 LocalDate 대로

}

@Getter @Setter @ToString

class ClassA{

  private String date1;

}

- method 에 일자 패턴 정의

 

<input name="date1" value="2022-10"><!-- yyyy-MM 가 YearMonth 의 디폴트 패턴 -->

public String methodA(ClassA ins){

  log.info(ins.getDate1()); // 2022-10 형식

}

class ClassA{

  private YearMonth date1;

}

- YearMonth 타입은 @DateTimeFormat 사용 불가