ServletContext 생성
- 서블릿 컨테이너는 웹 애플리케이션의 상태를 관리하는 ServletContext를 생성한다.
- ServletContext가 초기화되면 컨텍스트의 초기화 이벤트가 발생한다.
- 등록된 ServletContextListener의 콜백 메서드인, contextInitialized() 메서드가 호출된다.
@WebListener
public class ContextLoaderListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent sce) {
ResourceDatabasePopulator populator = new ResourceDatabasePopulator();
populator.addScript(new ClassPathResource("jwp.sql"));
DatabasePopulatorUtils.execute(populator, ConnectionManager.getDataSource());
logger.info("Completed Load ServletContext!");
}
}
데이터베이스 초기화
- jwp.sql 파일에서 SQL 문을 실행해 데이터베이스 테이블을 초기화한다.
DispatcherServlet 인스턴스 생성
- 서블릿 컨테이너는 클라이언트로부터의 최초 요청시( 혹은 컨테이너에 서블릿 인스턴스를 생성하도록 미리 설정을 한다면 최초 요청 전에 ) DispatcherServlet 인스턴스를 생성한다(생성자 호출). 이에 대한 설정은 @WebServlet의 loadOnStartup 속성으로 설정할 수 있다.
- DispatcherServlet 인스턴스의 init() 메서드를 호출해서 초기화 작업을 진행한다.
RequestMapping 인스턴스 생성
- init() 메서드 안에서 RequestMapping 객체를 생성한다.
@WebServlet(name = "dispatcher", urlPatterns = "/", loadOnStartup = 1)
public class DispatcherServlet extends HttpServlet {
private RequestMapping rm;
@Override
public void init() throws ServletException {
rm = new RequestMapping();
rm.initMapping();
}
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String requestUri = req.getRequestURI();
logger.debug("Method : {}, Request URI : {}", req.getMethod(), requestUri);
Controller controller = rm.findController(req.getRequestURI());
ModelAndView mav;
try {
mav = controller.execute(req, resp);
View view = mav.getView();
view.render(mav.getModel(), req, resp);
} catch (Throwable e) {
logger.error("Exception : {}", e);
throw new ServletException(e.getMessage());
}
}
}
- RequestMapping 인스턴스의 initMapping() 메서드를 호출한다. initMapping() 메서드에서는 요청 URL과 Controller 인스턴스를 매핑시킨다.
public class RequestMapping {
void initMapping() {
mappings.put("/", new HomeController());
mappings.put("/users/form", new ForwardController("/user/form.jsp"));
mappings.put("/users/loginForm", new ForwardController("/user/login.jsp"));
mappings.put("/users", new ListUserController());
mappings.put("/users/login", new LoginController());
mappings.put("/users/profile", new ProfileController());
mappings.put("/users/logout", new LogoutController());
[ 생략 ..]
}
}
'Java' 카테고리의 다른 글
[Servlet-jsp] 스택과 힙 메모리 / 멀티쓰레드 상황에서 문제가 발생할 가능성이 있는 Controller의 코드 (0) | 2023.03.31 |
---|---|
[Servlet-jsp] 첫 화면에 접근했을 때 사용자 요청부터 응답까지의 흐름 (0) | 2023.03.31 |
[Java] 뷰(View)를 포함한 모델 데이터에 대한 추상화를 담당하는 ModelAndView 구현하기 (0) | 2023.03.29 |
[Java] 톰캣(WAS)에서의 URL 패턴과 관련된 이슈 / 자동으로 마지막 슬래시(/)가 추가되어서 리다이렉트 되는 경우 (0) | 2023.03.26 |
[Java] SQLException에 대해서 / 무분별한 try-catch절 (0) | 2023.03.24 |
댓글