"TestDispatcherServlet.java"의 "service"에서 "*.do"로 요청되는 요청(Request)들을 URL별로 처리하게 하였습니다. 그러나 새로운 요청(Request)을 처리할 때마다 URL별로 처리하는 코딩을 추가해야 합니다.
그래서, 모든 요청(Request)에 대해 자동으로 서비스(Service Class)로 호출되어 처리될 수 있게 요청(Request)과 서비스(Service Class) 매핑한 "Request Mapping"을 만들고 요청 시 처리하게 수정하겠습니다.
이전 자바 클래스 동적 로딩(carrotweb.tistory.com/53)과 프로퍼티(properties)를 이용하여 코딩하겠습니다.
1. "test2" 프로젝트의 "Java Resources"에 "src/main/resources"에서 "/com/home/project/test2"에 "config" 폴더를 생성하고 "requestmapping.properties"파일을 생성합니다.
다음은 "/test1.do" 요청(Request)에 대해 "TestService1"서비스(Service Class)를 이용하여 처리하는 코딩입니다.
if ("/test1.do".equals(requestURI)) {
TestService1 testService1 = new TestService1();
testService1.process(request);
requestDispatcher = request.getRequestDispatcher("/WEB-INF/jsp/testservlet.jsp");
}
"Key"는 요청(Request) URL, "Value"는 서비스(Service Class)의 클래스가 속한 패키지와 클래스명으로 입력합니다.
/test1.do=com.home.project.test2.service.TestService1
프로퍼티(properties) 생성 방법(carrotweb.tistory.com/45)을 참고하시기 바랍니다.
2. 서블릿(Servlet) 로딩 시 프로퍼티(properties) 파일을 읽기 위해 "Servlet Initialize Parameter(서블릿 초기화 파라미터)"에 설정합니다.
현재 "Dynamic Web Module 3.1"로 구성되어 있어 "TestDispatcherServlet.java"에 "@WebServlet" 어노테이션을 사용하고 있습니다.
@WebServlet(
description = "DispatcherServlet Test",
urlPatterns = { "*.do" })
여기에 "initParams"과 "@WebInitParam"를 추가하여 다음과 같이 설정합니다.
파라미터 키는 "RequestMapping", 값은 위에서 만든 프로퍼티(properties) 파일 경로인 "/com/home/project/test2/config/requestmapping.properties"입니다.
@WebServlet(
description = "DispatcherServlet Test",
urlPatterns = { "*.do" },
initParams = {
@WebInitParam(name = "RequestMapping", value = "/com/home/project/test2/config/requestmapping.properties"),
})
"web.xml"에서 구성하고 싶다면 "TestDispatcherServlet.java"에 "@WebServlet" 어노테이션을 삭제한 후 "web.xml"에 다음과 같이 추가하면 됩니다.
<servlet>
<description>DispatcherServlet Test</description>
<display-name>TestDispatcherServlet</display-name>
<servlet-name>TestDispatcherServlet</servlet-name>
<servlet-class>com.home.project.test2.TestDispatcherServlet</servlet-class>
<init-param>
<param-name>RequestMapping</param-name>
<param-value>/com/home/project/test2/config/requestmapping.properties</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>TestDispatcherServlet</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
처리 방식은 동일합니다.
3. 요청(Request) URL별로 서비스(Service Class)를 관리하는 "RequestMappingMap" 변수를 추가합니다.
/**
* URL 핸들러 맵
*/
private Map<String, Object> requestMappingMap = new HashMap<String, Object>();
4. 서블릿(Servlet) 초기 파라미터로 읽어 들은 "RequestMapping"의 값인 프로퍼티(properties)를 읽어 들이기 위해 서블릿(Servlet)의 "init"메서드를 오버라이딩합니다.
"TestDispatcherServlet()"생성자 밑에서 "init"로 입력하고 "Ctrl"키와 "Space"키를 동시에 누르면 "Template Proposlas"가 나타납니다.
여기서 "init(ServletConfig config) : void - Override method in 'GenericServlet'"를 선택합니다.
그러면, "TestDispatcherServlet.java"에 "init()" 메서드가 추가되고 "@Override"어노테이션이 추가되어 "오버라이드(Override)"된 메서드임을 표시합니다.
출력문을 추가하여 어느 시점에서 호출되는 지를 확인하겠습니다.
System.out.println("TestDispatcherServlet init 실행");
서블릿(Servlet) 초기 파라미터인 "RequestMapping"을 읽어 프로퍼티(properties) 경로를 가져옵니다.
String requestMapping = config.getInitParameter("RequestMapping");
"getClass().getResourceAsStream()" 메서드를 이용하여 "Java Resources"에 있는 "src/main/resources"에 "/com/home/project/test2/config" 폴더에 있는 "requestmapping.properties"을 읽어옵니다.
Properties serviceHandlerMapping = new Properties();
InputStream inputStream = getClass().getResourceAsStream(requestMapping);
if (null != inputStream) {
try {
serviceHandlerMapping.load(inputStream);
System.out.println(requestMapping + "을 프로퍼티로 읽음");
} catch (IOException e) {
System.out.println(requestMapping + "을 프로퍼티로 읽지 못함");
e.printStackTrace();
}
} else {
System.out.println(requestMapping + "을 읽지 못함");
}
5. "TestDispatcherServlet.java"에 "service"의 코딩을 보면 모든 서비스 클래스들이 "process(HttpServletRequest request)"메서드를 사용하하고 있습니다.
동적으로 생성된 클래스에서 공통으로 실행하기 위해 interface(인터페이스)를 만듭니다.
public interface ITestService {
/**
* 메소드에 대한 설명을 입력해주세요.
* @param request HTTP 요청 객체
* @param response HTTP 응답 객체
* @return RequestDispatcher 객체
*/
public abstract RequestDispatcher doProcess(HttpServletRequest request, HttpServletResponse response);
}
기존 서비스(클래스)들이 "process"메서드를 사용하고 있어 "doProcess"메서드를 만들었습니다.
이어서, 자바 서블릿으로 디스패처 서블릿의 리퀘스트 매핑 구현(클래스 동적 로딩) 2 - Java Servlet(DispatcherServlet) Request Mapping, 이클립스(Eclipse)