■ Spring WebMVC:
페이지 컨트롤러 만들기 II
/* Spring webMVC: Request Handler의 리턴값 다루기 */ package control; import java.io.PrintWriter; import javax.servlet.http.HttpServletResponse; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; @Controller @RequestMapping("/control/controller15/") public class Controller15 { // 1) void: 요청 핸들러에서 직접 출력하기 @RequestMapping("ok1") public void ok1(HttpServletResponse response) throws Exception { response.setContentType("text/plain;charset=UTF-8"); PrintWriter out = response.getWriter(); out.println("ok1(): 안녕하세요!"); } // 2) String: 리턴 값을 클라이언트로 출력하기 @RequestMapping(path="ok2", produces="text/plain;charset=UTF-8") @ResponseBody public String ok2(HttpServletResponse response) throws Exception { return "ok2(): 안녕하세요!"; } // 3) String: 리턴 값을 클라이언트로 출력하기 - error @RequestMapping(path="ok3") @ResponseBody // <=== 리턴 값이 응답 데이터임을 표시하는 애노테이션 // 리턴 값을 바로 출력할 때는 @RequestMapping의 produces 속성을 이용하여 // 출력 내용의 타입과 인코딩을 지정한다. public String ok3(HttpServletResponse response) throws Exception { //@ResponseBody를 사용하여 리턴 값을 바로 클라이언트로 출력할 때는 // 다음과 같이 UTF-8 처리를 지정할 수 없다. // 해결책? 위의 ok2() 메서드에서처럼 @RequestMapping의 produces 속성으로 지정해야 한다. response.setContentType("type/plain;charset=UTF-8"); return "ok3(): 안녕하세요!"; } // 4) String: JSP로 포워딩하기 // => @ResponseBody가 붙지 않으면 리턴 값을 JSP URL로 취급한다. @RequestMapping(path="ok4") public String ok4() throws Exception { return "/controller15_ok4.jsp"; } }
application-context.xml 파일에 다음과 같은 bean 객체를 등록해줍니다.
<!-- 페이지 컨트롤러가 JSP URL을 리턴할 때, 해당 JSP를 찾아 실행하는 객체 --> <bean id="jspViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/> <property name="prefix" value="/"/> <property name="suffix" value=".jsp"/> </bean>
이렇게 JSP를 실행할 객체를 명시적으로 등록하게 되면 페이지
컨트롤러에서 JSP URL을 리턴할 때 이 설정을 고려하게 됩니다.
그러나 String을 리턴 값으로 설정해주고 JSP로 포워딩 해준 4번 예제의
코드를 바꿔야 합니다. 이유는 다음의 주석을 참고해주세요.
* Controller15의 ok4() 메서드를 다음과 같이 정의해야 합니다.
@RequestMapping(path="ok4") public String ok4() throws Exception {// return "/controller15_ok4.jsp"; // InternalResourceViewResolver를 설정하기 전에는 괜찮다. // InternalResourceViewResolver를 설정한 후에는 오류가 발생한다. // why? 리턴 값 앞 뒤에 문자열이 붙기 때문이다. // "/" + "controller15_ok4.jsp" + ".jsp" // 그래서 최종 url은 "/controller15_ok4.jsp.jsp"가 된다. return "controller15_ok4"; // 이렇게 InternalResourceViewResolver의 설정을 고려하여 리턴 값을 작성해야 한다. }
webapp 폴더 안에 controller15_ok4.jsp 파일을 만들고 다음처럼 작성합니다.
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta charest="UTF-8"> <title>test</title> </head> <body> <h1>contoller_ok4()</h1> </body> </html>
▶ 실행 방법 :
http:localhost:8080/spring-web01/control/controller15/ok4.do
───────
클라이언트로 리턴 값을 출력하지도 않고, JSP URL로도 지정하지 않을 때
▶ 앞서 application-context.xml 파일에 jspViewResolver bean 객체를 등록
해주었기에 다음과 같은 예제를 추가해주고 실행해보면 정상적으로 실행
되는 것을 알 수 있습니다.
// 5) void: 클라이언트로 리턴 값을 출력하지도 않고, JSP URL로도 지정하지 않으면 // => 기본 JSP URL로 현재 URL을 사용한다. // => 단 이럴 경우 스프링 설정 파일에 JSP를 어디에서 찾을 것인지 지정해야 한다. // 지정하지 않으면 URL이 @RequestMapping(path="ok5") public void ok5() throws Exception { System.out.println("ok5()"); }
▶ 실행 방법 :
http:localhost:8080/spring-web01/control/controller15/ok5.do
───────
JSP URL을 바구니에 담아 리턴하기
// 6) JSP URL을 바구니에 담아 리턴하기 @RequestMapping(path="ok6") public ModelAndView ok6() throws Exception { ModelAndView mv = new ModelAndView(); mv.setViewName("controller15_ok6"); return mv; }
기존 예제에 위 코드를 추가하고 webapp 폴더 안에 controller15_ok6.jsp 파일을 만듭니다. 만든 파일에는 아래와 같이 작성합니다.
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta charest="UTF-8"> <title>test</title> </head> <body> <h1>contoller_ok6()</h1> </body> </html>
▶ 실행 방법 :
http:localhost:8080/spring-web01/control/controller15/ok6.do
───────
JSP URL과 JSP 사용할 데이터도 함께 ModelAndView 바구니에 담아 리턴하기
// 7) JSP URL과 JSP 사용할 데이터도 함께 ModelAndView 바구니에 담아 리턴하기 @RequestMapping(path="ok7") public ModelAndView ok7() throws Exception { ModelAndView mv = new ModelAndView(); mv.setViewName("controller15_ok7"); mv.addObject("title", "제목이네요!"); Member member = new Member(); member.setName("홍길동"); member.setAge(20); member.setWorking(true); mv.addObject("member", member); /* 이렇게 ModelAndView 바구니에 값을 담아 두면, * 프론트 컨트롤러는 이 바구니에 담긴 값을 꺼내 * JSP 가 사용할 수 있도록 ServletRequest 바구니에 옮겨 싣는다. */
기존 예제에 위 코드를 추가하고 webapp 폴더 안에 controller15_ok7.jsp 파일을 만듭니다. 만든 파일에는 아래와 같이 작성합니다.
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta charest="UTF-8"> <title>test</title> </head> <body> <h1>contoller_ok7()</h1> ${title}<br> ${member.name}<br> ${member.age}<br> ${member.working}<br> </body> </html>
▶ 실행 방법 :
http:localhost:8080/spring-web01/control/controller15/ok7.do
▶ 실행 결과 :
contoller_ok7()
제목이네요!
홍길동
20
true
───────
JSP URL은 리턴 값으로, JSP 사용할 데이터는 Model 바구니에 담아 리턴하기
// 8) JSP URL은 리턴 값으로, JSP가 사용할 데이터는 Model 바구니에 담는다. @RequestMapping(path="ok8") public String ok8(Model model) throws Exception { model.addAttribute("title", "제목이네요!"); Member member = new Member(); member.setName("홍길동"); member.setAge(20); member.setWorking(true); model.addAttribute("member", member); /* 이렇게 ModelAndView 바구니에 값을 담아 두면, * 프론트 컨트롤러는 이 바구니에 담긴 값을 꺼내 * JSP 가 사용할 수 있도록 ServletRequest 바구니에 옮겨 싣는다. */ return "controller15_ok8"; }
기존 예제에 위 코드를 추가하고 webapp 폴더 안에 controller15_ok8.jsp 파일을 만듭니다. 만든 파일은 아래와 같이 작성합니다.
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta charest="UTF-8"> <title>test</title> </head> <body> <h1>contoller_ok8()</h1> ${title}<br> ${member.name}<br> ${member.age}<br> ${member.working}<br> </body> </html>
▶ 실행 방법 :
http:localhost:8080/spring-web01/control/controller15/ok8.do
───────
Model 대신 Map 객체를 바구니로 사용해서 리턴 값을 받기
// 9) Model 대신 Map 객체를 바구니로 사용할 수 있다. @RequestMapping(path="ok9") public String ok9(Model model) throws Exception { model.addAttribute("title", "제목이네요!"); Member member = new Member(); member.setName("홍길동"); member.setAge(20); member.setWorking(true); model.addAttribute("member", member); /* 이렇게 Map 바구니에 값을 담아 두면, * 프론트 컨트롤러는 이 바구니에 담긴 값을 꺼내 * JSP 가 사용할 수 있도록 ServletRequest 바구니에 옮겨 싣는다. */ return "controller15_ok8"; }
기존 예제에 위 코드를 추가하고 webapp 폴더 안에 controller15_ok9.jsp 파일을 만듭니다. 만든 파일은 아래와 같이 작성합니다.
'Programming > java' 카테고리의 다른 글
[Java] Spring WebMVC: 페이지 컨트롤러(Page Controller)를 만들어 보자 I (0) | 2017.06.27 |
---|---|
[Java] 클래스 정보 얻기 - 리플렉션(reflection)이란? (0) | 2017.06.20 |
[Java] JSP란 무엇일까? JSP를 사용하는 이유와 사용법을 익혀보자! (0) | 2017.06.19 |
[Java] 쿠키(Cookie)의 개념과 사용 방법을 쉽게 알아보자! (0) | 2017.06.12 |
[Java] URL 인코딩이란 무엇인가? (2) | 2017.06.12 |