Java 프레임워크 만들기 - JSP

자바 서블릿으로 요청 처리 1 - Java Servlet(DispatcherServlet) Request, 이클립스(Eclipse)

carrotweb 2021. 4. 7. 19:31
728x90
반응형

이전에 이클립스 서블릿 JSP - Eclipse Servlet JSP RequestDispatcher.forward으로 연동하기를 통해 Servlet으로 요청을 받아 처리한 후 JSP 페이지로 화면을 처리할 수 있게 해봤습니다.

 

이번에는 하나의 서블릿으로 모든 요청들을 받아서 처리한 후 JSP 페이지로 화면을 처리할 수 있게 해보겠습니다.

이 구현은 "Spring Framework"의 "DispatcherServlet"이 처리하는 방식을 개념적으로 이해하기 쉽게 간단하게 구현한 것입니다.

프레임워크를 사용하지 않는 일반적인 웹 프로젝트에서는 웹 경로가 노출되어 보안에 취약합니다. 그래서 프레임워크 기반의 웹 프로젝트들은 jsp파일의 경로가 노출되지 않게 서블릿을 기반으로 모든 요청을 받아 처리하고 jsp파일들은 "WEB-INF"폴더 밑으로 이동시켜 직접적으로 접근할 수 없게 합니다. 이와같은 처리하는 방식을 "프론트 컨트롤러(Front Controller)"라고 하며 "Spring Framework"에서는 "DispatcherServlet"를 통해 처리합니다.

1. "Project Explorer"의 "test2"에서 오른쪽 버튼을 클릭하여 컨텍스트 메뉴 [New > Servlet]를 클릭합니다.

"Create Servlet"창이 나타납니다. Servlet를 생성하기 위해 "Java package"와 "Class name"를 입력합니다.

"Java package"에는 "com.home.project.test2"을 입력합니다.

"Class name"은 서블릿명으로 "TestDispatcherServlet"을 입력합니다.

입력하고 "Next >"버튼을 클릭합니다.

서블릿 설명, 파라메타 설정, 웹 경로을 설정합니다.

"Description"은 "DispatcherServlet Test"을 입력합니다.

"URL mappings"의 "/TestDispatcherServlet"를 선택하고 "Edit..."버튼을 클릭한 후 "Pattern"를 "/"로 입력합니다. 모든 요청을 받기 위해서 입니다. "OK"버튼을 클릭합니다.

"Next >"버튼을 클릭합니다.

​서블릿의 인터페이스를 추가하고 메소드들을 체크합니다.

메소드 중에서 "service"를 체크하고 "doGet"과 "doPost"는 체크를 하지 않습니다. "Finish"버튼을 클릭합니다.

2. "test2" 프로젝트의 "Java Resources"에서 "src/main/java"에 "com.home.project.test2" 패키지에 "TestDispatcherServlet.java" 파일이 생성됩니다.

 

"service"메소드에 "getContextPath"와 "getRequestURI"를 이용하여 웹 요청 경로를 가져와 출력할 수 있게 코딩하고 저장합니다.

protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	String contextPath = request.getContextPath();
	String requestURI = request.getRequestURI();
	System.out.println("contextPath : " + contextPath);
	System.out.println("requestURI : " + requestURI);
}

 

3. "Servers"탭에서 "Tomcat8"를 선택하고 "start"버튼(start the server)을 클릭합니다. 웹 브라우저에서 "http://localhost:8080/test2/test1.do"를 입력합니다. 그러면 내용이 없는 빈 화면이 나옵니다.

"Console"탭를 클릭해보면 "getContextPath"와 "getRequestURI"의 출력 내용을 확인 할 수 있습니다.

contextPath : /test2

requestURI : /test2/test1.do

"requestURI"에서 "contextPath"를 제거하면 이전의 서블릿 처럼 "urlPatterns"을 추출할 수 있습니다.

"Servers"탭에서 "Tomcat8"를 선택하고 "stop"버튼(stop the server)을 클릭합니다.

"requestURI"에서 "contextPath"를 제거하기 위해서 "replaceFirst"를 이용하여 추가 코딩합니다.

if (null != contextPath && 0 < contextPath.length()) {
	requestURI = requestURI.replaceFirst(contextPath, "");
}
System.out.println("changed requestURI : " + requestURI);

 

4. "Servers"탭에서 "Tomcat8"를 선택하고 "start"버튼(start the server)을 클릭합니다. 웹 브라우저에서 "http://localhost:8080/test2/test1.do"를 입력합니다. 이전과 동일하게 내용이 없는 빈 화면이 나옵니다.

"Console"탭를 클릭해보면 "replaceFirst"를 통해 처리된 출력 내용을 확인 할 수 있습니다.

contextPath : /test2

requestURI : /test2/test1.do

changed requestURI : /test1.do

"requestURI"에서 "contextPath"를 제거한 "changed requestURI"이 출력되었습니다.

"Servers"탭에서 "Tomcat8"를 선택하고 "stop"버튼(stop the server)을 클릭합니다.

현재 "Dynamic Web Module 3.1"로 구성되어 있어 "TestDispatcherServlet.java"에 "@WebServlet" 어노테이션을 사용하고 있습니다.

@WebServlet(description = "DispatcherServlet Test", urlPatterns = { "/" })

"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>
</servlet>
<servlet-mapping>
	<servlet-name>TestDispatcherServlet</servlet-name>
	<url-pattern>/</url-pattern>
</servlet-mapping>

처리 방식은 동일합니다.

또는 "Spring"의 "DispatcherServlet"처럼 "*.do"로 설정할 수 있습니다.

<servlet>
	<servlet-name>DispatcherServlet</servlet-name>
	<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>
<servlet-mapping>
	<servlet-name>DispatcherServlet</servlet-name>
	<url-pattern>*.do</url-pattern>
</servlet-mapping>

"TestDispatcherServlet.java"의 "@WebServlet" 어노테이션의 "urlPatterns"에 "/" 대신 "*.do"로 수정하면 됩니다.

@WebServlet(description = "DispatcherServlet Test", urlPatterns = { "*.do" })

"web.xml"에서 구성했다면 "servlet-mapping"의 "url-pattern"에 "/" 대신 "*.do"로 수정하면 됩니다.

<servlet>
	<description>DispatcherServlet Test</description>
	<display-name>TestDispatcherServlet</display-name>
	<servlet-name>TestDispatcherServlet</servlet-name>
	<servlet-class>com.home.project.test2.TestDispatcherServlet</servlet-class>
</servlet>
<servlet-mapping>
	<servlet-name>TestDispatcherServlet</servlet-name>
	<url-pattern>*.do</url-pattern>
</servlet-mapping>

 

"*.do"처럼 다양하게 확장자를 정의하여 서블릿을 사용할 수 있습니다.

728x90
반응형