서블릿의 여러 가지 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)으로 요청한 경우에는 다음과 같이 출력됩니다.

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



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


/first/base.do로 요청하면 확장자명이 .do로 끝나지만 앞의 디렉터리 이름이 우선하므로 TestServlet2가 실행됩니다. 반면에 /second/base.do로 요청하면 /second 디렉터리는 존재하지 않으므로 확장자명 .do를 우선하여 TestServlet3이 실행됩니다.
8. 다음은 TestServlet3 클래스와 URL 패턴을 /*로 설정한 후 요창한 결과입니다. @WebServlet("*.do)를 주석처리하고, @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 |