서블릿(Servlet) 맵핑시 url-pattern 규칙
구현한 서블릿은 특정 URL에 맵핑을 시켜주어야 합니다. 그래야 클라이언트에서 해당 URL로 요청시 해당 서블릿이 요청을 처리할 수 있기 때문입니다. 

URL 맵핑에는 web.xml에서 <servlet-mapping><url-pattern>태그를 통해 설정해주거나 @WebServleturlPatterns 속성을 사용합니다.


web.xml
<servlet>
     <servlet-name>HelloServlet1</servlet-name>
     <servlet-class>servlet.HelloServlet1</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>HelloServlet1</servlet-name>
    <url-pattern>/hello1</url-pattern>
</servlet-mapping>
cs

@WebServlet
@WebServlet("/hello1")
public class HelloServlet1 extends HttpServlet {
cs



URL 패턴 규칙
urlPattern은 규칙이 존재하는데, 이 규칙을 생각하지 않고 URL 맵핑 설정을 하게되면 브라우저에서 요청시 예상하지 못한 서블릿으로 요청이 전달될 수 있습니다. 규칙은 다음과 같습니다.

  • URL 패턴은 디렉터리까지만 일치하는 경우, 확장자만 일치하는 경우, 모두 끝까지 일치하는 경우로 나닙니다.
  • URL 패턴은 '/'로 명시하더라도 실제로 클라이언트는 웹어플리케이션 경로부터 지정해 주어야 합니다. 만약 웹 어플리케이션이 'jspServletStudy' 이고 '/'로 맵핑한 경우 localhost:8080/jspServletStudy/ 로 요청해야 합니다.
  • '*.do'와 같이 '*.'로 시작하는 URL 패턴은 확장자에 대한 맵핑을 할때 사용됩니다.
  • 기본적으로 서블릿에 맵핑되지 않는 HTML, CSS, JS, 이미지파일 등의 정적 자원 요청은 서블릿 컨테이너에 내장되어 있는 DefaultServlet에 맵핑되어 처리됩니다. DefaultServlet은 '/'에 맵핑되어 있습니다.
  • 작성한 서블릿의 URL 맵핑을 단순히 '/' 로만 지정한 경우 웹 어플리케이션의 DefaultServlet으로 사용됩니다. (즉 정적 자원들의 요청또한 해당 서블릿으로 맵핑되기때문에 주의해야함)
  • JSP의 확장자인 *.jsp *.jspx는 일반 정적 자원들과는 다르게 파싱을 거쳐 서블릿으로 동작 하므로 서블릿 컨테이너에 내장되어 있는 JspServlet에 맵핑되어 처리됩니다.
  • DefaultServlet과 JspServlet에 대한 설정은 $CATALINA_HOME/conf/web.xml에 정의되어 있고 웹 어플리케이션의 web.xml이나 서블릿의 url 맵핑 설정이 더 우선순위를 갖습니다.









URL 패턴 처리 과정
  1. 폴더 경로와 파일명, 확장자까지 모두 일치하는 경우 ex)/foo/var/test.html
  2. 확장자가 없는 경우 폴더경로와 파일명까지 일치하는 경우 ex)/foo/bar/test
  3. 폴더경로가 일치하는 경우 ex)/foo/bar/*
  4. 확장자 패턴이 일치하는 경우 ex)*.do
  5. 확장자가 jsp, jspx인 경우에는 JspServlet에 맵핑
  6. 모두 일치하지 않는 경우 html, js등의 정적자원으로 판단하여 DefaultServlet에 맵핑되어 해당 자원을 리턴
  7.  정적자원도 맵핑되는 경로에 존재하지 않으면 404 에러




서블릿 맵핑 예시
URL 패턴 맵핑된 서블릿
/foo/bar/*
HelloServlet1
/baz/*
HelloServlet2
/catalog
HelloServlet3
*.do
HelloServlet4
/baz/index.do
HelloServlet5



요청 경로에 따른 처리 서블릿
브라우저에서 요청한 경로에 따라서 어떤 서블릿에게 요청이 전달되는지 예시입니다.
요청 경로(브라우저)
일치 URL 패턴
요청 전달 서블릿
/foo/bar
/foo/bar/*
HelloServlet1
/foo/bar.html
없음
404 Not Found
/foo/bar/index.html
/foo/bar/*
HelloServlet1
/foo/bar/foo/index.html
/foo/bar/*
HelloServlet1
/foo/bar/index.bop
/foo/bar/*
HelloServlet1
/baz
/baz/*
HelloServlet2
/baz.html
없음
404 Not Found
/baz/index.html
/baz/*
HelloServlet2
/baz/index.html
/baz/*
HelloServlet2
/catalog
/catalog
HelloServlet3
/catalog/index.html
없음
404 Not Found
/catalog/racecar.do
*.do
HelloServlet4
/index.do
*.do
HelloServlet4
/baz/index2.do
/baz/*
HelloServlet2
/baz/index.do
/baz/index.do
HelloServlet5


실습 예제
글이 너무 길어져 실습 예제는 다음글에서 진행합니다.



블로그 이미지

도로락

IT, 프로그래밍, 컴퓨터 활용 정보 등을 위한 블로그

댓글을 달아 주세요! 질문 환영합니다!