본문 바로가기
Study/JSP

*.properties 파일 생성하기

by 얏옹이 2023. 1. 12.
반응형

 

MVC Pattern 강의중에 Properties라는 파일로 Controller와 View를 유기적으로 연동시켜주는 파일을 생성했다.

 

아니 생성했다라기 보단 강사님이 주셔서 그냥 사용하고 있다.

 

문득 이 파일은 어떻게 생성하는걸까 궁금해졌다.

 

현재 강의때 사용하는 이클립스에서는 Dynamic Web Project의 WebContent 폴더 밑의 WEB-INF 밑에 

 

commandHandler.properties라는 파일이 존재한다.

 

이 파일의 내용은 

 

# comment
# key=value
# url=package.class

# my
/registerForm.do=member.command.MyMemberFormController
/idDuplicate.do=member.command.IdDuplicateController
#/register.do=member.command.MyMemberController

  
/join.do=member.command.JoinHandler
/login.do=auth.command.LoginHandler
/logout.do=auth.command.LogoutHandler
/changePwd.do=member.command.ChangePasswordHandler
/article/write.do=article.command.WriteArticleHandler
/article/list.do=article.command.ListarticleHandler
/article/read.do=article.command.ReadArticleHandler
/article/modify.do=article.command.ModifyArticleHandler

 

이런식의 URL 주소에 따른 Contoller를 호출해주는 방식으로 되어있다.

 

/join.do로 끝나는 URL을 호출하면? member.command 패키지 안의 JoinHandler라는 클래스가 실행되는것이다.

 

이런식으로 Page의 끝나는 주소별로 각각의 Controller를 호출해 View를 지정해주면서 각종 동작을 수행하도록 설계되어있다.

 

그럼 이 파일은 어떻게 만드는것일까?

 

이클립스에서 Ctrl + N을 누르거나 프로젝트 마우스 우클릭 -> new -> Other를 들어가보자.

 

 

그럼 new라는 창이 하나 뜨는데 여기서 General - Unititled Text File을 선택하자.

 

 

그럼 자동으로 제목이 Untitled 1이라는 문서가 생성된다.

 

그리고 뭐 이런식으로 예를들어 작성을 해주고

 

저장을 눌러보자.

 

반응형

 

 

그럼 이렇게 저장할 프로젝트 경로를 선택해줄수 있고 이름을 예를들어 db.properties라고 기입한뒤 저장을 눌러주자

 

난 jsp01 프로젝트에 Webcontent밑의 WEB-INF 폴더 밑에 저장하겠다.

 

 

그럼 이렇게 생성되었다.

 

이걸 재대로 설정하려면 추가적으로 Class를 생성해주고, Web.xml 파일에 들어가 설정을 해줘야하는데

 

이는 수업시간에 받은 내용으로 대체하겠다.

 

먼저 ControllerUsingURI라는 클래스를 만들었다.

 

package mvc.controller;

import java.io.FileReader;
import java.io.IOException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Properties;

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

import mvc.command.CommandHandler;
import mvc.command.NullHandler;


//요청 URI를 명령어로 사용하기위한 클래스

public class ControllerUsingURI extends HttpServlet {
    //필드
    // <커맨드, 핸들러인스턴스> 매핑 정보 저장
    private Map<String, CommandHandler> commandHandlerMap = 
    		new HashMap<>();

    //메서드
    //init()는 서블릿을 처음 메모리에 올릴때 실행되어, 서블릿을 초기화하며 처음에 한번만 실행. 
    public void init() throws ServletException {
		// web.xml문서 설정부분에서   /WEB-INF/commandHandlerURI.properties를 가져와
		// String타입  configFile변수에 저장
        String configFile = getInitParameter("configFile");
        Properties prop = new Properties();//Properties객체 key도 string value도 string
        String configFilePath = getServletContext().getRealPath(configFile);
        
        //실행동작할 수 있는 파일로 만든다
        try (FileReader fis = new FileReader(configFilePath)) {
            prop.load(fis);
        } catch (IOException e) {
            throw new ServletException(e);
        }
        Iterator keyIter = prop.keySet().iterator();
        while (keyIter.hasNext()) {
            String command = (String) keyIter.next();
            String handlerClassName = prop.getProperty(command);
            try {
                Class<?> handlerClass = Class.forName(handlerClassName);
                CommandHandler handlerInstance = 
                        (CommandHandler) handlerClass.newInstance();
                
                //map 참조변수명.put(key,value)를 집어넣는다
                commandHandlerMap.put(command, handlerInstance);
            } catch (ClassNotFoundException | InstantiationException 
            		| IllegalAccessException e) {
                throw new ServletException(e);
            }
        }
    }

