IT story/Spring

[Spring 강의] L02 Controller

jason719 2016. 12. 13. 23:27

2016. 12. 13. (Tue)

[Spring 강의] L02 Controller

이번 수업에서는 @RequestMapping()을 호출해보고, 숫자와 문자열의 파라미터를 받아보는 것을 실습한다.
그리고 숫자 및 문자열이 NULL값으로 올 때 어떻게 되는지 알아보자!
정보를 BEAN으로 받아와보고 model을 이용해 내장객체 파라미터를 담아보자!

지금까지는 index.jsp에 강의의 목차를 적어놨었다. Spring에서는 Home.jsp가 그 역할을 대신한다.
Home.jsp의 내용을 살펴보자!
1번줄의 page 지시자는 자동생성이 되지 않는다. 작성하지 않으면 한글이 깨지니 주의하자!
ex) Home.jsp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
<%@ page contentType="text/html; charset=UTF-8" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ page session="false" %>
<html>
<head>
    <title>Home</title>
</head>
<body>
<h1>
    Hello world!  
</h1>
 
<P>  The time on the server is ${serverTime}. </P>
<hr />
<h1>Controller에 대해 배워보자</h1>
<h3><a href="requestTest.do">1.@RequestMapping()을 호출하자 requestTest.do</a></h3>
<hr />
<h3><a href="paramTest.do?num=10">2.int 타입의 파라미터를 controller에서 받아보자</a></h3>
<h3><a href="paramTestRedirect.do?num=10">3.L02ParamTest.jsp를 redirect로 이동하자</a></h3>
<hr />
<h3><a href="stringParam.do?id=springLesson">4.문자열 타입의 파라미터를 넘겨 보자</a></h3>
<h3><a href="stringParam.do">5.매개변수의 데이터타입으로 문자열을 지정한 변수에 null을 보내보자</a></h3>
<h3><a href="paramTest.do">6.매개변수의 데이터타입으로 int를 지정한 변수에 null을 보내보자</a></h3>
<hr />
<h3><a href="requestParam.do?id=springTest">7.@RequestParam으로 id를 파라미터로 꼭 받도록 지정해보자</a></h3>
<h3><a href="requestParam.do">8.Param id를 생략하자</a></h3>
<hr />
<h3><a href="voParam.do?id=spring&pwd=1234&num=1">9.Servlet에서 id, pwd, num을 LoginVo로 받아보자</a></h3>
<h3><a href="modelParam.do?id=spring&pwd=1234&num=1">10.Model을 이용해서 내장객체에 파라미터를 담자</a></h3>
<h3><a href="modelAttri.do?id=spring&pwd=1234&num=1">11.@ModelAttribute("LoginVo")</a></h3>
<hr />
<h3><a href="L04VoParam?id=spring&pwd=1234&num=1">12.return 타입이 void인 함수로 호출하자</a></h3>
<hr />
<h3><a href="user/springLesson/3">13.restfulWeb 형식의 url을 넘겨보자</a></h3>
 
</body>
</html>
cs
src/main/java에 새로운 Package를 생성한다.

1. com.spring.controller 생성

2. Package안에 L01Controller.java class file을 생성한다. 아래의 내용을 살펴보자! 자세한 내용은 주석을 참고!

ex) L01Controller.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
package com.spring.controller;
 
import java.util.Map;
 
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;
 
import com.spring.vo.LoginVo;
 
