WebApp24 정리
/*========================
MVCBegin.java
========================*/
package com.svt;
import java.io.IOException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class MVCBegin extends HttpServlet
{
private static final long serialVersionUID = 1L;
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
// 사용자 요청이 get 방식일 때
doGetPost(request, response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
// 사용자 요청이 post 방식일 때
doGetPost(request, response);
}
// get, post 둘 다 실행되도록
protected void doGetPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
// 서블릿 관련 코딩
String message = "안녕하세요, MVC 패턴입니다 ~!!!";
request.setAttribute("message", message);
RequestDispatcher dispatcher = request.getRequestDispatcher("WEB-INF/view/MVCBegin.jsp");
dispatcher.forward(request, response);
}
}
첫 실습에서는 model 과 controller 이 합쳐진 형태로 실습을 진행하였다.
model 부분이 없다고 봐도 무방하다.
컨트롤러 역할에 해당하는 MVCBegin.java 코드를 보자.
public class MVCBegin extends HttpServlet
먼저 해당 클래스는 HttpSevlet 클래스를 상속 받는다.
HttpSevlet 클래스는 doGet 메소드와 doPost 메소드를 추상 메소드로 가지고 있다.
그런데 우리는 doGet 메소드를 호출해도 doPost 메소드를 호출해도
doGetPost 메소드가 호출되도록 코드를 추가하였다.
request.setAttribute("message", message);
View 역할을 수행하는 JSP 페이지에 데이터를 전달해야 하므로 setAttribute 메소드를 통해
전달할 데이터를 넣어준다.
RequestDispatcher dispatcher = request.getRequestDispatcher("WEB-INF/view/MVCBegin.jsp");
RequestDispatcher 클래스는 현재 클라이언트의 요청을 다른 서블릿/JSP 페이지로 전달하거나다른 서블릿/JSP 페이지의 결과를 현재 위치에 포함시키고자 할 때 사용된다.
RequestDispatcher 객체를 통해 제어권을 JSP 페이지(View)에 전달한다.
MVCBegin.jsp 페이지가 view 페이지가 될 것이므로 MVCBegin.jsp 의 경로를 넣어준다.
수업중에 여기서 의문이었던 점이 MVCBegin.java 파일은 Java Resources > src > com.svt 경로에 있고
MVCBegin.jsp 파일은 WebContent > WEB-INF > view 경로에 있는데
경로를 왜 같은 폴더 안에 있는 것 마냥 저렇게 써주는거지? 라는 점이었다.
그래서 선생님께 질문했고 이유는 다음과 같았다.
어차피 서블릿 클래스가 MVCBegin.java(클래스)를 객체화 시키는 경로가
WebContent 이므로 같은 경로에 있는 것이다!
따라서 경로를 WEB-INF/view/MVCBegin.jsp 라고만 써줘도 된다.
dispatcher.forward(request, response);
RequestDispatche 클래스의 forward 메소드를 통해 담은 요청과 결과(데이터들)를
MVCBegin.jsp 페이지로 전달한다.
모델2 구조는 바로 저 forward() 메소드를 통해 구현된다.
사용자가 처음 진입하는 지점이 Controller 이므로
web.xml (배치기술서)에 MVCBegin.java (서블릿) 을 등록해야 한다.
<?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>WebApp00</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<!-- MVCBegin -->
<servlet>
<servlet-name>MVCBegin</servlet-name>
<servlet-class>com.svt.MVCBegin</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>MVCBegin</servlet-name>
<url-pattern>/mvcbegin</url-pattern>
</servlet-mapping>
</web-app>
<servlet>
<servlet-name>MVCBegin</servlet-name>
<servlet-class>com.svt.MVCBegin</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>MVCBegin</servlet-name>
<url-pattern>/mvcbegin</url-pattern>
</servlet-mapping>
이렇게 서블릿을 등록해줘야 사용자가 /mvcbegin 경로를 통해
controller(자바 파일) 로 진입할 수 있당 ~~~
<%@ page contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%
request.setCharacterEncoding("UTF-8");
String cp = request.getContextPath();
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>MVCBegin.jsp</title>
<link rel="stylesheet" type="text/css" href="css/main.css">
</head>
<body>
<div>
<h1>MVC 실습</h1>
<hr />
</div>
<div>
<!-- 컨트롤러로부터 수신한 내용 -->
<h2>${message }</h2>
</div>
</body>
</html>
마지막으로 MVCBegin.jsp 페이지에서 JSTL Core 를 활용하여
MVCBegin.java 에서 받은 message 를 화면에 표현한다.