가제 : 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 의 값을 받을 수 있게 되는 것이다.
'쓰레기통 > [Web MVC 1] 모델1 - 모델2 진행과정' 카테고리의 다른 글
3. 프로젝트 생성, 톰캣으로 화면 보기까지 (0) | 2021.05.04 |
---|---|
7. 원시 Model2, MVC 출현 (2 - view 생성까지) (0) | 2021.05.04 |
5. 원시 Servlet (자바진영의 동적웹 탄생) (0) | 2021.04.22 |
4. 선행작업, member 와 repository (0) | 2021.04.22 |
2. 태초에 웹이 있었다 (0) | 2021.04.22 |