@Controller
public class L01Controller {
    //method는 생략 가능, 생략시 get방식 post방식 모두 받을 수 있다.
    @RequestMapping(value="/requestTest.do", method=RequestMethod.GET)
    public String requestTest() {
        return "L01RequestTest";
    }
    @RequestMapping("paramTest.do")
    public String paramTest(int num) { //변수 이름을 key와 동일하게 지정하면 자동으로 파라미터를 받는다.
        /*int num = Integer.parseInt(request.getParameter("num"));*/
        System.out.println("num x 10 :"+(num*10));
        return "L02ParamTest";
    }
    @RequestMapping("paramTestRedirect.do")
    public String paramTestRedirect(int num) { //변수 이름을 key와 동일하게 지정하면 자동으로 파라미터를 받는다.
        /*int num = Integer.parseInt(request.getParameter("num"));*/
        //redirect를 특정 url 즉 web이 제공하고 있는 url을 의미한다.
        //spring은 view를 url로 제공하지 않는다.
        //L02ParamTest.jsp를 호출하기 위해서는 꼭 해당 jsp를 호출하는 서블릿을 호출해야한다.
        return "redirect:paramTest.do?num="+num;
    }
    @RequestMapping("/stringParam.do")
    public String stringParam(String id) {
        System.out.println("id: "+id);
        return "L03StringParam";
    }
    @RequestMapping("/requestParam.do")
    public String requestParam(@RequestParam("id"String id) {
        //key id인 파라미터를 꼭 받아라!
        //만약 파라미터를 보내지 않으면 요청 오류인 400이 뜬다.
        //@RequestParam(required=false)id를 꼭 보내지 않아도 된다.
        System.out.println("id: "+id);
        return "L03StringParam";
    }
    @RequestMapping("/voParam.do")
    public String voParam(@ModelAttribute LoginVo vo) {
        //@ModelAttribute 생략가능
        /* 아래 과정이 생략됨
            vo.setId(request.getParamater("id"));
            vo.setNum(Integer.parseInt(request.getParamater("id")));
            vo.setPwd(request.getParamater("pwd"));*/
 
        System.out.println("id: "+vo.getId());
        System.out.println("pwd: "+vo.getPwd());
        System.out.println("num: "+vo.getNum());
        return "L04VoParam";
    }
    @RequestMapping("/modelParam.do")
    public String modelParam(@ModelAttribute LoginVo vo, Model model) {
        
        System.out.println("id: "+vo.getId());
        System.out.println("pwd: "+vo.getPwd());
        System.out.println("num: "+vo.getNum());
        model.addAttribute("LoginVo",vo);
        //forward 방식으로 request 내장 객체에 파라미터 전달
        //redirect 방식으로 통신할 때 url로 파라미터를 전달
        return "L04VoParam";
    }
    @RequestMapping("/modelAttri.do")
    public String modelAttri(@ModelAttribute("LoginVo") LoginVo vo) {
 
        System.out.println("id: "+vo.getId());
        System.out.println("pwd: "+vo.getPwd());
        System.out.println("num: "+vo.getNum());
        return "L04VoParam";
    }
    @RequestMapping("/L04VoParam")
    public void l04VoParam(@ModelAttribute("LoginVo") LoginVo vo) {
        //url과 jsp 페이지의 이름이 같으면 void 타입으로 지정해도 된다. -> but 이렇게 거의 사용하지 않는다.
        System.out.println("id: "+vo.getId());
        System.out.println("pwd: "+vo.getPwd());
        System.out.println("num: "+vo.getNum());
    }
    
    //user?num=1&page=2;
    @RequestMapping("/user/{id}/{page}")
    public String restfulWeb(@PathVariable("id"String id, @PathVariable("page"int page) {
        //url의 가독성이 좋아지고, 파라미터가 깨질 염려가 없다. 스프링 뿐만 아니라 웹 전반적인 기술이다. 
        System.out.println("id: "+id);
        System.out.println("page: "+page);
        return "L05RestfulWeb";
    }
    
    //스프링 초기버전에 사용되던 Controller 기술 ModelAndView
    @RequestMapping("/modelAndViewTest.do")
    public ModelAndView modelAndViewTest(LoginVo vo) {
        ModelAndView model = new ModelAndView();
        model.addObject("LoginVo",vo);
        model.setViewName("L04VoParam"); //생성자 작성시 넣어도 된다. ModelAndView model = new ModelAndView("L04VoParam");
        return model;
    }
}
 
cs



각 @RequestMapping이 화면에 출력되도록 아래와 같이 4개의 jsp를 생성한다.

L01RequestTest.jsp, L02ParamTest.jsp, L03StringParam.jsp, L04VoParam.jsp

ex) L01RequestTest.jsp

1
2
3
4
5
6
7
8
9
10
11
12
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>requestTest.do</title>
</head>
<body>
    <h1>L01RequestTest.jsp를 호출했습니다.</h1>
</body>
</html>
cs

ex) L02ParamTest.jsp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>paramTest.do</title>
</head>
<body>
    <h1>L02ParamTest.jsp를 호출했습니다.</h1>
    <!-- forward 방식으로 jsp를 호출했기 때문에 파라미터는 그대로 남아있다. -->
    <h3>num : ${param.num }</h3>
</body>
</html>
cs

ex) L03StringParam.jsp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>stringParam.do</title>
</head>
<body>
    <h1>L03StringParam.jsp를 호출했습니다.</h1>
    <!-- forward 방식으로 jsp를 호출했기 때문에 파라미터는 그대로 남아있다. -->
    <h3>id : ${param.id }</h3>
</body>
</html>
cs

ex) L04VoParam.jsp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>voParam.do</title>
</head>
<body>
    <h1>L04VoParam.jsp를 호출했습니다.</h1>
    <!-- forward 방식으로 jsp를 호출했기 때문에 파라미터는 그대로 남아있다. -->
    <h3>param.id : ${param.id }</h3>
    <h3>param.pwd : ${param.pwd }</h3>
    <h3>param.num : ${param.num }</h3>
    <hr />
    <h1>request.setAttribute("LoginVo",LgoinVo)</h1>
    <h3>LoginVo.id : ${LoginVo.id }</h3>
    <h3>LoginVo.pwd : ${LoginVo.pwd }</h3>
    <h3>LoginVo.num : ${LoginVo.num }</h3>
</body>
</html>
cs

출력화면은 아래와 같다.

Home.jsp 출력화면!!



1. @RequestMapping()을 호출할때 출력화면

2. int 타입의 파라미터를 받아온 출력화면

3. redirect로 이동

4. 문자열 타입의 파라미터를 받아온 출력화면

5. 문자열 타입의 파라미터 값이 Null값 일때 출력화면

6. 숫자 타입의 파라미터 값이 Null값 일때!


7. @RequestParam으로 id 값을 꼭 받아오기

8. Param id를 생략했을 때 오류화면

9. BEAN으로 정보 받아오기

10. model을 이용해 내장객체에 정보 담아오기

11. @ModelAttrivute("LoginVo")


12. return 타입이 void인 함수로 호출

13. restful Web 형식의 url을 넘겨보자