모델2

액션클레스  <= 인터페이스  다수의 액션클래스 동일한형태

                                                          자료형일치

                                                          형태통일화


servlet : BasicController

클래스핸들러 : HelloHandler

인터페이스 :  CommandHandler

뷰 : hello.jsp

맵핑 : web.xml


properties 설정파일 : commandHandler.properties

                                                      hello = HelloHandler

                                                      list = ListHandler

                                                      Notice = NoticeHandler







1.클라이언트 요청 :  /basic?command=hello

       ||

2.servlet(controller)  : 분석 command = hello 이더라 설정파일에서 hello에 맞는 액션클래스로!!

       ||

3.액션클래스(Model의 입구) : 요청에 맞는 비지니스 로직을 처리하여 request에 값을저장하고 

servlet으로 jsp경로 전달

       ||

4.servlet(controller) : 받아온 jsp경로를 view로 선택

       ||

5.JSP(View) : request로부터 값을받아들여 (포워딩되어 request영역을 공유,session은 과부하가 우려된다.)

사용자에게 HTML응답해줌



예제2: Model 2  DB연동 X




Java Resources

            kame.chap24

                      BasicController (설정파일없이 서블릿안에서 요청분석

package kame.chap24;

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 kame.chap24.command.HelloHandler;
import kame.chap24.command.ListHandler;
import kame.chap24.command.NoticeHandler;
import kame.mvc.command.CommandHandler;

public class BasicController extends HttpServlet{

    //1단계의 요청을 받음 
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
        processRequest(request, response);
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
        processRequest(request, response);
    }

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

        String view=null;
        
        //글로벌 자료형사용하기위해 인터페이스 사용
        CommandHandler com = null;

        //클라이언트가 어떤한 걸 모델클레스를 요청하는지 알려줄꺼 
        String command= request.getParameter("command");        

        if(command.equals("hello")){
            com =new HelloHandler();
            //모델클래스 분기점
        }else if(command.equals("list")){
            com =new ListHandler();
        }else if(command.equals("notice")){
            com =new NoticeHandler();
        }
        try{
            view=com.process(request, response);
        }catch(Throwable e){
            e.printStackTrace();
        } 


        //5단계, RequestDispatcher를 사용하여 알맞은 뷰로 포워딩
        RequestDispatcher dispatcher=request.getRequestDispatcher(view);
        dispatcher.forward(request, response);
    }
}


kame.chap24.command (액션클래스 servlet이 요청분석을하여 요청처리에맞는 액션클래스 호출) 
ByeHandler
package kame.chap24.command;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import kame.mvc.command.CommandHandler;


public class ByeHandler implements CommandHandler{

    @Override
    public String process(HttpServletRequest request,
            HttpServletResponse response) throws Throwable {

        request.setAttribute("bye", "안녕히 가세요!!");
        
        
        return "/view/bye.jsp";
    }
}

HelloHandler

package kame.chap24.command;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import kame.mvc.command.CommandHandler;

public class HelloHandler implements CommandHandler{

    @Override
    public String process(HttpServletRequest request,HttpServletResponse response) throws Throwable {

        request.setAttribute("hello", "안녕하세요!");
        
        return "/view/hello.jsp";
    }
}


ListHandler

package kame.chap24.command;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import kame.mvc.command.CommandHandler;

public class ListHandler implements CommandHandler{

    @Override
    public String process(HttpServletRequest request,HttpServletResponse response) throws Throwable {
        
        request.setAttribute("list", "목록을 화면에 리스트 합니다.");
        
        return "/view/list.jsp";
    }
}

NoticeHandler

package kame.chap24.command;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import kame.mvc.command.CommandHandler;

public class NoticeHandler implements CommandHandler {

    @Override
    public String process(HttpServletRequest request,HttpServletResponse response) throws Throwable {
        
        request.setAttribute("notice", "뉴스를 알려드리겠습니다.");        
        
        return "/view/notice.jsp";
    }
}



kame.mvc.command (액션클래스의 인터페이스 : 다수의 액션클래스에 자료형일치,형태통일화)

CommandHandler

package kame.mvc.command;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

//인터페이스
public interface CommandHandler {
    public String process(HttpServletRequest request, HttpServletResponse response)throws Throwable;
}



kame.mvc.contoller

                      ControllerUsingFile (요청설정파일을통한 컨트롤러:서블릿)

package kame.mvc.controller;

