Java 프레임워크 만들기 - JSP

자바 서블릿으로 리퀘스트 매핑 (프로퍼티와 인터페이스처리) 1 - Java Servlet(DispatcherServlet) Request Mapping, 이클립스(Eclipse)

carrotweb 2021. 4. 17. 21:22
728x90
반응형

"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)

728x90
반응형