1. Model 1 개발방식
- 클라이언트 요청이 오면 웹 어플리케이션에서 JSP를 실행하고, 응답으로 보낸다.
- JSP : HTML 태그, Java코드가 함께 들어있다. (디자인요소 + 로직요소)
- HTML 태그 : 디자인 코드 / Java코드 : 로직 코드
- JSP를 실행해서 DB Access를 요청하고 Java 클래서 DAO에서 조회결과를 JSP로 반환해서 출력한다.
- 요청 하나 당 하나의 JSP가 존재한다.
2. Model 2 개발방식
- MVC 패턴을 적용한 웹 애플리케이션 개발 방식
- 클라이언트 요청이 오면 웹 어플리케이션에서 JSP와 서블릿, Java 클래스를 실행하고, 응답으로 보낸다.
- Model / Controller / View / Front Controller로 구성되어 있다.
- JSP : HTML 태그만 들어있다. (디자인요소) , EL +JSTL(태그)을 이용한다 , View 역할을 한다.
- HTML 태그 : 디자인 코드
- 서블릿 : Front Controller 역할을 수행한다.
- JAVA 클래스: Controller 역할을 수행한다.
- JAVA 클래스 (Service + DAO) : Model 역할을 수행한다.
MVC패턴
- M(Model) : 업무로직 수행, 뷰에 표현할 데이터 제공
/ 뷰에서 표현하는 데이터 그 자체 (데이터 혹은 데이터를 획득하는 과정 자체)- V(View) : Model에서 제공하는 데이터를 표현
- C(Controller) : 클라이언트(HTTP)의 요청 처리 담당
Front Controller
- 서블릿 혹은 필터로 구현
- 클라이언트의 요청을 접수 받는다.
- 클라이언트의 요청을 분석해서 적절한 Controller를 실행한다.
- 요청처리가 완료되면 View로 내부이동 , 재요청 URL 응답으로 보낸다.
- 프레임워크에서 제공한다.
Controller
- 클라이언트의 요청을 처리한다.
- 클라이언트의 요청 : 요청파라미터값 조회 , 세션에서 로그인된 사용자 정보 조회, 내부이동 할 JSP 페이지,재요청할 URL을 제공
- 클라이언트의 요청을 처리하기 위해서 업무로직 메소드를 호출
- Model이 반환하는 데이터를 View에 전달
- FrontController에 내부이동할 JSP 혹은 재요청 URL 제공
View
- JSP 구현
- Controller가 전달한 Model의 데이터를 표현한다.
- HTML 컨텐츠를 생성해서 응답으로 제공한다.
Model
- View에 표현할 데이터
- View에 표현할 데이터를 획득하는 작업(업무로직)
package com.sample.model2;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import com.sample.controller.HomeController;
import com.sample.controller.LoginFormcontroller;
import com.sample.controller.RegisterFormController;
import jakarta.servlet.ServletConfig;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
public class FrontController extends HttpServlet {
private Map<String, Controller> controllerMap = new HashMap<>();
/**
* 서블릿의 초기화 메소드다.<br/>
* 서블릿 객체가 생성되면 톰캣이 딱 한번 호출해서 서블릿을 초기화시킨다.<br/>
* 초기화 : FrontController가 되기 위해 준비하는 것.(필요한 객체를 미리 만들거나 멤버변수에 값을 담는 것)
*/
@Override
public void init(ServletConfig config) throws ServletException {
controllerMap.put("/home.hta", new HomeController());
controllerMap.put("/register-form.hta", new RegisterFormController());
controllerMap.put("/login-form.hta", new LoginFormcontroller());
}
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("### FrontController의 service(request, response) 메소드 실행.");
//////////////////////////////////////////////
// 요청 URI 분석하기
//////////////////////////////////////////////
// Context Path 조회하기(웹애플리케이션을 구분하는 고유한 경로다. 보통은 프로젝트명과 동일하다.) 조회하기
String contextPath = request.getContextPath();
System.out.println("### contextPath: " + contextPath);
// 요청 URI 조회하기
String requestURI = request.getRequestURI();
requestURI = requestURI.replace(contextPath, "");
System.out.println("### 요청 URI: " + requestURI);
//////////////////////////////////////////////
// 컨트롤러 실행하기
//////////////////////////////////////////////
try {
// HashMap 객체에 저장된 Controller 인터페이스 구현객체 꺼내기
Controller controller = controllerMap.get(requestURI);
// 조회된 컨트롤러 객체의 execute(request, response);
controller.execute(request, response);
} catch (Exception e) {
throw new ServletException(e);
}
}
}
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="https://jakarta.ee/xml/ns/jakartaee" xmlns:web="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-app_5_0.xsd http://xmlns.jcp.org/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="5.0">
<!--
FrontContoller 서블릿을 웹서버(톰캣)에 배포하기
- FrontController 서블릿은 *.hta 형식의 HTTP 요청이 접수되면 실행되도록 배포한다.
-->
<servlet>
<servlet-name>fc</servlet-name>
<servlet-class>com.sample.model2.FrontController</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>fc</servlet-name>
<url-pattern>*.hta</url-pattern>
</servlet-mapping>
</web-app>
<URI분석/조회하기>
<실행 결과>
contextPath는 대부분 파일명과 동일하다.
절대 이제는 .jsp로 주소를 검색하지 않는다. / jsp는 진입점이 아닌 맨 마지막에 표현을 해주는 기능을 한다.
URI : 임의로 만드는 것.
package com.sample.controller;
import com.sample.model2.Controller;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
public class HomeController implements Controller{
@Override
public String execute(HttpServletRequest request, HttpServletResponse response) throws Exception {
System.out.println("### HomeController의 execute(request, response) 실행");
return null;
}
}
package com.sample.controller;
import com.sample.model2.Controller;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
public class LoginFormcontroller implements Controller {
@Override
public String execute(HttpServletRequest request, HttpServletResponse response) throws Exception {
System.out.println("### LoginFormController의 execute(request, response) 실행");
return null;
}
}
package com.sample.controller;
import com.sample.model2.Controller;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
public class RegisterFormController implements Controller {
@Override
public String execute(HttpServletRequest request, HttpServletResponse response) throws Exception {
System.out.println("### RegisterFormController의 execute(request, response) 실행");
return null;
}
}
실행결과
HttpServletRequest : 속성을 저장할 수 있다.
home.hta 호출시
home.jsp 호출시