Java

mvc 패턴

걷는 청년 2024. 7. 30. 17:44

오늘은 mvc 패턴에 대해서 배웠다.

mvc란 MVC 는 Model, View, Controller의 약자이고 이 세가지는

 

모델: 데이터와 비즈니스 로직을 관리한다.
뷰: 레이아웃과 화면을 처리한다.
컨트롤러: 모델과 뷰로 명령을 전달한다.

이렇게 구분 지을 수 있다.

 

 

 

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
MVC 패턴 연습<br>
자료 입력<br>
<form action="GoMvc" method="post">
	이름 : <input type="text" name="name" value="korea">
	<input type="submit">
</form>
<br>
<a href="GoMvc">get 요청 1</a><br>
<a href="GoMvc?name=korea">get 요청 2</a><br>
<a href="GoMvc?name=tom">get 요청 3</a><br>

</body>
</html>

gomvc.html

 

 

package pack;

import java.io.IOException;

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;

@WebServlet("/GoMvc")
public class GoMvc extends HttpServlet {	// Controller 역할
	private static final long serialVersionUID = 1L;

	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		
		String result = "", viewName = "/WEB-INF/";
		String name;
		
		try {
			name = request.getParameter("name");
		} catch (Exception e) {
			name = null;
		}
		
		// 클라이언트의 요청을 받아 분석(판단) : 모델과 뷰를 선택하는 기능 기술
		if(name == null || name.equals("")) {
			result = "환영합니다";	// Model(Business Logic)을 수행한 결과라 가정
			viewName += "views/view1.jsp";
		}else if(name.equals("korea")){
			result = "한국인이군요";
			viewName += "views/view2.jsp";
		}else {
			result = name + "님 반가워요";
			viewName += "views/view3.jsp";
		}
		
		request.setAttribute("result", result);
		RequestDispatcher dispatcher = request.getRequestDispatcher(viewName);
		dispatcher.forward(request, response);
		
		
	}

}

GoMvc.java (servlet)

 

 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
뷰1 결과<br>
예전 방식 : <%=request.getAttribute("result")%><br>
EL 사용 : ${result}
</body>
</html>

 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
뷰2 결과<br>
EL 사용 : ${result}
</body>
</html>

 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
뷰3 결과<br>
${result}
</body>
</html>

 

view1.jsp, view2.jsp, view3.jsp

 

 

참고로 maven으로 프로젝트를 바꿔주고 pom.xml에는 따로 이렇게 추가해주었다.

<project xmlns="http://maven.apache.org/POM/4.0.0"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>wmvc4sangpum</groupId>
	<artifactId>wmvc4sangpum</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>war</packaging>
	<build>
		<plugins>
			<plugin>
				<artifactId>maven-compiler-plugin</artifactId>
				<version>3.8.1</version>
				<configuration>
					<release>17</release>
				</configuration>
			</plugin>
			<plugin>
				<artifactId>maven-war-plugin</artifactId>
				<version>3.2.3</version>
			</plugin>
		</plugins>
	</build>
	<dependencies>
		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>javax.servlet-api</artifactId>
			<version>4.0.1</version>
		</dependency>

		<dependency>
			<groupId>javax.servlet.jsp</groupId>
			<artifactId>javax.servlet.jsp-api</artifactId>
			<version>2.3.3</version>
		</dependency>

		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>jstl</artifactId>
			<version>1.2</version>
		</dependency>

		<dependency>
			<groupId>org.mariadb.jdbc</groupId>
			<artifactId>mariadb-java-client</artifactId>
			<version>3.4.0</version>
		</dependency>

		<dependency>
			<groupId>org.mybatis</groupId>
			<artifactId>mybatis</artifactId>
			<version>3.5.16</version>
		</dependency>

	</dependencies>
</project>

 

 

 

여러가지 실습 중 가장 마지막에 한 실습도 보여주자면 이렇다.

 

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<!-- 
<a href="sang.do?command=sang">상품 보기</a>
<a href="jikwon.do?command=jikwon">직원 보기</a>
 -->

<a href="sang.do">상품 보기</a>
<a href="jikwon.do">직원 보기</a>
</body>
</html>

 

 

 

package pack.controller;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public interface CommandInter {
	String showData(HttpServletRequest request, HttpServletResponse response) throws Exception;
	
}

 

package pack.controller;

import java.io.IOException;
import java.util.StringTokenizer;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("*.do")
public class ComtrollerService extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// 방법 1 : parameter 사용
		//String command = request.getParameter("command");
		
		// 방법 2 : 파일명을 요청으로 사용
		String ss = request.getRequestURI();
		// /wmvc4sangpum/sang.do
		int idx = ss.lastIndexOf('/');
		StringTokenizer st = new StringTokenizer(ss.substring(idx + 1), ".");
		ss = st.nextToken();
		//System.out.println("ss : " + ss);	// sang
		
		String command = ss;
		CommandInter inter = null;
		String viewName = "/WEB-INF/views/";
		
		try {
			if(command.equals("sang")) {
				inter = new SangpumImpl();
				viewName += inter.showData(request, response);
				request.getRequestDispatcher(viewName).forward(request, response);
			}else if(command.equals("jikwon")) {
				// ...
			}else {
				viewName = "error.html";
				response.sendRedirect(viewName);
			}
		} catch (Exception e) {
			System.out.println("service err : " + e);
		}
		
	}

}

 

package pack.controller;

import java.util.ArrayList;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import pack.model.SangpumDto;
import pack.model.SangpumModel;

public class SangpumImpl implements CommandInter{
	// Model과 통신하기 위한 Controller 영역 내 클래스
	
	@Override
	public String showData(HttpServletRequest request, HttpServletResponse response) throws Exception {
		SangpumModel sangpumModel = new SangpumModel();	// 싱글톤을 써야함
		
		ArrayList<SangpumDto> list = (ArrayList<SangpumDto>)sangpumModel.selectDataAll();
		request.setAttribute("datas", list);
		return "show.jsp";
	}
}

 

 

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">

<configuration>
 <properties resource="pack/mybatis/db.properties" />
 
 <environments default="dev">
  <environment id="dev">
   <transactionManager type="JDBC" />
   <dataSource type="POOLED">
    <property name="driver" value="${driver}" />
    <property name="url" value="${url}" />
    <property name="username" value="${username}" />
    <property name="password" value="${password}" />
   </dataSource>
  </environment>
 </environments>
 <mappers>
  <mapper resource="pack/mybatis/DataMapper.xml" />
 </mappers>
</configuration>

 

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="dev">

 <select id="selectDataAll" resultType="pack.model.SangpumDto">
  select * from sangdata
 </select>

</mapper>

 

driver=org.mariadb.jdbc.Driver
url=jdbc:mariadb://127.0.0.1:3306/test
username=root
password=비밀번호

 

 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h2>* 상품 목록(MVC 패턴 사용) *</h2>
<table border="1">
	<tr>
		<th>코드</th><th>품명</th><th>수량</th><th>단가</th>
	</tr>
	<c:forEach var="s" items="${requestScope.datas}">
	<tr>
		<td>${s.code}</td>
		<td>${s.sang}</td>
		<td>${s.su}</td>
		<td>${s.dan}</td>
	</tr>
	</c:forEach>
</table>
</body>
</html>

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

'Java' 카테고리의 다른 글

Servlet과 Cookie  (0) 2024.07.30
html과 jsp 맛보기  (10) 2024.07.24
웹 서버 만들기 기초  (1) 2024.07.24
네트워크, URL, 서버  (0) 2024.07.24
Stream, 람다식 DB 연동 활용  (1) 2024.07.24