일상/일기장
TIL22.03.15 - Spring : Spring MVC -annotation
jmaster
2022. 3. 15. 10:09
- component-scan : Spring Annotation을 사용한 클래스가 작성된 패킺비를 설정하기 위한 엘리먼트⇒base-package 속성: 패키지 경롤를 속성값으로 설정
- <context:component-scan base-package="xyz.itwill10.controller" />
- ⇒패키지에 작성된 클래스의 어노테이션을 Spring Container가 처리
- @Controller : 클라이언트의 요청을 처리하는 Controller 클래스를 Spring Bean으로 등록하기 위한 어노테이션⇒Controller 인터페이스를 상속받지 않아도 Controller 클래스로 작성 가능요청 처리 메소드에서 Front Controller(DispatcherServlet)에게 ViewName을 제공하는 방법1.요청 처리 메소드의 반환형을 void 자료형으로 작성하면 메소드명을 ViewName으로 제공 2. 요청 처리 메소드의 반환형을 String 클래스로 작성하면 반환되는 문자열을 ViewName으로 제공 (많이 씀)
- 3.요청 처리 메소드의 반환형을 ModelAndView 클래스로 작성하면 반환되ModelAndView 객체에 ViewName을 저장하여 제공
- ⇒ Front Controller는 제공받은 ViewName을 ViewResolver 객체에 전달하여 JSP 파일명을 반환받아 포워드 이동하여 응답처리
- ⇒클라이언트의 요청을 처리하는 다수의 요청 처리 메소드 작성 가능 - @RequestMapping 어노테이션 사용
- ⇒클래스명이 beanName으로 등록(첫문자는 소문자)되며 value 속성을 이용하여 beanName 변경 가능
- 클라이언트의 요청을 처리하기 위한 메소드
- @RequestMapping : 클라이언트의 요청에 대한 처리 메소드를 설정하기 위한 어노테이션 (모든 요청 )
- ⇒ @GetMapping, @PostMapping, @PutMapping, @DeleteMapping 등의 어노테이션 사용 가능
- value 속성 : 클라이언트의 요청정보(URL)를 속성값으로 설정⇒ 다른 속성이 없는 경우 속성값만 설정 가능
- ⇒ 다른 요청 처리 메소드에 같은 이름의 요청정보가 설정된 경우 WAS 실행시 에러 발생 - 중복 금지
- ⇒ 클라이언트 요청정보에 의해 Front Controller(DispatcherServlet)가 Controller 클래스 요청 처리 메소드 호출
@Controller
public class HelloController {
public static final Logger logger= LoggerFactory.getLogger(HelloController.class);
@RequestMapping(value = "/hello" )
public void hello() {
logger.info("/hello 요청 >> HelloController 클래스의 hello() 메소드 호출 ");
}
@RequestMapping("/helloViewName")
public String helloViewName() {
logger.info("/hello 요청 >> HelloController 클래스의 helloViewName() 메소드 호출 ");
return "hello";
}
@RequestMapping("/helloModelAndView")
public ModelAndView helloModelAndView() {
logger.info("/hello 요청 >> HelloController 클래스의 helloModelAndView() 메소드 호출 ");
// ModelAndView modelAndView = new ModelAndView();
// modelAndView.setViewName("hello");
//ModelAndView 객체 생성시 생성자 매개변수에 ViewName을 전달하여 저장
ModelAndView modelAndView = new ModelAndView("hello");
modelAndView.setViewName("hello");
return modelAndView;
}
}
Model : 처리결과를 속성값으러 저장하기 위한 객체
view: 화면 출력
요청 처리 메소드의 처리결과를 뷰페이지(JSP)에게 제공하는 방법
- ModelAndView 객체에 처리결과를 속성값으로 저장하여 제공
- HttpServletRequest 객체에 처리결과를 속성값으로 저장하여 제공(추천안함 -가독성 떨어짐 )
- Model 객체에 처리결과를 속성값으로 저장하여 제공(추천)
#1
1-1
- ModelAndView.addObject(String attributeName, Object attributeValue)
- ⇒뷰페이지(JSP)에서 처리결과를 사용할 수 있도록 속성값으로 저장하는 메소드 - Request Scope
@RequestMapping("/resultMAV")
public ModelAndView modelAndViewResult() {
ModelAndView modelAndView=new ModelAndView("result_display");//ViewName 저장
modelAndView.addObject("mavName", "홍길동");
return modelAndView;
}
1-2
- 요청 처리 메소드는 Front Controller에 의해 호출되는 메소드
- ⇒요청 처리 메소드에 매개변수를 작성하면 Front Controller가 Spring Container로부터 필요한 Spring Bean 객체를 제공받아 매개변수에 자동 저장하여 제공
@RequestMapping("/resultMAV")
public ModelAndView modelAndViewResult(ModelAndView modelAndView) {
modelAndView.setViewName("result_display");
modelAndView.addObject("mavName", "홍길동");
return modelAndView;
}
#2
- HttpServletRequest.setAttribute(String attributeName, Object attributeValue)
- ⇒ 뷰페이지(JSP)에서 처리결과를 사용할 수 있도록 HttpServletRequest 객체에 속성값을 저장하는 메소드
@RequestMapping("/resultRequest")
public String requestResult(HttpServletRequest request) {
request.setAttribute("requestName", "임꺽정");
return "result_display";
}
#3
- Model.addAttribute(String attributeName, Object attributeValue)
- ⇒뷰페이지(JSP)에서 처리결과를 사용할 수 있도록 Model 객체에 속성값을 저장하는 메소드
@RequestMapping("/resultModel")
public String modelResult(Model model) {
model.addAttribute("modelName", "전우치");
return "result_display";
}
- jsp에서 EL사용하여 값을 받아 출력
<h1>요청에 대한 처리결과를 출력하는 페이지</h1>
<hr>
<h2>modelAndView = ${mavName}</h2>
<h2>HttpServletRequest = ${requestName}</h2>
<h2>Model = ${modelName}</h2>
====================================
@ModelAttribute : @ModelAttribute 어노테이션을 메소드에 선언한 경우 반환값(객체)을 현재 Controller 클래스에 선언된 모든 요청 처리 메소드의 뷰페이지에게 반환값 (객체)을 사용되도록 제공하는 어노테이션
value(name) 속성 : 뷰페이지에서 반환값을 사용하기 위한 속성명을 속성값으로 설정
⇒다른 속성이 없는 경우 속성값만 설정 가능
@ModelAttribute("now")
public String getNow() {
return new SimpleDateFormat("yyyy년 MM월 dd일 mm분 ss초").format(new Date());
}
포워드 / 리다이렉트 이동 방법
포워드 이동
- ViewName 반환 >> 뷰페이지(JSP)로 포워드 이동
- 포워드 이동 : 서버측에서 다른 웹프로그램(JSP)으로 스레드를 이동하여 응답 처리
- ⇒클라이언트의 요청 URL 주소 미변경, Request Scope로 제공되는 객체 사용 가능
@RequestMapping("/forward_print")
public String forword(Model model) {
//뷰페이지(JSP)에서 사용할 객체 제공 - Request Scope
model.addAttribute("name", "홍길동");
return "movement/forward_display";
}
리다이렉트 이동
- 반환되는 ViewName에 redirect 접두사(NameSpace)를 사용하면 리다이렉트 이동
- ⇒ViewName에 의해 뷰페이지(JSP)로 응답하는 대신 클라이언트에게 URL 주소 전달
- 리다이렉트 이동 : 클라이언트에게 URL주소를 전달하여 재요청되도록 응답처리
- ⇒클라이언트 요청 URL 주소 변경 ,Request Scope로 제공되는 객체 사용 불가능
@RequestMapping("/redirect")
public String redirect() {
return "redirect:/redirect_print";
}
리다이렉트 이동시 요청 처리하는 법
- RedirectAttributes : 리다이렉트 이동에 의해 호출되는 요청 처리 메소드의 뷰페이지에게 속성값을 저장하여 제공하기 위한 객체
- RedirectAttributes.addFlashAttribute(String attributeName, Object attributeValue)
- ⇒ 다이렉트 이동에 의해 호출되는 요청 처리 메소드의 뷰페이지에게 속성값을 저장하여 제공하는 메소드
@RequestMapping("/redirect")
public String redirect(/*Model model*/ RedirectAttributes attributes) {
attributes.addFlashAttribute("name", "임꺽정");
return "redirect:/redirect_print";
}
==========================================
- 입력페이지에 대한 ViewName를 반환하는 요청 처리 메소드
- ⇒요청 방식에 상관없이 요청해도 동작되는 요청 처리 메소드
@RequestMapping("/method_input")
public String inputOne() {
return "method_input1";
}
- 전달값을 반환받아 출력페이지에게 제공하고 출력페이지에 대한 ViewName를 반환하는 요청 처리 메소드
- ⇒ 요청 방식에 상관없이 요청해도 동작되는 요청 처리 메소드
- HttpServletRequest.setCharacterEncoding(String encoding) : POST 방식으로 요청하여 전달된 값에 대한 캐릭터셋을 변경하는 메소드 - UnsupportedEncodingException 발생 : 예외 처리
@RequestMapping("/method_output")
public String outputOne(HttpServletRequest request) throws UnsupportedEncodingException {
if(request.getMethod().equals("GET")) {
return "method_input1";
}
request.setCharacterEncoding("utf-8");
String name=request.getParameter("name");
request.setAttribute("name", name);
return "method_output1";
}
- 입력페이지에 대한 ViewName를 반환하는 요청 처리 메소드
- ⇒ GET 방식으로만 요청하여 동작되는 요청 처리 메소드
- method 속성 : 요청 처리 메소드를 호출하기 위한 클라이언트 요청방식을 속성값으로 설정
- ⇒ RequestMethod 자료형(Enum)의 상수를 속성값으로 설정요청방식에 따라 @RequestMapping 어노테이션 대신 @GetMapping, @PostMapping 등의 어노테이션을 사용하여 요청 처리 메소드 설정 가능
@RequestMapping(value = "/method", method = RequestMethod.GET)
public String inputTwo() {
return "method_input2";
}
- 전달값을 반환받아 출력페이지에게 제공하고 출력페이지에 대한 ViewName를 반환하는 요청 처리 메소드
- ⇒POST 방식으로만 요청하여 동작되는 요청 처리 메소드
- @RequestMapping 어노테이션의 요청 URL 주소가 같은 경우 클라이언트의 요청방식으로 구분하여 요청 처리 메소드 호출 가능
@RequestMapping(value = "/method", method = RequestMethod.POST)
public String outputTwo(HttpServletRequest request) throws UnsupportedEncodingException {
request.setCharacterEncoding("utf-8");
String name=request.getParameter("name");
request.setAttribute("name", name);
return "method_output2";
}
}
==========================================
- 요청 처리 메소드에 HttpServletRequest 자료형의 매개변수를 선언하면 클라이언트의 리퀘스트
- 메세지(HttpServletRequest 객체)를 Front Controller에게 제공받아 저장
- ⇒HttpServletRequest 객체를 이용하여 전달값을 반환받아 사용
@RequestMapping(value = "/param", method = RequestMethod.POST)
public String form(HttpServletRequest request) throws UnsupportedEncodingException {
request.setCharacterEncoding("utf-8");
String name=request.getParameter("name");
request.setAttribute("name", name);
return "param_display";
}
- 전달값의 이름과 같은 이름의 String 자료형의 매개변수를 선언하면 Front Controller에 의해 전달값이 자동으로 매개변수에 저장되어 제공
- ⇒전달값의 이름과 매개변수의 이름이 다른 경우 매개변수에는 NULL 저장
- 전달값이 대한 캐릭터셋를 미리 변경하기 위해 web.xml 파일에서 CharacterEncodingFilter 클래스 필터로 등록해야만 정상적인 전달값이 매개변수에 저장
@RequestMapping(value = "/param", method = RequestMethod.POST)
public String form(String name, Model model) {
model.addAttribute("name", name);
return "param_display";
}
web.xml filter 설정
- filter : Filter 클래스를 필터로 등록하기 위한 엘리먼트
- Filter 클래스 : Filter 인터페이스를 상속받아 작성된 자식클래스
- ⇒ 웹프로그램 실행 전 또는 후에 동작될 명령을 제공하는 클래스
- CharacterEncodingFilter : Spring Framework에서 제공하는 필터 클래스로 요청 처리 전 리퀘스트 메세지의 바디(Body)에 저장되어 전달되는 값의 캐릭터셋을 변경하는 기능 제공
- ⇒ encoding 이름으로 캐릭터셋의 인코딩 값을 반드시 전달
- filter-mapping : 필터가 적용되기 위한 클라이언트 요청 URL 주소의 패턴을 설정하는 엘리먼트
<filter>
<filter-name>encodintFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodintFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
@RequestPram : 전달값을 매개변수에 저장하기 위한 어노테이션
⇒ 매개변수의 이름과 같은 이름의 전달값이 없느 경우 400 에러 발생
⇒ 매개변수에 반드시 전달값이 저장되도록 설정하기 위한 사용하는 어노테이션
@RequestMapping(value = "/param", method = RequestMethod.POST)
public String form(@RequestParam String name, Model model) {
model.addAttribute("name", name);
return "param_display";
}
- 전달값의 이름과 매개변수의 이름이 다른 경우 @RequestParam 어노테이션의 value 속성을 사용하여 매개변수에 전달값 저장 가능
- value속성 : 전달값의 이름을 속성값으로 설정
- ⇒다른 속성이 없는 경우 속성값만 설정 가능
- required 속성 : false 또는 true 중 하나를 속성값으로 설정
- ⇒false : 전달값 미필수 , true : 전달값 필수 - 기본
@RequestMapping(value = "/param", method = RequestMethod.POST)
public String form(@RequestParam("username") String name, Model model) {
model.addAttribute("name", name);
return "param_display";
}
- defaultValue 속성 : 전달값의 이름이 다르거나 전달값이 없는 경우 매개변수에 저장되는 기본값을 속성값으로 설정
@RequestMapping(value = "/param", method = RequestMethod.POST)
public String form(@RequestParam(value = "username", defaultValue = "임꺽정") String name, Model model) {
model.addAttribute("name", name);
return "param_display";
}