foward를 위해 RequestDispatcher객체가 필요하고 이 객체는 request.getRequestDispatcher("이동시킬 url")을 통해 받을 수 있다.
dispatcher.forward()메서드의 매개변수로 request와 response객체를 넘기기 때문에 path변수 뒤에 파라미터를 붙일 필요가 없다.
즉 클라이언트가 <a href="ex01_02.jsp?<%= params %>">ex01_02.jsp</a>를 통해 ex01_02.jsp파일을 요청하면 서버의 ex01_02.jsp는 실제로 ex01_03.jsp으로 포워드를 하고 있고 ex01_03.jsp을 출력결과를 클라이언트에게 반환한다.
또한 클라이언트의 브라우저 주소창엔 http://localhost/jspPro/days03/ex02_info.jsp 이런식으로 뜨겠지만 실제 출력된 것은 서버의 ex01_03.jsp파일 결과물이다.
그리고 MVC패턴으로 설계하기 위해 Model, View, Controller가DTO객체를 서로 전송해야 하는데, 이 DTO객체를 url뒤에?를 붙여 전달할 순 없으니 request객체에 데이터를 포함시켜 통째로 넘겨야 한다.
request객체를 전송하기 위해선 dispatcher.forward()메서드를 사용한 포워딩이 필수이다!
request Scope(요청 스코프)
클라이언트가 서버에게 html페이지 요청과 동시에 넘긴 파라미터들을 request객체로 가져올 수 있었다.
서버에선 이 데이터를 가지고 포워딩을 통해 각 서블릿 객체에서 작업을 해야 하는데 이 작업기간 동안 사용자가 넘긴 파라미터(request객체)가 유지되어야 한다.
작업기간동안 요청객체를 유지하는 것을 request Scope(범위)라 한다.
request가 파라미터만 유지하는것이 아니라 파라미터로 인해 생긴 데이터 혹은 DB에서 가져온 dto등의 데이터도 보관하고 있어야 하는데 request.setAttribute()메서드를 사용해 requset객체에 데이터를 포함시킬 수 있다.
예를 들어 클라이언트가 서버에게 10번 부서의 사원을 모두 출력해달라고 다음과 같이 select태그에서 사원번호를 선택해 서버로 넘기다 할 때
final javax.servlet.jsp.PageContext pageContext; javax.servlet.http.HttpSessionsession=null; final javax.servlet.ServletContext application; final javax.servlet.ServletConfig config; javax.servlet.jsp.JspWriterout=null; final java.lang.Objectpage=this; javax.servlet.jsp.JspWriter_jspx_out=null; javax.servlet.jsp.PageContext_jspx_page_context=null;
반면 스크립트릿에서 정의한 <% String name = "홍길동"; %> 은 _jspService메서드 안의 지역변수로 잡힌다.
_jspService메서드를 보면 서블릿 객체의 오버라딩된 service()메서드와 형식이 비슷하다. public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)
get방식, post방식 요청 모두 _jspService메서드에 의해 처리되는 걸 유추할 수 있다….
<%= %>표현부에서 출력했던 것도 out.print()메서드로 바뀌어 있다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
final javax.servlet.jsp.PageContext pageContext; javax.servlet.http.HttpSessionsession=null; final javax.servlet.ServletContext application; final javax.servlet.ServletConfig config; javax.servlet.jsp.JspWriterout=null; final java.lang.Objectpage=this; javax.servlet.jsp.JspWriter_jspx_out=null; javax.servlet.jsp.PageContext_jspx_page_context=null; ... ... pageContext = _jspxFactory.getPageContext(this, request, response, null, true, 8192, true); _jspx_page_context = pageContext; application = pageContext.getServletContext(); config = pageContext.getServletConfig(); session = pageContext.getSession(); out = pageContext.getOut(); _jspx_out = out;
그리고 jsp에서 사용하는 기본객체 application, config, session, out등이 정의되어 있는데 지금까지 저런 기본객체를 jsp파일에서 사용할 수 있던것도 위와 같이 재스퍼가 기본적으로 파싱하면서 자동 생성해주기 때문이다.