쓰레기통/[Web MVC 1] 모델1 - 모델2 진행과정

7. 원시 Model2, MVC 출현 (1 - view 생성까지)

고인돌개발자 2021. 4. 22. 18:10

가제 : Jsp 가 너무 힘들어해, 짐을 나눠지자 (Jsp + 서블릿)

학습목표 : M V C 를 흉내내보자.

 (실제 MVC 를 프로그램 구현 단계에서 칼로 자르듯이 구분하는건 애매한듯.., 그래서 내 맘대로.. MVC)
              Model : VO, Repository (움직이는 데이타 영역)
              View   : 보여지는 부분, html, jsp
              Control : 요청에 대한 처리 부분 
              

어쩌면 오늘 배울것들은 지난번 Servlet + jsp 하이브리드 일듯하네요.

1. 패키지 추가 
   comm.study.mvc
    - comm.study.mvc.ver1 (mvc 흉내내기)

 

2. index.html 에 테스트 하도록 추가 

<table>
	<tr><th>MVC - ver1 (Servlet+Jsp 로 mvc 흉내내기)</th></tr>
	<tr><td> - <a href="/mvc/join.html">회원가입</a></td></tr>
	<tr><td> - <a href="/mvc/ver1/member_list">회원List</a></td></tr>
</table>

 

3. WebContent 에 mvc 폴더 추가,  mvc > join.html 생성 (기존것 카피하고 form action 만 변경)

<form action="/mvc/ver1/new_member" method="post">

 

4. WEB-INF 아래 폴더 추가하고 파일 생성 ( jsp 폴더 아래 있는 member_regist.jsp 를 아래 파일로 이름 변경하여 생성)

/WEB-INF/views/mvc/servletJoin_ver1_result.jsp

 

5. Servlet | comm.study.mvc.ver1 > ServletJoin_ver1.java (기존에 사용한 ServletJoin.java 복/붙)

   - 여기서는 받아서 처리하는건 동일하게 하고 결과로 보여지는 화면을 jsp 로 보여준다.

 

package com.study.mvc.ver1;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.study.comm.repository.Repository_member;
import com.study.comm.vo.Members;

/**
 * Servlet implementation class ServletJoin
 */
@WebServlet("/mvc/ver1/new_member")
public class ServletJoin_ver1 extends HttpServlet {
	
	private static final long serialVersionUID = 1L;
	
	/* Repository_member 객체를 얻어온다 */
	private Repository_member repository_member = new Repository_member();
    
    public ServletJoin_ver1() {
        super();    
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		System.out.println("ServletJoin_ver1 Start position");		
		
		/* get Request value, jsp 의 request 받는것과 동일하다. */
		String  userName  = request.getParameter("input_name"); 
		int     userAge   = Integer.parseInt(request.getParameter("input_age")); 
		String userMobile = request.getParameter("input_mobile");
		
		System.out.println("request value = "+ userName +"/" + Integer.toString(userAge) + "/" + userMobile);
		
		/* Members 변수는 생성자를 통해 한방에 넣는다. */
		Members members = new Members(userName, userAge, userMobile);
		
		/* 값을 List 에 저장하여 아래에 뿌려줄때 사용 */
		repository_member.setSave(members); 
		
		/* 아래가 바로 초창기 Servlet 의 위엄... */
		
		/* 여기 아래 부분을 View 역할을 하는 jsp 로 던진다. 
		 * 던지는 방식은 2가지. 
		 * 1. forward (MVC 가 사용하는건 forward 이다. ) 
		 * 2. sendredirect
		 * */
		response.setContentType("text/html");
		response.setCharacterEncoding("utf-8");
		/* forward 방식 
		 * 고인물이라  왜 jsp를  WEB-INF 에 넣는지 몰랐는데.. 여기에 넣으면 외부에서 접근이 안되어, 소스보안이 됩니다. 
		 * 한번 해보세요. 외부에서 url 로 http://localhost:8080/WEB-INF/views/mvc/servletJoin_ver1_result.jsp 로 하면 안보임.. 
		 * */
		 RequestDispatcher dispatcher = request.getRequestDispatcher("/WEB-INF/views/mvc/servletJoin_ver1_result.jsp");
		 dispatcher.forward(request, response);
		
		/* sendRedirect 방식 
		 * sendRedirect 는 jsp 로 개발을 할때 자주 사용하던 방식이었다. 
		 * 하지만, MVC 에서는 사용하지 않는다고 보면 된다. 
		 * 이유는 간단하다. /WEB-INF 가 외부에서 보이지 않기 때문이고 (단, /WEB-INF 가 아닌 다른 폴더의 jsp 를 호출한다면 보여줄 수는 있다.) 
		 * 또한가지는 어떤 jsp 를 호출했는지 브라우저창에 보여주고 싶지 않기 때문이다.
		 * */
		 //response.sendRedirect("/WEB-INF/views/mvc/servletJoin_ver1_result.jsp");
		
	}

	/**
	 * 모든 처리를 doGet 에서 처리하도록 하기 위해 아래 doPost 에서 받은 request, response 값을 doPost 로 던져준다.
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}

}

 

6. View : servletJoin_ver1_result.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>

<%

/* 생각해보니  신기하게도 jsp 는 그 자체로 , HttpServlet 을 상속받나 봐요.. */

String  userName  = request.getParameter("input_name"); 
int     userAge   = Integer.parseInt(request.getParameter("input_age")); 
String userMobile = request.getParameter("input_mobile");


%>

<html>
<head>
<meta charset="UTF-8">
<title>새로운 회원을 맞이하세</title>
</head>
<body>
<a href="/index.html">[Go Home]</a>
<p>
package com.study.mvc.ver1;<br>
/WEB-INF/views/mvc/servletJoin_ver1_result.jsp<br>
환영합니다. <p>

이름 : <%=userName %><br>
나이 : <%=userAge %><br>
모바일 : <%=userMobile %>

</body>
</html>

 

7. 지금까지 디렉토리 구조

 

7. 여기까지 하고 해당 기능을 실행해보면, servletJoin_ver1_result.jsp 를 수정하지 않았는데도 불구하고 

   jsp 단계에서 했던것 처럼 오류 없이 실행이 된다. 

   신기하게도.. 

  이것이 바로 forward 의 비밀이다. 

 

 forward 는 sendRedirect 와는 달리, 

 client로 부터 요청받은 http 내용을 그대로 유지하여, view 의 jsp에게 던져준다.

 이런 이유로, 가입시 받았던 request 의 값이 jsp 에게까지 이어져서, request 의 값을 받을 수 있게 되는 것이다.