※ src/main/java 폴더에 xyz.itwill09.mvc 패키지 생성
📃DispatcherServlet.java
※ xyz.itwill09.mvc 패키지에 DispatcherServlet.java 클래스 생성
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; // //클라이언트의 요청을 처리하기 위해 자동 호출되는 메소드를 오버라이드 선언 @Override protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //1. 클라이언트의 요청 URL 주소를 분석하여 요구사항을 반환받아 저장 String requestURI=request.getRequestURI(); String contextPath=request.getContextPath(); String command=requestURI.substring(contextPath.length()); // //2. 클라이언트의 요구사항을 이용하여 요청 처리 클래스(Model)의 객체를 제공받아 객체의 메소드를 호출하여 클라이언트 요청에 대한 처리 작업 /* //비효율적인 방법 //인터페이스를 참조변수로 선언하면 인터페이스를 상속받아 모든 자식클래스의 객체 저장 가능 Controller controller=null; //클라이언트의 요구사항을 비교하여 요청 처리 클래스를 객체로 생성 if(command.equals("/list.itwill")) { controller=new ListController(); } else if(command.equals("/view.itwill")) { controller=new ViewController(); } */ //효율적인 방법 //HandlerMapping 클래스로 객체 생성 //→ 클라이언트의 요구사항과 요청 처리 클래스의 객체가 엔트리로 저장된 Map 객체 사용 가능 HandlerMapping handlerMapping=new HandlerMapping(); //HandlerMapping 객체의 메소드를 호출하여 클라이언트의 요구사항을 처리하기 위한 요청 처리 클래스의 객체를 반환받아 저장 Controller controller=handlerMapping.getController(command); // //요청 처리 클래스의 메소드 호출하여 요청을 처리하고 JSP 문서의 이름(ViewName)을 반환받아 저장 String viewName=controller.handleRequest(request, response); // //3. JSP 문서로 포워드 이동하여 클라이언트에게 처리결과가 응답되도록 처리 //→ 요청 처리 메소드의 반환값(ViewName)을 이용하여 JSP 문서의 경로를 완성하여 포워드 이동 //ViewResolver 클래스로 객체 생성 ViewResolver viewResolver=new ViewResolver(); String view=viewResolver.getView(viewName);//응답할 JSP 문서의 경로 완성 request.getRequestDispatcher(view).forward(request, response); } }
📃Member.java
※ xyz.itwill09.mvc 패키지에 Member.java 클래스 생성
package xyz.itwill09.mvc; // import lombok.AllArgsConstructor; import lombok.Data; // //회원정보를 저장하기 위한 클래스 - VO 클래스 @AllArgsConstructor @Data public class Member { private String id; private String name; private String address; }
📃Controller.java
※ xyz.itwill09.mvc 패키지에 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
※ xyz.itwill09.mvc 패키지에 ListController.java 클래스 생성
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 문서(View)의 이름을 반환 @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";//컨트롤러가 받아서 JSP로 이동하게 해줌 } }
📃ViewController.java
※ xyz.itwill09.mvc 패키지에 ViewController.java 클래스 생성
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"; } }
📃HandlerMapping.java
※ xyz.itwill09.mvc 패키지에 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
※ xyz.itwill09.mvc 패키지에 ViewResolver.java 클래스 생성
package xyz.itwill09.mvc; // //응답 관련 정보를 제공하기 위한 클래스 public class ViewResolver { //JSP 문서의 이름(ViewName)을 제공받아 JSP 문서의 경로를 완성하여 반환하는 메소드 public String getView(String viewName) { return "/WEB-INF/mvc"+viewName+".jsp"; } }
📃web.xml
※ src/main/webapp/WEB-INF 폴더에 있는 web.xml 수정
<!-- servlet : 서블릿 클래스를 서블릿(웹프로그램)으로 등록하기 위한 엘리먼트 --> <servlet> <!-- servlet-name : 서블릿을 구분하기 위한 식별자를 설정하기 위한 엘리먼트 --> <servlet-name>mvc</servlet-name> <!-- servlet-class : 클라이언트 요청에 의해 객체로 생성되어 실행될 서블릿 클래스을 설정하기 위한 엘리먼트 --> <!-- DispatcherServlet 클래스 : 컨트롤러(Controller) 역할을 제공하는 클래스 - Front Controller --> <servlet-class>xyz.itwill09.mvc.DispatcherServlet</servlet-class> </servlet> <!-- --> <!-- servlet-mapping : 서블릿을 요청하기 위한 URL 주소의 패턴을 등록하기 위한 엘리먼트 --> <servlet-mapping> <!-- servlet-name : 클라이언트 요청에 의해 실행될 서블릿의 식별자를 설정하기 위한 엘리먼트 --> <servlet-name>mvc</servlet-name> <!-- url-pattern : 서블릿을 실행하기 위한 URL 주소의 패턴을 설정하기 위한 엘리먼트 --> <!-- → Front Controller 역할을 제공하는 서블릿은 클라이언트의 모든 요청을 받아 처리되도록 설정 --> <url-pattern>*.itwill</url-pattern> </servlet-mapping>
📃member_list.jsp
※ src/main/webapp/WEB-INF 폴더에 mvc 폴더 생성
※ mvc 폴더에 member_list.jsp 파일 생성<%@ 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>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>
📃member_view.jsp
※ mvc 폴더에 member_view.jsp 파일 생성
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%-- 회원정보를 제공받아 출력하는 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>