(웹브라우저 주소창에 입력 및 실행되면)
웹서버 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 사용 불가
'Server Oriented > Spring' 카테고리의 다른 글
스프링 뷰, 타임리프 form 과 결과 (0) | 2022.10.14 |
---|---|
스프링 build.gradle 수정후 반드시 실행 (0) | 2022.10.13 |
스프링 Controller Step 3, response 할당(View, RESTful) (1) | 2022.09.30 |
스프링 Controller Step 1, request 할당 (Annotation Mapping) (0) | 2022.09.28 |
스프링 Lombok Annotations, @Getter @Setter @ToString (0) | 2022.09.27 |