18장. 웹 MVC
1. 개요
2. MVC 패턴 구조
3. MVC 패턴 구현 방법
1. MVC 개요
MVC: Model, View, Controller
Model: dao(data access object), DB
View: JSP, HTML
Controller: web.xml, Java/코드 흐름 제어
2. MVC 패턴 구조
모델 1: 학습용

JSP 페이지에 비즈니스 로직 처리 코드와 웹 브라우저에 결과를 출력하는 코드가 섞여 있음
코드가 복잡해서 유지 보수가 어려움
모델 2

1. 요청→서버가 요청 처리 가능한 컨트롤러에 요청 전달
2. 컨트롤러가 모델 자바 객체의 메서드 호출
3/4. 값 객체 생성
5. 결과값 컨트롤러에 반환
6. 결과값 뷰에 전달
7. JSP가 출력할 결과를 만들어서 웹 서버에 전달, 브라우저가 서버에서 전달받아 출력
3. MVC 패턴 구현 방법
3.1 web.xml 파일에 서블릿 구성
3.2 컨트롤러 생성
3.3 모델 생성
3.4 뷰 생성
3.1 web.xml 파일에 서블릿 구성(브라우저→컨트롤러로 안내)
3.1.1 <servlet>: 서블릿 클래스 등록
<servlet>
<servlet-name>서블릿 이름</servlet-name>
<servlet-class>서블릿 클래스(패키지이름.클래스: 확장자명 x)</servlet-class>
[<init-param>
<param-name>매개변수명</param-name>
<param-value>매개변수값</param-value>
</init-param>]
</servlet>
3.1.2 <servlet-mapping>: 요청 URL 패턴 설정
<servlet-mapping>
<servlet-name>서블릿 이름</servlet-name>
<url-pattern>요청 URL 패턴</url-pattern>
</servlet-mapping>
예시
<servlet>
<servlet-name>controller1</servlet-name>
<servlet-class>controller.Controller1</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>서블릿명</servlet-name>
<url-pattern>/</url-pattern>
<!--프로젝트명 뒤부터 시작
/: 프로젝트의 모든 하위 경로
/*: 프로젝트의 모든 하위 경로
*.do: .do로 끝나는 모든 주소-->
</servlet-mapping>
3.2 컨트롤러 생성
컨트롤러
①전처리
②DAO
③이동
서블릿 클래스 생성
HttpServlet 상속
doGet()get방식, doPost()post방식 오버라이드
package controller;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class test_controller extends HttpServlet{
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request,response);
//request와 response를 가지고 doPost로 이동->get방식으로 와도 doPost에서 실행됨
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("test_controller입니다.");
}
}
페이지 이동
forward 사용(뷰 페이지가 이동해도 처음 요청 URL 유지)
RequestDispatcher: 리퀘스트 scope 연장
package class_first;
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("/first")
//annotation 방식: web.xml을 사용하지 않고 서블릿 클래스 내에서 매핑
public class test1 extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("first입니다.");
request.setAttribute("message", "Hello! Java Server Page.");
RequestDispatcher dispatcher = req.getRequestDispatcher("/first/one/one.jsp");
dispatcher.forward(req, resp);
}
}
request.setAttribute("message", "Hello! Java Server Page.");
RequestDispatcher dispatcher = req.getRequestDispatcher("/first/one/one.jsp");
dispatcher.forward(req, resp);
컨트롤러 페이지 이동 세트로 인식하고 숙지
3.3 모델 생성
모델
웹 어플의 비즈니스 로직을 포함하는 데이터
데이터베이스에서 데이터를 가져오거나 어플에 필요한 서비스를 수행하는 클래스(dao+dto)
3.4 뷰 생성
뷰: JSP 페이지
생성 예시
<%@ page contentType="text/html; charset-utf-8"%>
<%
String msg = (String)request.getAttribute("message");
out.println(msg);
%>
MVC 적용 예시
1)web.xml에 서블릿 구성
<servlet>
<servlet-name>myController</servlet-name>
<servlet-class>ch18.ControllerServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>myController</servlet-name>
<url-pattern>/ch18/Address1</url-pattern>
</servlet-mapping>
2)모델 생성(java)
package ch18;
public class LoginBean {
private String id;
private String password;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public boolean validate() {
if(password.equals("admin"))
return true;
else
return false;
}
}
3)컨트롤러(java)
package ch18;
import java.io.IOException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import ch18.LoginBean;
public class ControllerServlet extends HttpServlet{
private static final long serialVersionUID = 1L;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String id = req.getParameter("id");
String password = req.getParameter("passwd");
LoginBean bean = new LoginBean();
bean.setId(id);
bean.setPassword(password);
req.setAttribute("bean", bean);
boolean status = bean.validate();
if(status) {
RequestDispatcher rd = req.getRequestDispatcher("mvc_success.jsp");
rd.forward(req, resp);
}else {
RequestDispatcher rd = req.getRequestDispatcher("mvc_error.jsp");
rd.forward(req, resp);
}
resp.setContentType("text/html; charset=UTF-8");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req,resp);
}
}
4)뷰 생성
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>MVC</title>
</head>
<body>
<form method="post" action="Address1">
<p>아이디: <input type="text" name="id">
<p>비밀번호: <input type="password" name="passwd">
<p><input type="submit" value="전송">
</form>
<a href="Address1">자바</a>
</body>
</html>
mvc_success.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="ch18.LoginBean" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>MVC</title>
</head>
<body>
<p>로그인 성공
<p><%
LoginBean bean = (LoginBean)request.getAttribute("bean");
out.print("아이디: "+bean.getId());
%>
</body>
</html>
mvc_error.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>MVC</title>
</head>
<body>
<p>아이디와 비밀번호를 확인해주세요
<%@ include file="mvc.jsp" %>
</body>
</html>
'정리노트' 카테고리의 다른 글
[JSP] MVC 연습 (0) | 2023.12.28 |
---|---|
[JSP] 게시판 (0) | 2023.12.27 |
[JSP] JSTL (0) | 2023.12.22 |
[JSP] JDBC (0) | 2023.12.21 |
[JSP] 데이터베이스, JDBC (0) | 2023.12.20 |