■ 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");
}
}
GET 요청과 POST 요청을 가능하게 해주는 html 코드 I
*참고 : .html 같은 정적파일은 webapp 폴더 아래에 생성해줘야 합니다.
<!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://localhost:8080/spring-web01/controller05.html
GET 요청 버튼을 클릭하면 화면에 get 문장이 출력되고
POST 요청 버튼을 클릭하면 화면에 post 문장이 출력됩니다.
요청 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 요청 헤더
- 웹 브라우저가 웹 서버에게 요구하는 콘텐트의 타입을 가리킵니다.
▶ produces란?
- 이 메서드를 생산하는 콘텐트의 타입을 가리킵니다.
Accept 헤더의 값에 따라 호출될 메서드를 결정하는 html 코드
<!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?파라미터명=값&파라미터명=값