본문으로 바로가기

MVC 란?


 

  • JSP와 Servlet을 모두 사용하여 프레젠테이션 로직(View)과 비즈니스 로직(Controller)을 분리한다.
  • View(보여지는 부분)는 HTML이 중심이 되는 JSP를 사용
  • Controller(다른 자바 클래스에 데이터를 넘겨주는 부분)는 Java 코드가 중심이 되는 Servlet을 사용
    비즈니스 로직 처리, DB에 접근 등의 요청을 처리한다.
  • Model은 Java Beans로, DTO와 DAO를 통해 Mysql과 같은 Data Storage에 접근
  • 구체적인 MVC 패턴은 MVC-Architecture 참고
  • JSP만을 이용하는 모델 / JSP와 Servlet을 모두 이용하는 모델 (MVC Architecture)
  • 출처

 

 

MVC 모델을 이용해 forward(위임) 동작 해보기


[Servlet]

1
2
3
4
5
6
7
8
9
10
11
12
@WebServlet("/el01")
public class El01Servlet extends HttpServlet{
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        
        req.setAttribute("myName""김구라");
        
        String path="/el/test01.jsp";
        RequestDispatcher rd=req.getRequestDispatcher(path);
        rd.forward(req, resp);
    }
}
cs

6행 : request객체에 setAttribute() 메소드로 key값과 value값을 담는다. "myName"이라는 key값으로 "김구라"라는 string type의 value 값이 담겨 있다.

8행 : forward(위임)할 경로를 path 변수에 담는다.

9행 : forward() 메소드를 사용하기 위해 RequestDispatcher 객체를 만든다.

10행 : RequestDispatcher 객체를 사용해 forward 메소드를 호출한다. forward 메소드로 클라이언트의 요청에 대한 응답을 위임할때는 반드시 request객체와, response 객체를 인자로 넣어야한다. 그래야 어떤 내용을 응답할지 출력해줄 수 있기 때문이다.

 

 

[JSP]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h3>EL 테스트 중...</h3>
<%
    //request에 "myName"이라는 키값으로 담긴 string type 읽어오기
    String myName=(String)request.getAttribute("myName");
%>
<p>myName: <strong><%=myName %></strong></p>
 
<p>myName: <strong>${requestScope.myName }</strong></p>
</body>
</html>
cs

11행~15행 : Markup 언어와 Java 언어로 request 객체에 "myName" 이라는 key값으로 담겨있는 value 값 출력

17행 : EL(expression language)로 requestScope(request영역)에 있는 "myName" 이라는 key값으로 담겨있는 value 값 출력.

출력 결과는 동일하다

 

 

 

MVC 모델을 이용해 redirect(재요청) 동작 해보기


[Servlet]

1
2
3
4
5
6
7
8
9
10
11
12
13
@WebServlet("/el03")
public class El03Servlet extends HttpServlet{
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //세션 영역에 String type 담기
        HttpSession session=req.getSession(); 
        session.setAttribute("myNick""호빵맨");
        //jsp 페이지로 리다이렉트 이동하기
        String cPath=req.getContextPath();
        resp.sendRedirect(cPath+"/el/test03.jsp");
    }
}
cs

6-7행 : session 영역에 "myNick" key값에 String type의 "호빵맨" value 값 담기

jsp에서는 session 객체가 기본으로 제공되지만 servlet에서는 제공되지 않는다. 따라서 request 객체를 통해 session 객체를 생성해 주어야한다.

9-10행 : 클라이언트의 요청에 대한 응답을 JSP 페이지로 redirect(재요청) 하기.

redirect 시에는 반드시 ContextPath를 작성해주어야한다.

 

 

[JSP]

1
2
3
4
5
6
7
8
9
10
11
@WebServlet("/el03")
<body>
<h3>EL 테스트 중...</h3>
<%
    String myNick=(String)session.getAttribute("myNick");
%>
<p> 세선에 저장된 별명 : <strong><%=myNick %></strong></p>
 
<%-- 위의 작업을 EL을 이용하면 아래와 같다 --%>
<p> 세션에 저장된 별명 : <strong>${sessionScope.myNick }</strong></p>
</body>
cs

4-7행 : Markup 언어와 Java 언어로 request 객체에 "myNick" 이라는 key값으로 담겨있는 value 값 출력

10행 : EL(expression language)로 requestScope(request영역)에 있는 "myNick" 이라는 key값으로 담겨있는 value 값 출력.

 

출력 결과는 동일하다

 

 

 

MVC 모델을 이용해 DTO 에 담겨 있는 내용 출력해보기


[Servlet]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@WebServlet("/el02")
public class El02Servlet extends HttpServlet{
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        UsersDto dto=new UsersDto();
        dto.setId("kimgura");
        dto.setEmail("aaa@naver.com");
        //request 영역에 dto 담기
        req.setAttribute("dto", dto);
        //jsp 페이지로 forward 이동
        RequestDispatcher rd=req.getRequestDispatcher("/el/test02.jsp");
        rd.forward(req, resp);
    }
}
cs

5-7행 : DTO 객체를 생성해서 ID와 Email 담기

9행 : request 객체에 "dto"라는 key값으로 value는 dto 객체를 담기

11-12행 : RequestDispatcher 객체를 생성하고, forward()메소드 req에 응답할 내용을 담아 "/el/test02.jsp" 로 응답 위임하기

 

 

[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
<body>
<h3>EL 테스트 중...</h3>
<%
    UsersDto dto=(UsersDto)request.getAttribute("dto");
%>
<p>
    아이디 : <strong><%=dto.getId() %></strong>
    이메일 : <strong><%=dto.getEmail() %></strong>
</p>
 
<%-- 위의 코드를 EL을 이용하면 아래와 같다 --%>
<p>

    아이디: <strong>${requestScope.dto.id }</strong> 

    이메일: <strong>${requestScope.dto.email }</strong>

</p>

<%-- requestScope KeyWord 생략 가능 --%>
<%-- 'dto.필드명' 으로 작성하면 알아서 getter 메소드를 불러와서 출력해 준다. --%>
<p>
    아이디: <strong>${dto.id }</strong> 
    이메일: <strong>${dto.email }</strong>
</p>
 
<%-- el을 사용하면 출력할 데이터가 없는 경우(null 값)은 찍지 않고 비워 놓는다. --%>
<p>
    아이디: <strong>${requestScope.dto.id }</strong> 
    이메일: <strong>${requestScope.dto.email }</strong>
    등록일: <strong>${requestScope.dto.regdate }</strong>
</p>
</body>
cs

3-9행 : Markup 언어와 Java 언어로 request 객체에 "dto" 라는 key값으로 담겨있는 value 값인 dto 객체의 참조값을 갖고와서 출력

10-16행 : requestScope에 담겨 있는 dto객체 필드에 있는 id값과 email값을 출력

17-22행 : EL을 이용해서 출력 이때, requestScope KeyWord 생략해도 JSP페이지에서 알아서 출력해준다.

24-28행 : dto 객체에 담지 않은 '등록일'을 출력 해보면 data가 없는 경우, null 값은 찍지 않고 비워놓는다.

 

 

결과값 출력