[spring] 컨트롤러 및 맵핑 (Controller, RequestMapping)
by mini_min[spring] 컨트롤러 및 맵핑 (Controller, RequestMapping)
✔️ @Controller
대표적인 스트레어 타입 애노테이션
요청을 받으려면 무~조~건 컨트롤러 있어야함
: 컨트롤러의 역할을 한다고 명시한다.
컨트롤러는 필요한 비즈니스 로직을 호출하여 처리 결과 (model) 과 처리 결과를 출력할 view 정보를 DispatcherServlet 에 반환한다.
: 빈으로 등록한다.
: @Component 의 구체화된 애노테이션으로 클래스에 붙인다.
: 빈 이름을 지정하지 않으면, 클래스의 첫 문자를 소문자로 바꾼것이 빈의 이름으로 빈을 등록한다.
✨ 빈이름이 중복적이면 에러가 발생한다.
✔️ @RequestMapping
: 요청에 대해 어떤 Controller, 어떤 메소드가 처리할지를 매핑하기 위한 애노테이션이다.
url 을 클래스 또는 메소드와 맵핑 시켜주는 역할을 한다.
: 모든 HTTP Request method 를 매핑할 수 있다.
: 따로 HTTP Method 를 설정하지 않으면 모든 메소드를 허용한다.
: Ant 스타일의 패턴을 지원한다. (? : 1개의 문자와 매칭, * : 0개 이상의 문자와 매칭 등)
: 상위 클래스에서 정의되어 있는 경우, 하위 클래스에서 재정의하지 않으면 상위 클래스 것을 그대로 상속한다.
✨ value 속성만 있으면 생략 가능하다.
✨ name 속성은 이름을 말하며, 주소가 아니다. 이름=주소 아님!!
📓 옵션
value = URL 값으로 매핑 조건을 부여한다.
method = HTTP Request 메소드 값을 매핑 조건으로 부여
params = HTTP Request 파라미터를 매핑 조건으로 부여
name = 매핑에 이름을 지정한다.
✔️ 컨트롤러 메소드의 리턴 타입 - ModelAndView 객체
: 처리 결과를 담은 model 객체와 View 정보를 해당 객체에 담아 반환한다.
해당 클래스는 컨트롤러의 처리 결과를 보여줄 뷰와 전달 값을 저장하는 용도로 사용한다.
(String viewName) 을 쓰면 view 이름을 설정하여 객체를 생성한다.
📓 주요 메소드
addObject() : 뷰에 전달할 값(모델) 설정
addAllObject() : 모델map 에 추가된 모든 속성을 모델로 설정
✔️ 컨트롤러 메소드의 리턴 타입 - String, Model 등
1) String
뷰의 이름을 반환한다.
2) Model, ModelMap
처리 결과를 Model 객체에 담아 반환한다.
모델은 인터페이스이며, ModelMap 은 클래스로 사용방법은 유사하다.
URL 이 "/hello/main" 인 경우 뷰의 이름은 "hello/main" 이 된다.
3) void
메소드의 인수로 HttpServletResponse 파라미터가 존재하지 않는 경우
4) Map
처리 결과를 Map 객체에 담아 반환한다.
5) view
View 객체를 직접 반환한다. 해당 뷰 객체를 이용하여 뷰를 생성한다.
👩💻 ex01 예제
✨ Controller 의 빈 이름은 클래스의 첫문자만 소문자로 바꾼 "userController"
✨ 리턴타입 String인 경우 리턴값은 뷰의 이름이 된다.
✨ model 객체 : 인자 가로속에 Model model 인자 넣으면 알아서 객체 넘겨줘서 new 생성 안해도 괜찮음
@Controller //빈이름 - userController
public class UserController {
@RequestMapping("/ex01/main") //get과 post 방식 모두 처리
public String main() {
return "ex01/main"; //포워딩과 동일하다. 리턴타입 String인 경우 리턴값은 뷰의 이름이 된다.
}
//GET 방식만 처리~
@RequestMapping(value="/ex01/request", method= RequestMethod.GET)
public ModelAndView submit1(String name, int age) {
//포워딩해야하는 jsp 이름
ModelAndView mav = new ModelAndView("ex01/main");
String s = "<p>GET 방식으로 접근</p>";
String a = "<p>이름: " + name + ", 나이 : " + age + "</p>";
//req.setAttribute("이름", 값) 역할!
//req 는 톰캣에 의존. 아래는 자바기반
mav.addObject("msg", s);
mav.addObject("result", a);
return mav;
}
//POST 방식만 처리 - 메소드가 위에 꺼랑 다르니까 주소 동일해도 괜찮음
@RequestMapping(value="/ex01/request", method= RequestMethod.POST)
public String submit2(User dto, Model model) {
String s = "<p>POST 방식으로 접근</p>";
String a = dto.getAge() >= 19? "성인" : "미성년자";
//req.setAttribute("이름", 값) 역할!
//가로속에 Model model 인자 넣으면 알아서 객체 넘겨줘서 new 생성 안해도 괜찮음
model.addAttribute("msg", s);
model.addAttribute("result", a);
model.addAttribute("dto", dto);
return "ex01/main";
}
}
👩💻 ex02 예제
✨ 이름이 같은 빈 객체가 있으면, 앞에 패키지명 붙이면 구분이 쉽다 . @Controller("ex02.userController")
@Controller("ex02.userController")
@RequestMapping("/ex02/*")
public class UserController {
//@RequestMapping(value="request", method = RequestMethod.GET)
@GetMapping("request")
public ModelAndView form() {
return new ModelAndView("ex02/write"); //포워딩
}
//@RequestMapping(value="request", method = RequestMethod.POST)
@PostMapping("request")
public ModelAndView submit(String num) { //int num도 가능
ModelAndView mav = new ModelAndView();
String result = "";
try {
int n = Integer.parseInt(num);
int s = 0;
for(int i=1; i<=n; i++) {
s += i;
}
result = "1~" + num + "까지의 합 : " + s;
} catch (Exception e) {
return new ModelAndView("redirect:/ex02/error"); //리다이렉트
}
mav.setViewName("ex02/result"); //뷰 이름 (jsp이름)
mav.addObject("msg", result);
return mav;
}
@RequestMapping("error")
public ModelAndView error() {
return new ModelAndView("ex02/error");
}
}
👩💻 ex03 예제
✨ Map 객체로 반환하기
✨ Model 인터페이스를 리턴 타입으로 반환
✨ req.setAttribute()를 이용하여 값 전달
@Controller("ex03.userController")
@RequestMapping("ex03/*")
public class UserController {
@RequestMapping("main")
public String main() {
return "ex03/hello";
}
@RequestMapping("hello")
public void hello1(HttpServletResponse res) throws Exception {
res.setContentType("text/html; charset=utf-8");
PrintWriter out = res.getWriter();
out.print("<html><body>");
out.print("void 리턴 타입");
out.print("</body></html>");
}
@RequestMapping("hello2")
public Map<String, Object> hello2(){
Map<String, Object> map = new HashMap<String, Object>();
map.put("msg", "Map 인터페이스를 리턴 타입으로 반환");
//뷰의 이름은 url 이 "/ex03/hello2" 이므로 "ex03/hello2"
return map;
}
@RequestMapping("hello3")
public Model result() {
Model model = new ExtendedModelMap();
//뷰의 이름은 url 이 "/ex03/hello3" 이므로 "ex03/hello3"
model.addAttribute("msg", "Model 인터페이스를 리턴 타입으로 반환");
return model;
}
@RequestMapping("hello4")
public String test(HttpServletRequest req, HttpSession session) throws Exception {
req.setAttribute("msg", "req.setAttribute()를 이용하여 값 전달");
session.setAttribute("info", "session 값");
return "ex03/hello4";
}
}
'Spring' 카테고리의 다른 글
[spring] RequestParam (0) | 2022.11.14 |
---|---|
[spring] REST 개념 (0) | 2022.11.14 |
[spring] MVC 패턴 설정 (0) | 2022.11.10 |
[spring] AOP 란? (0) | 2022.11.09 |
[spring] 자바 기반 Bean 설정 Configuration (0) | 2022.11.09 |
블로그의 정보
개발자 미니민의 개발로그
mini_min