import java.io.FileInputStream;
import java.io.IOException;
import java.util.Iterator;
import java.util.Map;
import java.util.Properties;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import kame.mvc.command.CommandHandler;

public class ControllerUsingFile extends HttpServlet {

    // <커맨드, 핸들러인스턴스> 매핑 정보 저장
    //데이터를 담을 HashMap을 생성
    private Map commandHandlerMap = new java.util.HashMap();

    //ServletConfig : 서블릿이 만들어질때 각각의 서블릿에 생성되는 ServletConfig :비서같은 역활
    public void init(ServletConfig config) throws ServletException {
        String configFile = config.getInitParameter("configFile");
        //Properties 키 = 값 을 구분해서 분리해줌
        Properties prop = new Properties();
        FileInputStream fis = null;
        try {
            //getRealPath : 상대경로를 절대경로로 만들어줌
            ///WEB-INF/commandHandler.properties 를 절대경로로 만듬
            String configFilePath = config.getServletContext().getRealPath(configFile);
            //commandHandler.properties 설정파일을 파일내용 그대로 읽어옴
            fis = new FileInputStream(configFilePath);
            //키:값 분리
            prop.load(fis);
        } catch (IOException e) {
            throw new ServletException(e);
        } finally {
            if (fis != null)
                try {
                    //파일연동시 자원정리
                    fis.close();
                } catch (IOException ex) {
                }
        }
        
        Iterator keyIter = prop.keySet().iterator();
        while (keyIter.hasNext()) {
            //command 키값
            String command = (String) keyIter.next();
            //prop.getProperty(command) : 값(value)를 리턴함
            String handlerClassName = prop.getProperty(command);
            try {
                //Class.forName() : 클래스정보를 문자열(handlerClassName)로 받아서 실제클래스를 찾는다.
                Class handlerClass = Class.forName(handlerClassName);
                Object handlerInstance = handlerClass.newInstance();
                commandHandlerMap.put(command, handlerInstance);
            } catch (ClassNotFoundException e) {
                throw new ServletException(e);
            } catch (InstantiationException e) {
                throw new ServletException(e);
            } catch (IllegalAccessException e) {
                throw new ServletException(e);
            }
        }
    }

    public 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 {
       
     String command = request.getParameter("command");

        CommandHandler handler = (CommandHandler) commandHandlerMap
                .get(command);
        
        String viewPage = null;
        
        try {
            viewPage = handler.process(request, response);
        } catch (Throwable e) {
            throw new ServletException(e);
        }

        RequestDispatcher dispatcher = request.getRequestDispatcher(viewPage);
        dispatcher.forward(request, response);
    }
}

ControllerUsingURI (요청설정파일을통한 URI 컨트롤러:서블릿)
package kame.mvc.controller;

import java.io.FileInputStream;
import java.io.IOException;
import java.util.Iterator;
import java.util.Map;
import java.util.Properties;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import kame.mvc.command.CommandHandler;

public class ControllerUsingURI extends HttpServlet {

    // <커맨드, 핸들러인스턴스> 매핑 정보 저장
    //데이터를 담을 HashMap을 생성
    private Map commandHandlerMap = new java.util.HashMap();

    //ServletConfig : 서블릿이 만들어질때 각각의 서블릿에 생성되는 ServletConfig :비서같은 역활
    public void init(ServletConfig config) throws ServletException {
        String configFile = config.getInitParameter("configFile");
        //Properties 키 = 값 을 구분해서 분리해줌
        Properties prop = new Properties();
        FileInputStream fis = null;
        try {
            //getRealPath : 상대경로를 절대경로로 만들어줌
            ///WEB-INF/commandHandler.properties 를 절대경로로 만듬
            String configFilePath = config.getServletContext().getRealPath(configFile);
            //commandHandler.properties 설정파일을 파일내용 그대로 읽어옴
            fis = new FileInputStream(configFilePath);
            //키:값 분리
            prop.load(fis);
        } catch (IOException e) {
            throw new ServletException(e);
        } finally {
            if (fis != null)
                try {
                    //파일연동시 자원정리
                    fis.close();
                } catch (IOException ex) {
                }
        }
        
        Iterator keyIter = prop.keySet().iterator();
        while (keyIter.hasNext()) {
            //command 키값
            String command = (String) keyIter.next();
            //prop.getProperty(command) : 값(value)를 리턴함
            String handlerClassName = prop.getProperty(command);
            try {
                //Class.forName() : 클래스정보를 문자열(handlerClassName)로 받아서 실제클래스를 찾는다.
                Class handlerClass = Class.forName(handlerClassName);
                Object handlerInstance = handlerClass.newInstance();
                commandHandlerMap.put(command, handlerInstance);
            } catch (ClassNotFoundException e) {
                throw new ServletException(e);
            } catch (InstantiationException e) {
                throw new ServletException(e);
            } catch (IllegalAccessException e) {
                throw new ServletException(e);
            }
        }
    }

