정리노트

[JSP] MVC

망고고래 2023. 12. 26. 17:25

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