Spring WebMVC: 

페이지 컨트롤러 만들기 II


───────
Spring webMVC: Request Handler의 리턴값 다루기


/* 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 파일을 만듭니다. 만든 파일은 아래와 같이 작성합니다.



블로그 이미지

필로그래머

,