반응형
01. SpringMVC 에서 사용하는 디자인 패턴
02. SpringMVC 개요
03. MVC 프레임워크 직접 구현해보기
1) DTO
Member
package xyz.itwill09.mvc;
import lombok.AllArgsConstructor;
import lombok.Data;
//회원정보를 저장하기 위한 클래스 - VO클래스
//@NoArgsConstructor
//@AllArgsConstructor
//@Setter
//@Getter
@Data
@AllArgsConstructor
public class Member {
private String id;
private String name;
private String address;
}
2) [🍒Controller]
🍒DispatcherServlet.java(Front Controller)
- DispatcherServlet : Front Controller Pattern
- 클라이언트는 무조건 🍒DispatcherServlet (Front Controller)에게 .itwill 이라는 확장자를 가지고 요청할 것임
- 🍒Front Controller는 클라이언트의 요청을 전달받아 🍒HandlerMapping에게 🍒Controller 달라고 할것임
- 다수의 Model클래스를 가진 🍒Controller는 결과값을 🍒DispatcherServlet에게 전달하고,
- 결과값을 받은 🍒DispatcherServlet는 🍒View에게 전달하여 알맞은 응답을 생성하도록 함
package xyz.itwill09.mvc;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//컨트롤러(Controller) : 클라이언트의 모든 요청을 받아 URL 주소를 분석하여 요청 처리 클래스
//(Model)의 메소드를 호출하여 데이타 처리 후 JSP 문서(View)로 스레드를 이동하여 응답되도록
//프르그램의 흐름 제어하는 기능을 제공하는 서블릿
//컨트롤러 역할을 제공하기 위한 클래스
// => 클라이언트의 모든 요청을 받아 처리하는 단일 진입점의 역할을 수행하는 서블릿 - Front Controller Pattern
// => web.xml 파일에서 클래스를 서블릿(웹프로그램)으로 등록하고 클라이언트의 모든 요청을 처리
//할 수 있도록 URL 주소의 패턴을 설정
public class DispatcherServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
//1번 : 클라이언트의 요청을 처리하기 위해 자동 호출되는 service 메소드
//클라이언트의 요청을 처리하기 위해 자동 호출되는 메소드
@Override
public void service(HttpServletRequest request, HttpServletResponseresponse)
throws ServletException, IOException {
//클라이언트의 요청 URL 주소를 분석하여 요구사항(command)을 반환받아 저장
String requestURI = request.getRequestURI();
String ContextPath = request.getContextPath();
String command = requestURI.substring(ContextPath.length());
//클라이언트의 요구사항(command)을 이용하여 요청 처리 클래스(Model)의 객체를 제공받아 객체의
//메소드를 호출하여 클라이언트 요청에 대한 처리 후 출력(View) 관련 정보를 반환받아 저장
/*
//비권장
//인터페이스를 참조변수로 선언하면 인터페이스를 상속받은 모든 자식클래스의 객체 저장 가능
Controller controller=null;
//클라이언트 요구사항을 비교하여 요청처리 클래스를 객체로 생성
if(command.equals("/list.itwill")) {
controller=new ListController();
} else if(command.equals("/view.itwill")) {
controller=new ViewController();
}
*/
//2번
//HandlerMapping 클래스로 객체 생성
// => 클라이언트의 요구사항과 요청 처리 클래스의 객체가 엔트리로 저장된 Map 객체 사용 가능
HandlerMapping handlerMapping = new HandlerMapping();
//3번
//HandlerMapping 객체의 메소드를 호출하여 클라이언트의 요구사항을 처리하기 위한
//요청 처리 클래스의 객체를 반환받아 저장
Controller controller = handlerMapping.getController(command);
//4번
//요청 처리 클래스의 메소드를 호출하여 클라이언트의 요청을 처리하고 JSP 문서의
//이름(ViewName)을 반환받아 저장
String viewName = controller.handleRequest(request, response);
//JSP 문서로 포워드 이동하여 클라이언트에게 처리결과가 응답되도록 처리 - 요청처리 메소드의 반환값(ViewName)을 이용하여 JSP 문서의 경로를 완성하여 포워드 이동
//5번
//ViewResolver 클래스로 객체 생성
ViewResolver viewResolver = new ViewResolver();
//응답할 JSP 문서의 경로 완성
String view = viewResolver.getView(viewName);
//6번
//JSP 문서로 포워드 이동
request.getRequestDispatcher(view).forward(request, response);
}
}
🍒HandlerMapping.java
package xyz.itwill09.mvc;
import java.util.HashMap;
import java.util.Map;
//클라이언트의 요구사항과 요청처리 클래스의 객체를 Map 객체의 엔트리(Entry)로 저장하여
//제공하는 기능의 클래스
public class HandlerMapping {
//Map 객체를 저장하기 위한 필드
// => 엔트리의 제네릭으로 맵키는 요구사항을 저장하기 위한 String 클래스로 설정하고
//맵값은 요청처리 클래스의 객체를 저장하기 위한 Controller 인터페이스로 설정
private Map<String, Controller> mappings;
//생성자를 이용한 필드 초기화 - Map 객체를 생성하여 엔트리 추가
public HandlerMapping() {
mappings=new HashMap<String, Controller>();
mappings.put("/list.itwill", new ListController());
mappings.put("/view.itwill", new ViewController());
}
//클라이언트의 요구사항(MapKey)에 대한 요청처리 클래스의 객체(MapValue)를 반환하는 메소드
public Controller getController(String command) {
return mappings.get(command);
}
}
🍒ViewResolver.java
package xyz.itwill09.mvc;
//응답 관련 정보를 제공하기 위한 클래스
public class ViewResolver {
//JSP 문서의 이름(ViewName)을 제공받아 JSP 문서의 경로를 완성하여 반환하는 메소드
public String getView(String viewName) {
//클라이언트가 직접 요청할 수 없도록 WEB-INF 폴더 밑에 JSP 문서 숨겨두기
return "/WEB-INF/mvc/"+viewName+".jsp";
}
}
3) [🍑MODEL]
🍑(부모) Controller.java
package xyz.itwill09.mvc;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//모델 역할을 제공하는 클래스가 반드시 상속받아야 되는 인터페이스
// => 모든 모델 클래스에 동일한 메소드가 작성되도록 "규칙 제공"
// => 컨트롤러에서 모델 클래스의 요청 처리 메소드를 쉽게 호출하기 위헤 인터페이스 사용
public interface Controller {
//모든 모델 클래스에서 반드시 작성할 요청 처리 메소드를 추상메소드로 선언
String handleRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException;
}
🍑(자식) ListController.java - Command Pattern
package xyz.itwill09.mvc;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//모델(Model) : 클라이언트의 요청을 처리하기 위한 기능을 제공하는 클래스
//모델 역할을 제공하기 위한 클래스 - 요청처리 메소드가 선언된 인터페이스를 상속받아 작성
// => 하나의 클라이언트 요청에 대한 하나의 요청 처리 클래스를 사용하여 클라이언트의 요청 처리 - Command Pattern
// => 클라이언트가 [/list.itwill]의 URL 주소로 요청한 경우 컨트롤러에 의해 동작될 요청 처리 클래스
public class ListController implements Controller {
//요청 처리 메소드 : 클라이언트의 요청을 처리하기 위한 명령을 작성한 메소드
// => 스레드가 이동되어 응답될 JSP 문서의 이름(ViewName)을 반환 - JSP 경로가 아닌 이름반환!!
@Override
public String handleRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//요청 처리 명령 - 데이타 처리 : Service 클래스의 메소드 호출
List<Member> memberList = new ArrayList<Member>();
memberList.add(new Member("abc","홍길동","서울시 강남구"));
memberList.add(new Member("opq","임꺽정","인천시 월미구"));
memberList.add(new Member("xyz","전우치","수원시 팔달구"));
//요청에 대한 처리 결과를 JSP 문서에 제공하기 위해 request 속성값으로 저장
request.setAttribute("memberList", memberList);
//처리 결과를 제공받아 클라이언트에게 응답할 JSP 문서의 이름(ViewName) 반환
return "member_list";
}
}
🍑(자식) ViewController.java - Command Pattern
package xyz.itwill09.mvc;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//모델 역할을 제공하기 위한 클래스
//=> 클라이언트가 [/view.itwill]의 URL 주소로 요청한 경우 컨트롤러에 의해 동작될 요청 처리 클래스
public class ViewController implements Controller {
@Override
public String handleRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
Member member = new Member("abc", "홍길동", "서울시 강남구");
request.setAttribute("member", member);
return "member_view";
}
}
4) [🍓VIEW]
🍓WEB-INF > mvc > member_list.jsp
<%@ page language="java" contentType="text/html; charset=EUC-KR"
pageEncoding="EUC-KR"%>
<%@taglib prefix="c" uri="<http://java.sun.com/jsp/jstl/core>" %>
//<%-- 회원목록을 제공받아 출력하는 JSP 문서 --%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>SPRING</title>
</head>
<body>
<h1>회원목록</h1>
<hr>
<c:forEach var="member" items="${memberList}">
<p>아이디 = ${member.id }, 이름 = ${member.name }, 주소= ${member.address }</p>
</c:forEach>
</body>
</html>
🍓WEB-INF > mvc > member_view.jsp
<%@ page language="java" contentType="text/html; charset=EUC-KR"
pageEncoding="EUC-KR"%>
<%@taglib prefix="c" uri="<http://java.sun.com/jsp/jstl/core>" %>
//<%-- 회원정보를 제공받아 출력하는 JSP 문서 --%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>SPRING</title>
</head>
<body>
<h1>회원정보</h1>
<hr>
<p>아이디 = ${member.id }, 이름 = ${member.name }, 주소= ${member.address }</p>
</body>
</html>
반응형
'framework > spring mvc' 카테고리의 다른 글
[springMVC] 6. Front Controller에 의해 JSP 문서로 포워드 이동하여 응답되도록 뷰이름을 제공하는 방법 @RequestMapping (0) | 2024.08.04 |
---|---|
[springMVC] 5. 어노테이션 기반의 SPRING MVC (servlet-context.xml 설정, log4j.xml 수정) (0) | 2024.08.03 |
[springMVC] 4. 스키마 기반의 SPRING MVC (0) | 2024.08.03 |
[springMVC] 3. 웹프로그램으로 만들기 위해 필요한 환경설정파일 (web.xml) (0) | 2024.08.02 |
[springMVC] 1. MVC 아키텍쳐의 개념 (0) | 2024.08.02 |