본문 바로가기
Front-end/JSP

JSP Model2 (MVC)

by bloodFinger 2020. 1. 29.

MVC의 의미

Model : db에 접근을 담당

View : 화면 출력을 담당(JSP)

Controller : 어떤 View를 뿌려줄지 담당, 클라이언트의 요청을 받고 적절한 Model에 지시를 내려 전달된 데이터를  View에 전달

 

 

 

 

일단 정확히 모델1 과 모델2이 어떤 차이점을 가지고 있는지에 대해서 정확히 알고 넘어가자 

 

Model 1

 

Model 2 (MVC)

 

사진을 보면 어떤 차이점이 보일까요?

 

위에는 뷰와 컨트롤러가 함께있고 아래에서는 뷰와 컨트롤러가 분리되어있습니다.

즉 Model2 에서는 코드를 분리하고 각각의 역할을 객체지향적으로 확실히 만들었습니다.

 

이로서 코드의 재사용성이 증가하고 코드관리가 쉬워지겠죠? 하지만 대형프로젝트가 아닌 소규모의 프로젝트에서는 Model2는 부적합한

디자인이라고 생각합니다.

만약 포토폴리오 페이지를 만든다고 할때 굳이 이렇게 만들필요없이 간단히 Model1을 사용하는게 좋겠습니다.

즉 어떤 홈페이지를 구현 할지에 대한 생각을 하고 model 을 선택하면 되겠습니다.

 

 

그러면 실제로 JSP Model2는 어떻게 돌아가는지 봅시다!

환경설정 파일을 만들어 입력URL과 이동할 Action을 적어줍니다.

 

Servlet

package com.control;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Properties;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


public class ControlServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
	private Map<String, Object> map = new HashMap<String, Object>();
	
	@Override
	public void init(ServletConfig config) throws ServletException {
		String propertyConfig = config.getInitParameter("propertyConfig"); //프로퍼티즈 내용을 읽는다.
		System.out.println("propertyConfig = "+propertyConfig+"\n");
		
		FileInputStream fin = null;
		Properties properties = new Properties();
		
		try {
			fin = new FileInputStream(propertyConfig);
			properties.load(fin);
			System.out.println("properties = "+properties);
			
		} catch (IOException e) {
			e.printStackTrace();
		}finally{
			try {
				fin.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		System.out.println();
		
		Iterator it = properties.keySet().iterator();
		while(it.hasNext()) {
			String key = (String)it.next();
			System.out.println("key = "+key);
			
			String className = properties.getProperty(key);
			System.out.println("className = "+className);
			
			try {
				//Class classType = Class.forName(className);
				//Object ob = classType.newInstance(); - @Deprecated

				//Class<?> classType = Class.forName(className);
				//Object ob = classType.getDeclaredConstructor().newInstance();

				Class<?> classType = Class.forName(className);
				Object ob = classType.newInstance();
				
				System.out.println("ob = "+ob);
				
				map.put(key, ob);
				
			} catch (ClassNotFoundException e) {
				e.printStackTrace();
			} catch (InstantiationException e) {
				e.printStackTrace();
			} catch (IllegalAccessException e) {
				e.printStackTrace();
			} catch (IllegalArgumentException e) {
				e.printStackTrace();
			} 
			//catch (InvocationTargetException e) {
			//	e.printStackTrace();
			//} catch (NoSuchMethodException e) {
			//	e.printStackTrace();
			//} catch (SecurityException e) {
			//	e.printStackTrace();
			//}
			
			System.out.println();
		}//while
	}

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		execute(request, response);
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		execute(request, response);
	}

	//doget,dopost 하는일이 똑같기에 한곳으로모은다.
	protected void execute(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println();
		
		//
		if(request.getMethod().equals("POST")){
			request.setCharacterEncoding("UTF-8");
		}
		
		//http://localhost:8080/miniproject/main/index.do 
		String category = request.getServletPath(); // /board/writeForm.do이만큼을 잘라온다
		System.out.println("category = "+category);
		
		CommandProcess commandProcess = (CommandProcess)map.get(category);
		System.out.println("commandProcess = "+commandProcess);
		
		String view = null;
		try {
			view = commandProcess.requestPro(request, response); //보모가 자식클래스 요청(jsp 파일을 가져온다)
		} catch (Throwable e) {
			e.printStackTrace();
		}
		
		//forward	
		RequestDispatcher dispatcher = request.getRequestDispatcher(view); //.jsp 파일을 포워드
		dispatcher.forward(request, response);//
		
		
	}
}

 

 서블릿은 환경설정파일을 읽고 모든 내용을 Map에 key와 value로 저장을 해놓습니다.

그 후에 요청되는 URL의 값이 Controller를 통해 나온 경로를 map에서 꺼내 forward 를 해줍니다!!

그렇다면 요청한 URL은 변경없이 forward된 페이지로 이동합니다

 

 

만약 리다이렉트와 포워드의 개념을 잘모르겠다 싶다면 읽어보세요. 참고하시면 많은 도움이 될껍니다~!

https://doublesprogramming.tistory.com/63

 

Redirect VS, Forward (Redirect와 forward의 차이)

Redirect VS, Forward (Redirect와 forward의 차이) JSP환경에서 현재 작업중인 페이지에서 다른페이지로 이동하는 두가지 방식의 페이지 전환기능 사례를 통해 redirect와 forward의 차이점에 대해 감을 잡아보자..

doublesprogramming.tistory.com

 

 

 

'Front-end > JSP' 카테고리의 다른 글

JSP 이메일 보내기  (2) 2020.01.13