MVC Model3의 기본구조이다.
MVC3 프로젝트에 위와 같은 파일을 생성해준다.
FrontController 패키지에 있는 것부터 코드를 입력해보자
▶ViewResolver
package kr.board.frontcontroller;
public class ViewResolver {
public static String makeView(String viewname) {
return "WEB-INF/views/"+viewname+".jsp";
}
}
다른 파일에서 ViewResolver라는 메소드를 선언하지않아도 바로 사용할 수 있도록
static을 지정해준 makeView라는 메소드를 만든다.
이 메소드는 어떤 jsp파일로 갈지에 대한 이름만 String형식인 매개변수로 지정하면,
jsp파일로 가는 경로를 리턴한다.
▶HandlerMapping
package kr.board.frontcontroller;
import java.util.HashMap;
import kr.board.controller.BoardInsertController;
import kr.board.controller.BoardListController;
import kr.board.controller.Controller;
public class HandlerMapping {
private HashMap<String, Controller> mappings;
public HandlerMapping() {
mappings = new HashMap<String, Controller>();
mappings.put("/boardList.do", new BoardListController());
mappings.put("/boardInsert.do", new BoardInsertController());
}
public Controller getController(String reqURL) {
return mappings.get(reqURL);
}
}
HandlerMapping은 Frontcontroller에서 요청이 오면 어떤 Controller로 이동할지 알려주는 역할을 한다.
Frontcontroller에서 온 요청을 검색하면 원하는 Controller값이 나와야 한다는 의미이다.
이 검색 작업을 빠르게 할 수 있도록 하는 형태가 HashMap이다.
mappings라는 Hashmap을 선언해준다.
HandlerMapping이라는 메소드에는
어떤 Key(String)에 어떤 Value(Controller)가 있는지를 mapping이라는 HashMap에 넣는다.
getController라는 메소드에는 받은 String을 해당하는 Controller를 리턴한다.
▶FrontController
FrontColtroller는 클라이언트가 요청을 했을때, 어떤 경로로 이동해야하는지를 봐야하는 만큼,
getRequestURI()이라는 메소드가 어떤 역할을 하는지부터 살펴보았다.
getRequestURI()는 클라이언트가 요청한 정보를 가져오는 메소드이다.
/web/boardList.do라는 결과값을 출력한다.
package kr.board.frontcontroller;
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;
import kr.board.controller.Controller;
@WebServlet("*.do")
public class BoardFrontController extends HttpServlet {
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 1. *.do : 클라이언트의 요청을 분석하는 일
// 클라이언트가 요청한 정보를 가져오는 메소드
String reqUrl = request.getRequestURI();
System.out.println(reqUrl);
// /web 출력
String ctx = request.getContextPath();
System.out.println(ctx);
// /boardList.do 출력
String command = reqUrl.substring(ctx.length());
System.out.println(command);
// 2. HandlerMapping에게 POJO를 리턴받는다
HandlerMapping mappings = new HandlerMapping();
Controller controller = mappings.getController(command);
// 3. Controller(POJO)에게 일을 시킨다
String nextView = controller.requestHandler(request, response);
// 4. JSP -> forward / POJO -> redirect 결정
// nextView == boardList or redirect:/boardList.do
if(nextView!=null) {
// :/라는 문자를 포함하고 있을 때
if(nextView.indexOf(":/")!=-1) {
//nextView라는 문자열을 :/이라는 문자를 기준으로 나누고 ;/의 뒤에있는 문자만 가져온다
response.sendRedirect(nextView.split(":/")[1]);
// :/라는 문자를 포함하고 있지 않을 때
}else {
RequestDispatcher rd = request.getRequestDispatcher(ViewResolver.makeView(nextView));
rd.forward(request, response);
}
}
}
}
- String.substring(start) : 문자열 start 위치부터 끝까지 문자열 가져오기
- indexOf() : 값을 찾고 없으면 -1, 있으면 index를 반환
만약 들어온 요청이 Controller로 보내져야해서 :/이라는 문자를 포함하고있다면
sendRedirect를 통해 :/뒤에 명시된 Controller로 보내준다
ex) redirect:/boardList.do라는 요청일때, response.sendRedirect(boardList.do);
포함하고있지 않다면 ViewResolver를 통해 jsp로 가는 경로를 지정해주고 forward 해준다.
ex) boardList일 때, WEB-INF/views/boardList.jsp
'웹 개발 언어 > Spring+eGovFrame' 카테고리의 다른 글
Spring Legacy Project (MVC) 생성하기 위해 설정할 것 (pom.xml) (0) | 2022.07.21 |
---|---|
Spring Legacy Project 생성하기 - jdk 버전 오류 ( eclipes.ini 파일 설정) (0) | 2022.07.20 |
MVC 패턴 - Model3의 구조 (0) | 2022.04.22 |
eGovFrame를 이용한 MVC Model3 구현 환경 만들기-1 (0) | 2022.04.18 |
전자정부표준프레임워크란? +설치법 (0) | 2022.04.18 |
댓글