서블릿(Servlet) 맵핑시 url-pattern 규칙
구현한 서블릿은 특정 URL에 맵핑을 시켜주어야 합니다. 그래야 클라이언트에서 해당 URL로 요청시 해당 서블릿이 요청을 처리할 수 있기 때문입니다.
URL 맵핑에는
web.xml
에서 <servlet-mapping>
의 <url-pattern>
태그를 통해 설정해주거나 @WebServlet
의 urlPatterns
속성을 사용합니다.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 패턴 처리 과정
- 폴더 경로와 파일명, 확장자까지 모두 일치하는 경우 ex)/foo/var/test.html
- 확장자가 없는 경우 폴더경로와 파일명까지 일치하는 경우 ex)/foo/bar/test
- 폴더경로가 일치하는 경우 ex)/foo/bar/*
- 확장자 패턴이 일치하는 경우 ex)*.do
- 확장자가 jsp, jspx인 경우에는 JspServlet에 맵핑
- 모두 일치하지 않는 경우 html, js등의 정적자원으로 판단하여 DefaultServlet에 맵핑되어 해당 자원을 리턴
- 정적자원도 맵핑되는 경로에 존재하지 않으면 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 |
실습 예제
글이 너무 길어져 실습 예제는 다음글에서 진행합니다.
'Servlet&Jsp' 카테고리의 다른 글
[서블릿/JSP] 표현 언어(EL, Expression Language)란? (0) | 2019.08.05 |
---|---|
[서블릿/JSP] 서블릿 url-pattern 실습 예제 (0) | 2019.08.02 |
[서블릿/JSP] Tomcat 재시작시 세션 유지/제거 설정하기 (0) | 2019.08.01 |
[서블릿/JSP] 톰캣(서블릿 컨테이너) 시작시 Servlet 초기화 되도록 설정하기 (0) | 2019.07.31 |
[서블릿/JSP] Tomcat에 war 파일 배포하기 (0) | 2019.07.30 |