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 |