    //doGet()는 get방식으로 요청시 호출되는 메서드
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        process(request, response);
    }

    //doPost()는 post방식으로 요청시 호출되는 메서드
    protected void doPost(HttpServletRequest request,
    HttpServletResponse response) throws ServletException, IOException {
        process(request, response);
    }

    /*URI를 명령어로 사용하려먼 컨트롤러 서블릿의 process()에서 인식할 수 있어야 한다.*/
    private void process(HttpServletRequest request,
    HttpServletResponse response) throws ServletException, IOException {
		
		//요청URI에서 request.getContextPath()부분을 제거하여 요청URI만 사용하기
		String command = request.getRequestURI();// /컨텍스트패스/~~~
		if (command.indexOf(request.getContextPath()) == 0) {//요청URI에서 request.getContextPath()부분찾기
			command = command.substring(request.getContextPath().length());
		}
		
		//담당컨트롤러를 가져오기
        CommandHandler handler = commandHandlerMap.get(command);
        if (handler == null) {
            handler = new NullHandler();
        }
        String viewPage = null;
        try {
        	//(가져온) 담당컨트롤러의 process()메서드를 호출해라
        	//(여기에서는)모든 컨트롤러는 반드시 CommandHandler인터페이스를 구현하고 있다.
        	//모든 컨트롤러의 process() 리턴하는 String타입의 view(jsp문서)를
        	//String타입 viewPage에 저장
            viewPage = handler.process(request, response);
        } catch (Throwable e) {
            throw new ServletException(e);
        }
        if (viewPage != null) {//viewPage가 존재하면
        	//해당  viewPage로 페이지를 이동해라-> 브라우저에 출력해라
	        RequestDispatcher dispatcher = request.getRequestDispatcher(viewPage);
	        dispatcher.forward(request, response);
        }
    }
}

 

 

그리고 web.xml에 들어가

 

<!-- servlet mvc controller code p588 -->
  <!-- .do로 요청이 들어오면 controllerUsingURI 이름의 서블릿을 수행. 실제 동작하는 클래스는 mvc.controller.ControllerUsingURI 자바 클래스--> 
  <servlet>
  	<!-- 정확하게 이름과 java file 경로를 지정해줘야한다 -->
  	<servlet-name>ControllerUsingURI</servlet-name>
  	<!-- 이부분이 실제 존재하는 클래스의 경로 패키지명.클래스명 -->
  	<servlet-class>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>
  	<url-pattern>*.do</url-pattern>
  </servlet-mapping>

 

이렇게 Servlet을 추가해주면서 Servlet Name과 Servlet의 경로(ControllerUsingURI 클래스의 경로)를 지정해주고

 

init-param에 value에 properties 파일의 경로를 기재해준다.

 

그리고 Servlet-mapping 태그를 이용해 url의 패턴을 .do로 지정해주었다.

 

이를 통해 우리가 웹 브라우저의 주소 *.do를 통해서 ControllerUsingURI 클래스를 통해 Properties로 URL에 따른 View를 각각 지정해줄수 있는것이다.

반응형

'Study > JSP' 카테고리의 다른 글

JSTL forEach  (0) 2023.02.15
Model(모델) 처리 방법 대표적인 4가지  (0) 2023.02.13
JSP Page에서 Java 클래스 Import하기  (0) 2023.01.20
JSP 파일 템플릿 등록하기  (0) 2023.01.14
HTTP의 Request Method GET과 POST  (0) 2023.01.07