본문 바로가기
개발~/JSP

[JSP] MVC 패턴 구현 - 커맨드 패턴, 설정 파일

by 보배곰 2017. 3. 8.

참고한 책: 최범균의 JSP 2.3 웹프로그래밍 기초부터 고급까지(최범균 저)

chapter 18 MVC 패턴 구현 2.3 설정파일에 커맨드와 클래스의 관계 명시하기

책 소스코드: https://github.com/madvirus/jsp23

최범균님 블로그: http://javacan.tistory.com/


설정 파일을 쓰는 이유? 로직 처리 코드를 컨트롤러 서블릿에서 핸들러 클래스로 옮겼지만, 여전히 컨트롤러 서블릿은 명렁어에 따른 알맞은 처리를 하기 위해 중첩된 if-else 구문을 사용해야 한다. 이 코드는 새로운 명령어가 추가 되면 컨트롤러 서블릿 클래스의 코드를 직접 변경해야하는 단점이 있다. 이 단점의 해결 방법은 <명령어, 핸들러 클래스>의 매핑 정보를 설정파일에 저장하는 것이다. 설정 파일의 한 줄은 '명령어=패키지.핸들러클래스이름' 형태로 구성된다.

컨트롤러 서블릿은 설정파일을 init()메서드에서 명령어와 핸들러 클래스의 매핑정보를 읽어오고, 명령어에 해당하는 핸들러 객체를 미리 생성해두었다가 process() 메서드에서 사용하면 된다.


개요

    • 단순 화면 1개 보여주기
    • DB 사용 x
    • Handler 사용
사용된 파일
    • ControllerUsingFile.java
    • web.xml
    • HelloHandler.java
    • hello.jsp
    • commandHandler.properties


1. WebContent/WEB-INF/view/hello.jsp 생성

 ▶hello.jsp 

 <%@ page language="java" contentType="text/html; charset=UTF-8"

    pageEncoding="UTF-8"%>

<!DOCTYPE html>

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<title>Hello</title>

</head>

<body>

<%= request.getAttribute("hello") %>

${ hello }

</body>

</html>



2. interface CommandHandler만들기 (mvc.command)

 ▶CommandHandler.java 

 package mvc.command;


import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;


public interface CommandHandler {

public String process(HttpServletRequest request, HttpServletResponse response) throws Exception;

}



3. HelloHandler.java 만들기 (mvc.hello)

 ▶HelloHandler.java 

 package mvc.hello;


import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;


import mvc.command.CommandHandler;


public class HelloHandler implements CommandHandler{


@Override

public String process(HttpServletRequest request, HttpServletResponse response) throws Exception {

request.setAttribute("hello", "안녕하세요~");

return "WEB-INF/view/hello.jsp";

}

}


4. commandHandler.properies 설정 파일 만들기 (WebContent/WEB-INF/commandHandler.properties)

 ▶ commandHandler.properties

 #command=handler

 hello=mvc.hello.HelloHandler

 hello3=mvc.hello.HelloHandler


5. ControllerUsingFile.java 만들기 (mvc.controller)


ControllerUsingFile은 [src 우클릭]-[New]-[Servlet]으로 만들었습니다.

현재 제 프로젝트 명은 exapmle18(아.. 프로젝트명 오타났네요..ㅠ)이고, 여기서 정해줘야할 것은 java package와 Class name을 지정해주면 됩니다.

주황색 박스 친 SuperClass. HttpServlet을 상속하고 있구나 보고 넘어가시면 됩니다. 


next누르시면 url 패턴 정하는게 있는데 저는 xml로 해서 그냥 넘어가겠습니다.

마지막에 나오는 설정입니다. 아래와 같이 설정해주시면 됩니다.



저희가 만들 ControllerUsingFile의 흐름입니다.


 ▶ControllerUsingFile.java 

package mvc.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 ControllerUsingFile extends HttpServlet {

private static final long serialVersionUID = 1L;

// <커맨드, 핸들러인스턴스> 매핑 정보 저장


public void init() throws ServletException {

//설정파일 읽기

//읽어온 매핑 정보를 properties 객체에 저장

//아래 다섯가지 작업을 반복한다.

//1. 프로퍼티 이름을 커맨드 이름으로 사용

//2. 커맨드 이름에 해당하는 핸들러 클래스 이름을 Properties에서 구함

//3. 핸들러 클래스 이름을 이용해서 Class 객체를 구함

//4. Class로부터 핸들러 객체를 생성

//5. commandHandlerMap에 (커맨드, 핸들러 객체) 매핑 정보를 저장한다.

}


protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

process(request, response);

}

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

process(request, response);

}

private void process(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

//클라이언트가 요청한 명령어를 구한다.

//commandHandlermap에서 요청을 처리할 핸들러 객체를 구한다.

//명령어에 해당하는 핸들러 객체가 존재하지 않을 경우 NullHandler를 사용한다.

//구한 핸들러 객체의 process() 메서드를 호출해서 요청을 처리하고, 결과로 보여줄 뷰 페이지 경로를 리턴값으로 전달받는다.

//viewPage가 null이 아닐 경우, 핸들러 인스턴스가 리턴한 뷰페이지로 이동한다.

}

}


ControllerUsingFile.java 전체소스


6. web.xml 설정해주기

<?xml version="1.0" encoding="UTF-8"?>

<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">

  <display-name>exapmle18</display-name>

  <welcome-file-list>

    <welcome-file>index.html</welcome-file>

    <welcome-file>index.htm</welcome-file>

    <welcome-file>index.jsp</welcome-file>

    <welcome-file>default.html</welcome-file>

    <welcome-file>default.htm</welcome-file>

    <welcome-file>default.jsp</welcome-file>

  </welcome-file-list>

  

  <servlet>

  <servlet-name>ControllerUsingFile</servlet-name>

  <servlet-class>mvc.controller.ControllerUsingFile</servlet-class>

  <init-param>

  <param-name>configFile</param-name>

  <param-value>/WEB-INF/commandHandler.properties</param-value>

  </init-param>

  <load-on-startup>1</load-on-startup>

  </servlet>

  <servlet-mapping>

  <servlet-name>ControllerUsingFile</servlet-name>

  <url-pattern>/hello</url-pattern>

  </servlet-mapping>

</web-app>


7. 실행하기

지금 처음 들어갈 페이지가 없고 결과페이지만 있음. 그래서, 서버를 구동시키고 url로 들어갑니다.

http://localhost:8080/exapmle18/hello?cmd=hello

http://IP:포트/프로젝트명/url-pattern에서 정한 이름

서블릿에서 getParmeter로 받을때 cmd로 받아서 cmd

cmd의 값인 hello는 Properties에서 가져온 값. properties에서 가져온 값은 connmandHandler.properties에서 설정해준 값. 

commandHandler.properties에 hello3=mvc.hello.HelloHandler 한줄 추가해주고, 서버 내렸다 올린다음 

http://localhost:8080/exapmle18/hello?cmd=hello3 url로 이름바꿔서 다시 접속해도 들어가짐 


결과화면









'개발~ > JSP' 카테고리의 다른 글

RequestDispatcher에 foward와 response.sendRedirect url차이  (0) 2018.04.18
[JSP] MVC 패턴 구현 - URI 패턴  (0) 2017.03.08
[JSP]DBCPInit2.java  (0) 2017.03.08
[JSP] 커넥션 풀  (0) 2017.03.07
[JSP] 표준 태그 라이브러리(JSTL)  (0) 2017.03.05

댓글