pom.xml : maven빌드 도구에 들어있는 설정파일
build.xml : gradle 빌드 도구에 들어있는 설정파일
try~catch의 예외코드가 중복되고 jsp로 위임하는 코드가 지속적으로 중복되고있다. 이 문제를 해결하고싶어함.
-> 전 세계 개발자들이 구조개선 시도
서블릿을 실행하기 전에 모든 요청을 먼저 받는 FrontController를 두고 이 컨트롤러가 어떤 jsp와 Exception을 날릴지 결정한다.
가장 중요한 것 : frontController
요청이 들어오면 어떤 서블릿으로 보낼지 결정하는 역할을 한다. 요청 전달자
그 이름하여 DispatcherServlet
@WebServlet("/app/*")
앞에 app을 붙여 app으로 시작하는 모든 요청에 대해 이 서블릿을 실행하도록 한다.
주의해야할 점!
DispatcherServlet
@Override
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 예) 요청 URL => /app/board/list
//String servletPath = request.getServletPath(); // => /app
String controllerPath = request.getPathInfo(); // => /board/list
// 페이지 컨트롤러에게 위임한다.
RequestDispatcher rd = request.getRequestDispatcher(controllerPath);
rd.include(request, response);
Exception exception = (Exception) request.getAttribute("exception");
if(exception != null) {
request.getRequestDispatcher("/error.jsp").forward(request, response);
return;
}
String viewName = (String) request.getAttribute("viewName");
if(viewName != null) {
request.getRequestDispatcher(viewName).forward(request, response);
return;
}
String redirect = (String) request.getAttribute("redirect");
if(redirect != null) {
response.sendRedirect(redirect);
}
}
dispatcher가 쓰는 경로는 상대경로이다.
/board/list의 jsp를 실행하는 코드를 수정한다.
// 프론트 컨트롤러에게 어떤 JSP를 실행해야 하는지 알려준다.
// UI 출력을 JSP에게 맡긴다.
request.setAttribute("viewName", "/board/list.jsp");
/board/add의 jsp실행하는 코드 바꾸기
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
ServletContext ctx = request.getServletContext();
BoardService boardService =
(BoardService) ctx.getAttribute("boardService");
Board board = new Board();
board.setTitle(request.getParameter("title"));
board.setContent(request.getParameter("content"));
try {
Member loginUser = (Member) request.getSession().getAttribute("loginUser");
board.setWriter(loginUser);
boardService.add(board);
response.sendRedirect("list");
} catch (Exception e) {
request.setAttribute("exception", e);
request.getRequestDispatcher("/error.jsp").forward(request, response);
}
}
forwarding한 다음엔 다시 되돌아갈 수 없다!!!!!
기존 DataHandlerListener는 이제 Service객체를 준비하는 것 뿐 아니라 Controller도 준비하기 때문에 이름을 ContextLoderListener로 바꾼다.
페이지 컨트롤러를 준비한다.
페이지 컨트롤러에 필요헌 서비스객체 준비
페이지 컨트롤러에 필요한 다오도 준비한다.
컨텍스트에 필요한 것들을 실어준다는 의미에서 Loder라고 이름을 짓는다.
와 진짜 뭐라는지ㅋㅋㅋ
스프링의 심장 : web.xml에 등록되있는 <load-on-startup>
</load-on-startup>
요청이 들어올때만 객체를 생성한다.
컴퓨터는 애플이 만들고 웹 어플은 내가만든다
이와 같은 원리로 dispatcherServlet과 contextLoader가 하는일이 다르다.
controller를 만드는애와 service, dao를 만드는 애를 분리했음.
dispacher : controller준비
contextloader : service객체 준비
value속성 외 다른속성도 같이 적으려면 value속성을 생략할 수 없다.
Dispacher서블릿같이 제일 먼저 실행해야하는 서블릿의 경우 loadOnstartup속성을 꼭 넣어줘야 한다. 그래야 에러메시지를 확인할 수 있다.
http세션은 클라이언트당 하나. 서블릿 컨텍스트는 한 웹 어플당 하나!
pojo로 만들면 좋은 점 : 객체 생성과 소멸을 우리가 직접 관리할 수 있다. 그래서 생성자에 의존객체 주입할수도 있음.
그 전에는 서블릿 생성과 소멸을 톰캣에서 관리했음.