- 과도한 xml 설정으로 인한 불편함 해결 필요
@Controller
- Controller클래스를 Controller Bean으로 인식시키기 위해 사용
- 어떤 인터페이스 클래스도 상속할 필요가 없다
- @Controller 사용 시
import org.springframework.stereotype.Controller;
@Controller
public class LoginController {
public String loginUser(UserVO vo){
return null;
}
}
public class LoginController implements Controller {
public ModelAndView handleRequest(HttpServletRequest request,HttpServletResponse response) throws Exception {
…
}
@RequestMapping
- 컨트롤러클래스의 메서드에 설정할 때, 요청url과 적절하게 매핑
package com.testmall.view.user.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class LoginController {
@RequestMapping("/login.do")
public ModelAndView login(HttpServletRequest request,HttpServletResponse response) {
}
}
[WEB-INF/spring-mvc.xml]
<!-- Controller -->
<bean id="loginController" class="com.testmall.view.user.LoginController"/>
[WEB-INF/spring-mvc.xml]
<!-- HandlerMapping -->
<bean id="handlerMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="/login.do">loginController</prop>
</props>
</property>
</bean>
<!-- Controller -->
<bean id="loginController" class="com.testmall.view.user.LoginController"/>
- 사용자의 요청에 따라 같은 url도 get 방식과 post방식으로 구분하여 사용 가능
@Controller
public class LoginController {
@RequestMapping(value="/login.do", method=RequestMethod.GET)
public String loginView(HttpServletRequest request,HttpServletResponse response) {
}
@RequestMapping(value="/login.do", method=RequestMethod.POST)
public String login(HttpServletRequest request,HttpServletResponse response) {
}
}
- 혹은 중복부분을 클래스에 바로 어노테이션을 달 수 있다
@Controller
@RequestMapping("/login.do")
public class LoginController {
@RequestMapping(method=RequestMethod.GET)
public String loginView(HttpServletRequest request,HttpServletResponse response) {
}
@RequestMapping(method=RequestMethod.POST)
public String login(HttpServletRequest request,HttpServletResponse response) {
}
}
@ModelAttribute
- 클라이언트의 요청 처리 시, 매개변수로 사용자가 입력한 값을 매핑할 수 있는 자바빈을 등록하면 spring 컨테이너가 자바빈을 생성하여 넘겨준다
- 사용자가 입력한 값을 자바빈의 property에 자동으로 채워준다
- 사용자가 입력한 값 추출과 자바빈 생성 및 값 설정 과정을 컨테이너에 의해 자동으로 처리
@Controller
public class LoginController {
@RequestMapping("/login.do")
public String login(@ModelAttribute UserVO vo) throws Exception {
int n = userService.insertUser(vo);
}
}
- vo의 멤버변수 명과 사용자가 입력한 파라미터의 name이 같아야한다
[UserVO.java]
public class UserVO {
private String id;
private String password;
}
[login.jsp]
<tr><td>아이디</td><td><input name="id" type="text" /></td></tr>
<tr><td>비밀번호</td><td><input name="password" type="password" /></td></tr>
@Controller
public class LoginController {
@RequestMapping("/login.do")
public String login(HttpServletRequest request) {
String id = request.getParameter("id");
String password = request.getParameter("password");
UserVO vo = new UserVO();
vo.setId(id);
vo.setPassword(password);
int n = userService.insertUser(vo);
}
}
@RequestParam
- Http 요청 파라미터를 메서드의 파라미터로 전달받을 때 사용
@Controller
public class getUserListController {
@RequestMapping("/getUserList.do")
public String getUserList(@RequestParam("searchCondition") String searchCondition,@RequestParam("searchKeyword") Strin searchKeyword){
System.out.println("검색 조건 : " + searchCondition);
System.out.println("검색 단어 : " + searchKeyword);
return null;
}
}
- RequestParam이 적용된 파라미터는 기본적으로 필수 파라미터
- 요청 파라미터가 존재하지 않을 경우 400 응답 코드
- 필수가 아닌 파라미터의 경우 required 속성 값을 false로 지정
@Controller
public class SearchController {
@RequestMapping("/search/external.do")
public ModelAndView searchExternal(@RequestParam(value="query", required=false) String query, @RequestParam(value = "p", required=false) int pageNumber) {
System.out.println("query=" + query + ",pageNumber=" + pageNumber);
return new ModelAndView("search/external");
}
}
- 파라미터에 null을 할당할 수 없을 경우 기본값 지정
@RequestMapping("/search/external.do")
public ModelAndView searchExternal(@RequestParam(value="query", required=false) String query, @RequestParam(value = "p", defaultValue = "1") int pageNumber) {
System.out.println("query=" + query + ",pageNumber=" + pageNumber);
return new ModelAndView("search/external");
}
@CookieValue
import org.springframework.web.bind.annotation.CookieValue;
@Controller
public class CookieController {
@RequestMapping("/cookie/view.do")
public String view(@CookieValue(value = "auth") String authValue) {
System.out.println("auth 쿠키: " + authValue);
return "cookie/view";
}
}
- 어노테이션을 이용하면 Http요청 헤더의 값을 파라미터로 받을 수 있다
@Controller
public class HeaderController {
@RequestMapping("/header/check.do")
public String check(@RequestHeader("Accept-Language") String languageHeader) {
System.out.println(languageHeader);
return "header/pass";
}
}
컨트롤러 클래스 자동 스캔
- @Controller 어노테이션은 @Component 어노ㅔ이션과 마찬가지로 컴포넌트 스캔 대상이다
- @Controller가 적용된 컨트롤러를 스캔하여 자동으로 빈으로 등록한다
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<context:component-scan base-package="mysite.spring.chap06.controller" />