오늘은 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 |