@WebServlet으로 서블릿을 URL매핑할 때
http://localhost/context/user/info.do
위의 URL을 입력해 서버에 요청을 보낼 때,
1. 동일한 URL이 매핑된 서블릿이 요청을 받는다
ex. @WebServlet("/context/user/info.do")
2. 1번이 없다면, 경로가 동일한 패턴이 매핑된 서블릿이 요청을 받는다.
ex. @WebServlet("/context/")
3. 2번도 없다면, 확장자가 동일한 패턴이 매핑된 서블릿이 요청을 받는다.
ex. @WebServlet(".do")
4. 4번마저 없다면 default("/") 값이 매핑된 서블릿이 요청을 받는다.
ex. @WebServlet("/")
spring에도 @RequestMapping과 사용하는 url패턴이 있다.
그렇다면 전체 서블릿의 실행과정에서 URL패턴을 통한 서블릿 매핑이 언제, 어떻게 이루어질까? 대략적으로 보자면,
먼저 Servlet을 관리하는 Servlet Context는 servletMapping과 children을 가지고 있다.
servletMappings과 children은 둘 다 맵(Map) 형태의 저장소인데 전자는 key로 url패턴을, value로는 서블릿의 이름을 가지고 있고
후자는 key로 서블릿의 이름을, value로는 서블릿의 주소를 저장하고 있다.
그래서
1. 요청이 들어오면 servlet context는
2. 먼저 servletMappings에서 요청의 url을 가지고 위의 URL패턴의 우선순위를 고려해서 일치하는 패턴의 서블릿 이름을 찾는다.
3. 찾은 서블릿의 이름을 children 객체에 가서 서블릿의 이름을 key로 가지고 있는 서블릿의 주소를 찾아 서블릿을 호출하여 요청을 처리한다
서블릿의 URL패턴 중 최하위 우선순위인 default 패턴은 정적리소스(image, css, txt)를 처리하는데 주로 사용되고, 그보다 위의 우선순위인 패턴들은 동적리소스(서블릿)을 처리하는데 사용된다.
스프링은 서블릿을 활용한 기술이다. 그렇다면 스프링은 서블릿과 비교했을 때 어떤식으로 요청을 처리할까? 스프링의 전체과정을 보지 않고 딱 서블릿과 비교만 해보자
톰캣 서버의 기본설정파일(web.xml)에서는 default패턴에 해당하는 요청은 DefaultServlet이 받게 되어있는데, 각 context당 개별 설정파일(web.xml)에서 default 패턴으로 Dispatcher Servlet이 요청을 받도록 설정을 덮어 씌운다.
EL은 local variable을 사용할 수 없다
jsp의 기본객체 중 pageContext는 lv를 EL로 사용하기 위해 lv를 저장하는 저장소로 쓰인다.
해당 요청이 오면
1. 전처리를 하고
2. 핵심기능을 호출한 다 실행되면
3. 후처리를 한다.