    public 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 {
        
        String command = request.getRequestURI();
        if(command.indexOf(request.getContextPath())==0){
            //ex> substring으로 앞을짤라 hello.do 만 구해내기
            command=command.substring(request.getContextPath().length());
        }

        
        CommandHandler handler = (CommandHandler) commandHandlerMap.get(command);
        
        String viewPage = null;
        
        try {
            viewPage = handler.process(request, response);
        } catch (Throwable e) {
            throw new ServletException(e);
        }

        RequestDispatcher dispatcher = request.getRequestDispatcher(viewPage);
        dispatcher.forward(request, response);
    }
}

WebContent
            view (View : JSP : 출력 화면정의 : 서블릿이 액션클래스로부터받은 jsp경로를 view로 선택함 액션클래스에서        
  request로 저장해둔 결과값 출력)
  
     

bye.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Bye</title>
</head>
<body>
${bye}
</body>
</html>

                 

 hello.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Hello</title>
</head>
<body>
${hello}
</body>
</html>

                

  list.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>목록</title>
</head>
<body>
${list}
</body>
</html>


notice.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>뉴스</title>
</head>
<body>
${notice}
</body>
</html>



WEB-INF

                 commandHandler.properties (요청경로 설정 파일)

hello=kame.chap24.command.HelloHandler
list=kame.chap24.command.ListHandler
notice=kame.chap24.command.NoticeHandler
bye=kame.chap24.command.ByeHandler

    commandHandlerURI.properties (요청 URI경로(*.do) 설정 파일)

/hello.do=kame.chap24.command.HelloHandler
/list.do=kame.chap24.command.ListHandler
/notice.do=kame.chap24.command.NoticeHandler
/bye.do=kame.chap24.command.ByeHandler



web.xml  (맵핑)
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
    id="WebApp_ID" version="3.0">
    <display-name>mvcMain</display-name>
  
  <!-- Mapping -->
    <!-- SimpleController start -->
    <servlet>
    <servlet-name>SimpleController</servlet-name>
    <servlet-class>kame.chap24.SimpleController</servlet-class>
    </servlet>
    <servlet-mapping>
    <servlet-name>SimpleController</servlet-name>
    <url-pattern>/simple</url-pattern>
    </servlet-mapping>
    
    <servlet>
    <servlet-name>BasicController</servlet-name>
    <servlet-class>kame.chap24.BasicController</servlet-class>
    </servlet>
    <servlet-mapping>
    <servlet-name>BasicController</servlet-name>
    <url-pattern>/basic</url-pattern>
    </servlet-mapping>
    
    <servlet>
    <servlet-name>ControllerUsingFile</servlet-name>
    <servlet-class>kame.mvc.controller.ControllerUsingFile</servlet-class>
    <init-param>
        <param-name>configFile</param-name>
        <param-value>/WEB-INF/commandHandler.properties</param-value>
    </init-param>
    </servlet>
    <servlet-mapping>
    <servlet-name>ControllerUsingFile</servlet-name>
    <url-pattern>/controllerUsingFile</url-pattern>
    </servlet-mapping>
    
    <servlet>
    <servlet-name>ControllerUsingURI</servlet-name>
    <servlet-class>kame.mvc.controller.ControllerUsingURI</servlet-class>
    <init-param>
        <param-name>configFile</param-name>
        <param-value>/WEB-INF/commandHandlerURI.properties</param-value>
    </init-param>
    </servlet>
    <servlet-mapping>
    <servlet-name>ControllerUsingURI</servlet-name>
    <!-- 가상의 확장자 .do  -->
    <url-pattern>*.do</url-pattern>
    </servlet-mapping>    
    <!-- /Mapping -->

    <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>
</web-app>



실행테스트

command=hello 요청


command=list 요청


1. 파일 : properties 설정파일을 통한  command=notice 요청


2. URI : properties URI 설정파일을 통한  hello.do 요청


+ Recent posts