■ Spring WebMVC:
페이지 컨트롤러 만들기
─────
Spring에서 제공하는 프론트 컨트롤러와 협업할 페이지 컨트롤러 만들기
▶ Spring WebMVC 프로젝트 설정 방법
1) web.xml에 Spring webmvc의 프론트 컨트롤러를 설정합니다.
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1"> <display-name>project01</display-name> <!-- 프론트 컨트롤러 등록 --> <servlet> <servlet-name>dispatcher</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:control/application-context.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> <!-- 클라이언트가 요청하지 않아도 init() 함수가 호출. 즉 servlet 객체가 생성한다. --> </servlet> <servlet-mapping> <servlet-name>dispatcher</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping> </web-app>
2) Spring 설정 파일을 준비합니다.
/src/main/src/control/application-context.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd"> <!-- Spring IoC 컨테이너를 위한 객체 등록 --> <context:component-scan base-package="control"/> <!-- Spring WebMVC 관련 기능을 처리할 객체를 등록한다. (RequsetMapping 되어 있는 객체를 등록) --> <mvc:annotation-driven/> </beans>
3) Gradle 설정 파일을 준비합니다. (프로젝트 폴더 바로 아래에 위치시켜 주세요.)
build.gradle
apply plugin: 'java' apply plugin: 'eclipse-wtp' apply plugin: 'war' compileJava { options.encoding = 'UTF-8' sourceCompatibility = '1.8' } repositories { mavenCentral() } dependencies { compile 'org.slf4j:slf4j-api:1.7.22' compile group: 'commons-fileupload', name: 'commons-fileupload', version: '1.3.2' compile group: 'javax.servlet', name: 'jstl', version: '1.2' compile group: 'org.springframework', name: 'spring-webmvc', version: '4.3.9.RELEASE' providedCompile group: 'javax.servlet', name: 'javax.servlet-api', version: '3.1.0' testCompile 'junit:junit:4.12' }
4) cmd 명령창에서 해당 프로젝트 폴더로 경로를 설정한 후 "gradle eclipse"
명령어를 입력해 실행시킵니다.
* 이 글의 예제에서의 프로젝트 폴더는 spring-web01입니다.
▶ 페이지 컨트롤러 만들기
1) 클래스를 페이지 컨트롤러로 표시하기
- @Controller 애노테이션을 붙입니다.
2) 요청을 처리할 메서드를 표시하기
- @RequestMapping(URL) 애노테이션을 붙입니다.
/* Spring webMVC: 페이지 컨트롤러 만들기 * */ package step01; import java.io.PrintWriter; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; @Controller // 페이지 컨트롤러 클래스임을 표시 public class Controller01 { @RequestMapping("/control/controller01") // 어떤 요청을 처리할지 표시 public void service(HttpServletRequest request, HttpServletResponse response) throws Exception { response.setContentType("text/plain;charset=UTF-8"); PrintWriter out = response.getWriter(); out.println("Hello, world!"); } }
▶ 결과 :
웹 브라우저 url 주소에 http://localhost:8080/프로젝트명/패키지명/controller01.do 를 입력하면
화면에 "Hello, world!"가 출력되는 것을 확인하실 수 있습니다.
─────
▶ 설정 파일은 남겨둔 채 Controller01 파일을 다음 Controller02 파일로
업그레이드 시켜보겠습니다. 메소드의 이름은 꼭 service()일 필요가
없다는 것을 알 수 있습니다. @RequestMapping에서 설정해준 경로의
이름이 메소드 이름이 되면 됩니다.
/* Spring webMVC: 페이지 컨트롤러 만들기 * */ package control; import java.io.PrintWriter; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; @Controller // 페이지 컨트롤러 클래스임을 표시 public class Controller02 { @RequestMapping("/control/controller02/a") // 어떤 요청을 처리할지 표시 public void a(HttpServletRequest request, HttpServletResponse response) throws Exception { response.setContentType("text/plain;charset=UTF-8"); PrintWriter out = response.getWriter(); out.println("aaaa"); } @RequestMapping("/control/controller02/b") // 어떤 요청을 처리할지 표시 public void b(HttpServletRequest request, HttpServletResponse response) throws Exception { response.setContentType("text/plain;charset=UTF-8"); PrintWriter out = response.getWriter(); out.println("bbbb"); } @RequestMapping("/control/controller02/c") // 어떤 요청을 처리할지 표시 public void c(HttpServletRequest request, HttpServletResponse response) throws Exception { response.setContentType("text/plain;charset=UTF-8"); PrintWriter out = response.getWriter(); out.println("cccc"); } }
▶ 위 예제는 다음 Controller03의 예제와 똑같은 결과를 호출합니다.
공통되는 경로가 있다면 @RequestMapping을 통해 묶어줄 수 있습니다.
요청 URL 계산하기 = class에 붙은 URL + 메소드에 붙은 URL
/* Spring webMVC: 페이지 컨트롤러 만들기 * */ package control; import java.io.PrintWriter; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; @Controller // 페이지 컨트롤러 클래스임을 표시 @RequestMapping("/control/controller03/") public class Controller03 { @RequestMapping("a") // 어떤 요청을 처리할지 표시 public void a(HttpServletRequest request, HttpServletResponse response) throws Exception { response.setContentType("text/plain;charset=UTF-8"); PrintWriter out = response.getWriter(); out.println("aaaa"); } @RequestMapping("b") // 어떤 요청을 처리할지 표시 public void b(HttpServletRequest request, HttpServletResponse response) throws Exception { response.setContentType("text/plain;charset=UTF-8"); PrintWriter out = response.getWriter(); out.println("bbbb"); } @RequestMapping("c") // 어떤 요청을 처리할지 표시 public void c(HttpServletRequest request, HttpServletResponse response) throws Exception { response.setContentType("text/plain;charset=UTF-8"); PrintWriter out = response.getWriter(); out.println("cccc"); } }
▶ 호출될 메서드가 한 개일 경우에는 첫번째 @RequestMapping의 경로만
설정해줘도 웹 브라우저에서 처리해줄 수 있습니다.
요청 URL 계산하기 = class에 붙은 URL + 메소드에 붙은 URL
/* Spring webMVC: 한 페이지 컨트롤러에서 요청 처리하기 * */ package control; import java.io.PrintWriter; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; @Controller // 페이지 컨트롤러 클래스임을 표시 @RequestMapping("/control/controller04/ok") public class Controller04 { @RequestMapping // 어떤 요청을 처리할지 표시 public void a(HttpServletRequest request, HttpServletResponse response) throws Exception { response.setContentType("text/plain;charset=UTF-8"); PrintWriter out = response.getWriter(); out.println("aaaa"); } }
─────
요청 http method 구분하여 처리하기 I
/* Spring webMVC: 요청 http method 구분하여 처리하기 * */ package control; import java.io.PrintWriter; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; @Controller // 페이지 컨트롤러 클래스임을 표시 @RequestMapping("/control/controller05/ok") public class Controller05 { @RequestMapping(method=RequestMethod.GET) public void get(HttpServletRequest request, HttpServletResponse response) throws Exception { response.setContentType("text/plain;charset=UTF-8"); PrintWriter out = response.getWriter(); out.println("get"); } @RequestMapping(method=RequestMethod.POST) public void post(HttpServletRequest request, HttpServletResponse response) throws Exception { response.setContentType("text/plain;charset=UTF-8"); PrintWriter out = response.getWriter(); out.println("post"); } }
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> <form action="control/controller05/ok.do" method="GET"> <button>GET 요청</button> </form> <hr> <form action="control/controller05/ok.do" method="POST"> <button>POST 요청</button> </form> </body> </html>
요청 http method 구분하여 처리하기 II
/* Spring webMVC: 요청 http method 구분하여 처리하기 * */ package control; import java.io.PrintWriter; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; @Controller // 페이지 컨트롤러 클래스임을 표시 @RequestMapping("/control/controller06/") public class Controller06 { //@RequestMapping(value="ok", method=RequestMethod.GET) // 이렇게 해도 되고 @RequestMapping(path="ok", method=RequestMethod.GET) // 이렇게 해도 된다. public void get(HttpServletRequest request, HttpServletResponse response) throws Exception { response.setContentType("text/plain;charset=UTF-8"); PrintWriter out = response.getWriter(); out.println("get"); } //@RequestMapping(value="ok", method=RequestMethod.POST) // 이렇게 해도 되고 @RequestMapping(path="ok", method=RequestMethod.POST) public void post(HttpServletRequest request, HttpServletResponse response) throws Exception { response.setContentType("text/plain;charset=UTF-8"); PrintWriter out = response.getWriter(); out.println("post"); } }
GET 요청과 POST 요청을 가능하게 해주는 html 코드 II
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> <form action="control/controller06/ok.do" method="GET"> <button>GET 요청</button> </form> <hr> <form action="control/controller06/ok.do" method="POST"> <button>POST 요청</button> </form> </body> </html>
─────
요청 URL에 주는 파라미터에 따라 호출 메서드 제한하기
- 파라미터의 존재 유무로 요청을 구분합니다.
/* Spring webMVC: 요청 URL에 주는 파라미터에 따라 호출 메서드 제한하기 * */ package control; import java.io.PrintWriter; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; @Controller @RequestMapping("/control/controller07/") public class Controller07 { @RequestMapping(path="ok", params={"name"}) public void get(HttpServletRequest request, HttpServletResponse response) throws Exception { response.setContentType("text/plain;charset=UTF-8"); PrintWriter out = response.getWriter(); out.println("name 있어요!"); } @RequestMapping(path="ok", params={"age", "tel"}) public void post(HttpServletRequest request, HttpServletResponse response) throws Exception { response.setContentType("text/plain;charset=UTF-8"); PrintWriter out = response.getWriter(); out.println("age와 tel 있어요!"); } }
@RequestMapping의 params 속성에 지정한 값과 일치하는 요청
파라미터가 있을 경우에 호출됩니다.
▶ 실행 방법:
http://localhost8080:/spring-web01/control/controller07/ok.do?&age=20&tel=111
─────
HTTP 요청 프로토콜에 지정한 이름의 헤더가 있을 경우에 호출됩니다.
/* Spring webMVC: 요청 프로토콜의 헤더 이름을 요청 조건으로 지정 * => HTTP 요청 프로토콜에 지정한 이름의 헤더가 있을 경우에 호출된다. * */ package control; import java.io.PrintWriter; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; @Controller @RequestMapping("/control/controller08/") public class Controller08 { @RequestMapping(path="ok", headers="aaaa") public void get(HttpServletRequest request, HttpServletResponse response) throws Exception { response.setContentType("text/plain;charset=UTF-8"); PrintWriter out = response.getWriter(); out.println("aaaa 있어요!"); } @RequestMapping(path="ok", headers={"bbbb", "cccc"}) public void post(HttpServletRequest request, HttpServletResponse response) throws Exception { response.setContentType("text/plain;charset=UTF-8"); PrintWriter out = response.getWriter(); out.println("bbbb, cccc 있어요!"); } }
AJAX 요청을 통해 헤더 값을 넘겨주는 코드
* 참고 : 그냥 html을 통해선 헤더 값을 넘겨줄 수 없어요.
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> <button id="btn1">"aaaa" 헤더 요청</button> <button id="btn2">"bbbb", "cccc" 헤더 요청</button> <div> <textarea id="ta" cols="80" rows="8"></textarea> </div> <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script> <script> $("#btn1").click(function() { $.ajax("control/controller08/ok.do", { method: "get", headers: {"aaaa":"hello"}, dataType: "text"}) .done(function(result) { $("#ta").val(result) }) .fail(function(xhr, status, error) { $("#ta").val(xhr.responseText) }) }) $("#btn2").click(function() { $.ajax("control/controller08/ok.do", { method: "get", headers: {"bbbb":"hello", "cccc":"hello"}, // 한글은 헤더로 넘겨줄 수 없습니다. dataType: "text"}) .done(function(result) { $("#ta").val(result) }) .fail(function(xhr, status, error) { $("#ta").val(xhr.responseText) }) }) </script> </body> </html>
▶ 실행 방법:
http://localhost8080:/spring-web01/controller08.html
─────
요청 프로토콜의 Accept 헤더의 값에 따라 호출될 메서드 결정
/* Spring webMVC: 요청 프로토콜의 Accept 헤더의 값에 따라 호출될 메서드 결정 * */ package control; import java.io.PrintWriter; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.http.MediaType; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; @Controller @RequestMapping("/control/controller09/") public class Controller09 { @RequestMapping(path="ok", produces="text/plain") public void get(HttpServletRequest request, HttpServletResponse response) throws Exception { response.setContentType("text/plain;charset=UTF-8"); PrintWriter out = response.getWriter(); out.println("text/plain 보냄!"); } @RequestMapping(path="ok", produces="application/json") public void post(HttpServletRequest request, HttpServletResponse response) throws Exception { response.setContentType("text/plain;charset=UTF-8"); PrintWriter out = response.getWriter(); out.println("application/json 보냄!"); } }
▶ Accept 요청 헤더
- 웹 브라우저가 웹 서버에게 요구하는 콘텐트의 타입을 가리킵니다.
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> <button id="btn1">"text/plain" 콘텐트 요청</button> <button id="btn2">"application/json" 콘텐트 요청</button> <div> <textarea id="ta" cols="80" rows="8"></textarea> </div> <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script> <script> $("#btn1").click(function() { $.ajax("control/controller09/ok.do", { method: "get", headers: {"Accept":"text/plain"}, dataType: "text"}) .done(function(result) { $("#ta").val(result) }) .fail(function(xhr, status, error) { $("#ta").val(xhr.responseText) }) }) $("#btn2").click(function() { $.ajax("control/controller09/ok.do", { method: "get", headers: {"Accept":"application/json"}, dataType: "json"}) .done(function(result) { $("#ta").val(result) }) .fail(function(xhr, status, error) { $("#ta").val(xhr.responseText) }) }) </script> </body> </html>
▶ 실행 방법:
http://localhost8080:/spring-web01/controller09.html
─────
요청 프로토콜의 Content-Type 헤더 값에 따라 호출될 메서드를 결정하기
/* Spring webMVC: 요청 프로토콜의 Content-Type 헤더 값에 따라 호출될 메서드 결정 * => Content-Type 요청 헤더? * - 웹 브라우저가 웹 서버에게 보내는 데이터의 형식을 의미한다. */ package control; import java.io.PrintWriter; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.http.MediaType; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; @Controller @RequestMapping("/control/controller10/") public class Controller10 { @RequestMapping(path="ok", consumes="text/plain") public void get(HttpServletRequest request, HttpServletResponse response) throws Exception { response.setContentType("text/plain;charset=UTF-8"); PrintWriter out = response.getWriter(); out.println("text/plain 데이터를 받아서 처리했음!"); } @RequestMapping(path="ok", consumes="application/json") public void post(HttpServletRequest request, HttpServletResponse response) throws Exception { response.setContentType("text/plain;charset=UTF-8"); PrintWriter out = response.getWriter(); out.println("application/json 데이터를 받아서 처리했음!"); } }
▶ cosumes 란?
- 클라이언트가 보낸 데이터의 형식 중에서 이 메서드가 처리할 수 있는
형식을지정
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> <button id="btn1">"text/plain" 콘텐트 요청</button> <button id="btn2">"application/json" 콘텐트 요청</button> <div> <textarea id="ta" cols="80" rows="8"></textarea> </div> <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script> <script> $("#btn1").click(function() { $.ajax("control/controller10/ok.do", { method: "post", data: "hello!", headers: {"Content-Type":"text/plain"}, dataType: "text"}) .done(function(result) { $("#ta").val(result) }) .fail(function(xhr, status, error) { $("#ta").val(xhr.responseText) }) }) $("#btn2").click(function() { $.ajax("control/controller10/ok.do", { method: "post", data: '{"name":"hong", "age":"20", "tel":"1111-1111"}', headers: {"Content-Type":"application/json"}, dataType: "json"}) .done(function(result) { $("#ta").val(result) }) .fail(function(xhr, status, error) { $("#ta").val(xhr.responseText) }) }) </script> </body> </html>
▶ 실행 방법:
http://localhost8080:/spring-web01/controller10.html
─────
Request Handler(요청을 처리하는 메서드)의 파라미터들 I
▶ 프론트 컨트롤러는 페이지 컨트롤러의 메서드를 호출할 때,
그 메서드가 어떤 파라미터 값을 요구하는 지를 분석하여
그에 해당하는 값을 자동으로 꼽아줍니다.
▶ Request Handler의 파라미터로 선언할 수 있는 것
1) HttpServletRequest, ServletRequest
2) HttpServletResponse, ServletResponse
3) HttpSession
4) Map, Model
5) 요청 파라미터
/* Spring webMVC: Request Handler(요청을 처리하는 메서드)의 파라미터들 I * => Request Handler의 파라미터로 선언할 수 있는 것 * 1) HttpRequestServlet, ServletRequest */ package control; import java.io.FileInputStream; import java.io.PrintWriter; import java.util.Map; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; @Controller @RequestMapping("/control/controller11/") public class Controller11 { @RequestMapping("ok1") public void ok1() throws Exception { System.out.println("ok1(): 프론트 컨트롤러로부터 아무것도 받지 않는다."); } @RequestMapping("ok2") public void ok2(HttpServletRequest request) throws Exception { System.out.println("ok2()"); } @RequestMapping("ok3") public void ok3(HttpServletResponse response) throws Exception { response.setContentType("text/plain;charset=UTF-8"); PrintWriter out = response.getWriter(); out.println("ok3()"); } @RequestMapping("ok4") public void ok4(HttpServletRequest request, HttpServletResponse response) throws Exception { response.setContentType("text/plain;charset=UTF-8"); PrintWriter out = response.getWriter(); out.println("ok4()"); } @RequestMapping("ok5") public void ok5(HttpSession session, HttpServletResponse response) throws Exception { response.setContentType("text/plain;charset=UTF-8"); PrintWriter out = response.getWriter(); out.println("ok5()"); } // 프론트 컨트롤러가 줄 수 없는 값을 메서드에서 요구할 경우, // 즉 파라미터에 선언할 경우, // 실행할 때 오류가 발생한다! // 예) 다음 메서드에서 FileInputStream 파라미터가 이런 경우이다. @RequestMapping("ok6") public void ok6(FileInputStream in, HttpServletResponse response) throws Exception { System.out.println(in); response.setContentType("text/plain;charset=UTF-8"); PrintWriter out = response.getWriter(); out.println("ok6()"); } // 이 메서드에서 실행한 결과를 담을 빈 바구니를 요구할 수 있다. // 이 바구니에 값을 담으면, JSP에서 꺼내 쓸 수 있다. // 바구니의 타입은 Map 또는 Model 등이 가능하다. @RequestMapping("ok7") public void ok7(Map<String, Object> store, HttpServletResponse response) throws Exception { response.setContentType("text/plain;charset=UTF-8"); PrintWriter out = response.getWriter(); out.println("ok7()"); store.put("name", "홍길동"); store.put("age", 20); } // 이렇게 바구니에 담은 데이터는 // 스프링의 프론트 컨트롤러가 ServletRequest에 보관한다. // 그래서 JSP에서 꺼내 쓸 수 있는 것이다. @RequestMapping("ok8") public void ok8(Model store, HttpServletResponse response) throws Exception { response.setContentType("text/plain;charset=UTF-8"); PrintWriter out = response.getWriter(); out.println("ok8()"); store.addAttribute("name", "홍길동"); store.addAttribute("age", 20); // Model이나 Map이나 쓰임새는 같다. // 이렇게 바구니에 담은 데이터는 // 스프링의 프론트 컨트롤러가 ServletRequest에 보관한다. // 그래서 JSP에서 꺼내 쓸 수 있는 것이다. } // 클라이언트가 보낸 데이터를 꺼내기 // => 예전처럼 문자열을 원하는 형식을 직접 형변환 해야 한다. @RequestMapping("ok9") public void ok9(HttpServletRequest request, HttpServletResponse response) throws Exception { response.setContentType("text/plain;charset=UTF-8"); PrintWriter out = response.getWriter(); out.println("ok9()"); out.printf("name: %s\n", request.getParameter("name")); out.printf("age: %d\n", Integer.parseInt(request.getParameter("age"))); out.printf("working: %b\n", Boolean.parseBoolean(request.getParameter("working"))); } // 클라이언트가 보내는 데이터의 이름과 동일한 이름으로 파라미터 변수를 선언한다. // 그러면, 프론트 컨트롤러가 파라미터 이름과 같은 데이터를 찾아서 호출할 때 꼽아준다. // 프론트 컨트롤러는 문자열을 원시타입의 값으로 자동으로 바꿔준다. // 그 외의 타입에 대해서는 오류가 발생한다. // 해결책? => 웹 파라미터 타입 변환기를 설치해야 한다. @RequestMapping("ok10") public void ok10(String name, int age, boolean working, HttpServletResponse response) throws Exception { response.setContentType("text/plain;charset=UTF-8"); PrintWriter out = response.getWriter(); out.println("ok10()"); out.printf("name: %s\n", name); out.printf("age: %d\n", age); out.printf("working: %b\n", working); } }
▶ 실행 방법:
http://localhost8080:/spring-web01/control/controller11/ok숫자.do?파라미터명=값&파라미터명=값
Request Handler(요청을 처리하는 메서드)의 파라미터들 II
/* Spring webMVC: Request Handler(요청을 처리하는 메서드)의 파라미터들 II - */ 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.RequestParam; @Controller @RequestMapping("/control/controller12/") public class Controller12 { // 클라이언트가 보낸 파라미터 값을 받는 방법 // 1) 보내는 데이터(요청 파라미터)의 이름과 같은 이름으로 아규먼트 이름을 짓는다. @RequestMapping("ok1") public void ok1(String name, int age, boolean working, HttpServletResponse response) throws Exception { response.setContentType("text/plain;charset=UTF-8"); PrintWriter out = response.getWriter(); out.println("ok1()"); out.printf("name: %s\n", name); out.printf("age: %d\n", age); out.printf("working: %b\n", working); } // 2) 보내는 데이터(요청 파라미터)의 이름과 아규먼트 이름이 다를 경우 // @RequestParam 애노테이션을 사용하여 그 이름을 지정할 수 있다. // 단, @RequestParam을 붙이는 순간 필수 항목이 된다. URL에 파라미터로 넘겨주지 않으면 오류 발생! @RequestMapping("ok2") public void ok2( @RequestParam(name="name") String n, @RequestParam(name="age")int a, @RequestParam(name="working")boolean w, HttpServletResponse response) throws Exception { response.setContentType("text/plain;charset=UTF-8"); PrintWriter out = response.getWriter(); out.println("ok2()"); out.printf("name: %s\n", n); out.printf("age: %d\n", a); out.printf("working: %b\n", w); } // 3) @RequestParam 애노테이션에서 요청 파라미터 값을 선택 항목으로 만들기 @RequestMapping("ok3") public void ok3( @RequestParam(name="name", required=false) String n, @RequestParam(name="age", required=false)int a, @RequestParam(name="working", required=false)boolean w, HttpServletResponse response) throws Exception { response.setContentType("text/plain;charset=UTF-8"); PrintWriter out = response.getWriter(); out.println("ok3()"); out.printf("name: %s\n", n); out.printf("age: %d\n", a); out.printf("working: %b\n", w); } // 4) @RequestParam 애노테이션에서 요청 파라미터의 기본(default) 값 지정하기 @RequestMapping("ok4") public void ok4( @RequestParam(name="name", required=false) String n, @RequestParam(name="age", required=false, defaultValue="0")int a, @RequestParam(name="working", required=false, defaultValue="false")boolean w, HttpServletResponse response) throws Exception { response.setContentType("text/plain;charset=UTF-8"); PrintWriter out = response.getWriter(); out.println("ok4()"); out.printf("name: %s\n", n); out.printf("age: %d\n", a); out.printf("working: %b\n", w); } // 5) 요청 파라미터 값을 바로 값 객체(Value Object; VO)에 저장하기 // VO 객체의 프로퍼티 이름과 일치하는 요청 파라미터를 찾아서 그 값을 넣어준다. // 누가? 프론트 컨트롤러가 Member 객체를 생성한 다음에 값을 넣어준다. @RequestMapping("ok5") public void ok5(Member member, HttpServletResponse response) throws Exception { response.setContentType("text/plain;charset=UTF-8"); PrintWriter out = response.getWriter(); out.println("ok5()"); out.printf("name: %s\n", member.getName()); out.printf("age: %d\n", member.getAge()); out.printf("working: %b\n", member.isWorking()); } }
ok5() 메서드 파라미터의 Member.class 작성하기
package control; public class Member { String name; int age; boolean working; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public boolean isWorking() { return working; } public void setWorking(boolean working) { this.working = working; } }
▶ 실행 방법:
http://localhost8080:/spring-web01/control/controller12/ok숫자.do?파라미터명=값&파라미터명=값
'Programming > java' 카테고리의 다른 글
[Java] Spring WebMVC: 페이지 컨트롤러(Page Controller)를 만들어 보자 II (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 |