프로그래밍 언어/자바 웹

서블릿의 여러 가지 URL 패턴

· 코딩마이데이

URL 패턴이란 실제 서블릿의 매핑 이름을 말합니다. 즉, 서블릿 매핑 시 사용되는 가상의 이름으로, 클라이언트가 브라우저에서 요청할 때 사용되며 반드시 /(슬래시)로 시작해야 합니다.

서블릿 매핑 이름으로 사용되는 URL 패턴 종류는 정확히 이름까지 일치하는지, 디렉터리까지만 일치하는지, 확장자만 일치하는지에 따라 세 가지로 나누어집니다.

 

서블릿에 여러 가지 URL 패턴 적용 실습

1. 다음과 같이 TestServlet1~3 클래스 파일을 준비합니다.

실습 파일 위치

 

2. 첫 번째 서블릿의 TestServlet1 클래스를 다음과 같이 작성합니다. 이 서블릿은 /first/test로 요청할 때 실행됩니다. 브리우저의 요청 URL에 대해 서블릿의 여러 가지 메서드를 이용하여 요청 관련 정보를 가져옵니다.

package sec02.ex01;

import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

@WebServlet("/first/test")
public class TestServlet1 extends HttpServlet {
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();
		String context = request.getContextPath();
		String url = request.getRequestURL().toString();
		String mapping = request.getServletPath();
		String uri = request.getRequestURI();
		out.println("<html>");
		out.println("<head>");
		out.println("<title>Test Servlet1</title>");
		out.println("</head>");
		out.println("<body bgcolor='green'>");
		out.println("<b>TestServlet1입니다.</b><br>");
		out.println("<b>컨텍스트명 : "+ context + "</b><br>");
		out.println("<b>전체경로 : "+ url +"<b><br>");
		out.println("<b>매핑명 : "+mapping+"<b><br>");
		out.println("<b>URI : " + uri + "<b>");	
		out.println("</body>");
		out.println("</html>");
		out.close();
	}
}

 

3. 두 번째 서블릿인 TestServlet2 클래스를 다음과 같이 작성합니다. /first/ 디렉터리 이름으로 시작되는 요청에 대해 실행됩니다.

package sec02.ex01;

import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

@WebServlet("/first/*")
public class TestServlet2 extends HttpServlet {
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();
		String context = request.getContextPath();
		String url = request.getRequestURL().toString();
		String mapping = request.getServletPath();
		String uri = request.getRequestURI();
		out.println("<html>");
		out.println("<head>");
		out.println("<title>Test Servlet2</title>");
		out.println("</head>");
		out.println("<body bgcolor='yellow'>");
		out.println("<b>TestServlet2입니다.</b><br>");
		out.println("<b>컨텍스트명 : "+ context + "</b><br>");
		out.println("<b>전체경로 : "+ url +"<b><br>");
		out.println("<b>매핑명 : "+mapping+"<b><br>");
		out.println("<b>URI : " + uri + "<b>");	
		out.println("</body>");
		out.println("</html>");
		out.close();
	}
}

 

4. 세 번째 서블릿인 TestServlet3 클래스를 다음과 같이 작성합니다. 이는 매핑 이름에 상관없이 확장자가 .do만 실행됩니다.

package sec02.ex01;

import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

@WebServlet("*.do")
public class TestServlet3 extends HttpServlet {
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();
		String context = request.getContextPath();
		String url = request.getRequestURL().toString();
		String mapping = request.getServletPath();
		String uri = request.getRequestURI();
		out.println("<html>");
		out.println("<head>");
		out.println("<title>Test Servlet3</title>");
		out.println("</head>");
		out.println("<body bgcolor='red'>");
		out.println("<b>TestServlet3입니다.</b><br>");
		out.println("<b>컨텍스트명 : "+ context + "</b><br>");
		out.println("<b>전체경로 : "+ url +"<b><br>");
		out.println("<b>매핑명 : "+mapping+"<b><br>");
		out.println("<b>URI : " + uri + "<b>");	
		out.println("</body>");
		out.println("</html>");
		out.close();
	}
}

 

5. 각각의 매핑 이름으로 요청해 보겠습니다. 우선 정확한 매핑 이름(/first/test)으로 요청한 경우에는 다음과 같이 출력됩니다.

 

/first/test로 요청 시

 

6. 디렉터리 이름만 설치하는 경우에는 각각 다음과 같이 출력됩니다.

/first/base로 요청 시
디렉터리 이름 /first 요청 시
디렉터리 이름 /first/base.do로 요청 시

 

 

7. 다음은 확장자가 일치했을 경우의 출력 결과로, 각각 /base.do와 /second/base.do로 요청했을 때의 출력 결과입니다.

/base.do로 요청 시
/second/base.do로 요청 시

 

/first/base.do로 요청하면 확장자명이 .do로 끝나지만 앞의 디렉터리 이름이 우선하므로 TestServlet2가 실행됩니다. 반면에 /second/base.do로 요청하면 /second 디렉터리는 존재하지 않으므로 확장자명 .do를 우선하여 TestServlet3이 실행됩니다.

 

8. 다음은 TestServlet3 클래스와 URL 패턴을 /*로 설정한 후 요창한 결과입니다. @WebServlet("*.do)를 주석처리하고, @WebServlet("/*")을 입력하여 실행합니다.

@WebServlet("/*")으로 설정

 

9. 톰캣을 다시 실행한 후 /second/base로 요청하여 결과를 출력합니다.

작성자명 없이 요청한 결과

 

확장자명은 지정하지 않을 수도 있고, do 대신 자신이 원하는 이름으로 지정해서 사용할 수 도 있습니다(do는 일반적으로 MVC나 프레임워크에서 자주 사용하는 확장자명입니다).

'프로그래밍 언어 > 자바 웹' 카테고리의 다른 글

여러 가지 서블릿 관련 Listener API  (0) 2025.09.04
Filter API  (1) 2025.09.01
서블릿 속성과 스코프  (1) 2025.08.26
세션을 이용한 로그인 예제  (0) 2025.08.23
encodeURL() 사용법  (0) 2025.08.20