Day 76

ChangWoo·2022년 12월 21일
0

중앙 HTA

목록 보기
20/51
post-thumbnail

웹 어플리케이션 개방방식

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분석/조회하기>

  • URI란? : URL과 달리 임의로 만드는 것을 말한다.

<실행 결과>

  • 요청 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 : 속성을 저장할 수 있다.

  • 요청객체를 모두 공유하고 있다.
  • 요청객체를 데이터를 전달하는 용도로 사용한다.
  • 속성은 setAttribute로 언제나 사용 가능하다. (담기 / 쓰기 / 지우기 다 가능!)
  • 요청파라미터는 읽기만 가능하다.

EL

  • Controller(속성)에서 OO으로 저장된 것을 꺼내서 표현된다.
  • 표현방법 ${OO }
  • jsp에 있는 값을 Controller를 통해 나타내주는 것.
  • 그래서 바로 jsp를 호출하면 OO이 나타나지 않는다.

home.hta 호출시

home.jsp 호출시

  • home.jsp를 WEB-INF 밑에 넣으면 따로 구현되지 못하게 되므로 넣어 놓는다.
  • WEB-INF/views 폴더에 home.jsp를 넣고 home.hta를 실행해도 결과는 같다.

JSP의 속성과 스코프

속성

  • 속성은 객체(값)다.
  • 속성은 뷰에 표현할 정보다.
  • JSP는 속성(값, 객체)을 저장할 수 있는 4종류의 객체를 제공한다.

스코프

  • session 객체에 담아 놓은 것은 안지워진다.
  • 요청객체는
profile
한 걸음 한 걸음 나아가는 개발자

0개의 댓글