본문 바로가기
JAVA/Spring

Spring MVC - 파라미터 저장법②(파라미터이름==매개변수명)

by 설총이 2018. 9. 12.





1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
@Controller
public class SearchController {
    
    //Controller로 실행되는 메서드안에 '파라미터이름 == 매개변수명' 으로 파라미터 저장하는 방법.
    @RequestMapping("/search/internal.do")
    public ModelAndView searchInternal(String query, @RequestParam("p"int pageNumber) {
        System.out.println("[/search/internal.do] query = " + query + ", pageNumber = " + pageNumber);
        return new ModelAndView("search/internal");
    }
    
    String query = "";
    @RequestMapping("/search/external.do")
    public ModelAndView searchExternal(String query, @RequestParam(value = "p", defaultValue = "1"int pageNumber) {
        System.out.println("[/search/external.do] query = " + query + ", pageNumber = " + pageNumber);
        return new ModelAndView("search/external");
    }
    
    /*
    서로 이름이 다른 p와 pageNumber는 자동저장이 안되기때문에,
    @RequestParam을 명시해서 'p'라는 name으로 전달되는 값은 'pageNumber'의 값 저장할 수 있다. (p == pageNumber)
    단, 어노테이션을 사용한 @RequestParam은 디폴트값으로 required속성이 true이기때문에 반드시 값이 있어야한다.
    만약 p라는 이름으로 전달되는 값이 없다면 null이 저장되게되는데
    int 타입인 pageNumber에는 null 저장이안되기때문에 type mismatch가 뜨면서, 400에러가 뜬다.
    그러기위해 값이 전달되면 value ="p"를 저장하고, 전달되는값이 없다면 defaultValue=""를
    따로 지정해주어야한다
    */
}
cs




1.  파라미터이름('query') == 매개변수명('query') 으로 저장


String query 라고 Controller안의 메서드의 매개변수로 변수를 선언해주면,

보내지는 parameter의 name이 query인 태그와 매칭되어 자동으로 String query에 저장된다


예제 1)

jsp에서 form submit으로 전송하게될때, 

<input type = "text" name ="query" > 라는 input 태그에 값을  'JAVA'라고 입력해서 submit을 한다면


String query = request.getParameter("query")로 꺼내 저장하던 과정을 

Controller안의 메서드의 매개변수로 바로 변수 선언하면

이 과정이 생략된채로 바로 query안에 == 'JAVA'라는 값이 저장되게 된다.


예제 2)

전송하는 URL경로에서 /search/XXXXX.do?query=JAVA 로 입력해도 위와 마찬가지의 결과가된다.



2. 파라미터이름('p') == 매개변수명 ('pageNumber')


파라미터 이름과 매개변수명을 다르게 값을 저장해주고 싶다면

서로 이름이 다른 p와 pageNumber는 자동저장이 안되기때문에,

@RequestParam(value="p") int PageNumber 라고 지정해줄 수 있다.



단,


어노테이션을 사용한 @RequestParam은 디폴트값(default)으로 

'required' 속성 'true'이기때문에 반드시 값이 있어야한다.


만약 p라는 이름으로 전달되는 값이 없는걸로 저장하고싶다면

required속성을 false로 걸어주면된다. 


그러나 또 주의할점은 이럴때는 null이 저장되게되는데

int 타입인 pageNumber에는 null 저장이안되기때문에 type mismatch가 뜨면서, 400에러가 뜬다.


그러기위해

값이 전달되면 == value ="p"를 저장하고,

전달되는값이 없다면 == defaultValue="?"를 따로 지정해줘서 분기 처리해야한다