우선, Servlet의 경우 사용자 요청 시 서블릿 컨테이너에서 자동으로 HttpServletRequest 객체와 HttpServletResponse 객체를 생성해준다. 그러면 이 객체들을 doGet()와 doPost() 메서드의 인자로 받아서 이것들을 request와 response 객체로 사용한다.
그 예시는 아래와 같다.
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
String s1 = request.getParameter("num1");
String s2 = request.getParameter("num2");
}
한편, JSP에는 doPost, doGet과 같은 메서드가 없다. 대신 JSP는 page, request, session, application, out 등의 내장 객체를 가지고 있다. 그래서 별도의 객체 생성 과정 없이도 바로 request.메서드이름
의 형식으로 이 객체들을 사용할 수 있다.
그 예시는 아래와 같다.
<%
request.setCharacterEncoding("utf-8");
String s1 = request.getParameter("num1");
String s2 = request.getParameter("num2");
%>
Servlet, JSP에서 사용하는 이런 객체들은 모두 setAttribute(), getAttribute() 메서드를 가진다. 이 말은 이런 객체들에 데이터를 저장하고, 객체들로부터 데이터를 뽑아올 수 있다는 뜻이다.
그리고 이 객체들 중 대표적이 네 가지의 유효 범위는 아래와 같다.
page < request < session < application
유효 범위가 넓을수록 데이터를 오래 사용할 수 있다.
page: 해당 페이지 안에서는 데이터가 유효
request: 같은 요청 내에서는 데이터가 유효.
session: 세션이 만료되기 전까지는 데이터가 유효
Dispatcher 방식과 Redirect 방식은 모두 다른 페이지로 데이터를 전달하는 방법이다. 그런데 이 둘은 request 객체에 있어서 차이점을 가진다.
우선 Dispatcher 방식은, 자신이 받은 request를 다른 페이지까지 전달해준다.
따라서 이 방식으로 데이터를 전달받은 페이지는 같은 request를 공유하기 때문에, 이전의 데이터가 그대로 남아있게 된다.
그 방법은 아래와 같다.
//CalsServlet.java
request.setAttribute("result", result);
request.setAttribute("name", name);
RequestDispatcher rd = request.getRequestDispatcher("basic/result.jsp");
rd.forward(request, response);
한편, 이 방식에서는 기존 요청을 연장하기 때문에 url을 살펴보면 여전히 CalsServlet이라는 것을 확인할 수 있다.
redirect 방식은 페이지를 바꾸면서, 새로운 요청을 전달해준다. 따라서 바뀐 페이지의 request 객체에는 더 이상 이전의 데이터가 남아있지 않다.
response.sendRedirect("./basic/result.jsp");
또 이 경우, url이 result.jsp로 바뀌는 것을 확인해볼 수 있다.
out의 경우에도 Servlet에서는 response.getWriter()를 통해 PrintWriter 객체를 생성해서 out.println()을 해줘야한다.
그러나 JSP에서는 out을 바로 사용할 수 있고, <% %>(스크립트릿) 안에서 바로 html로 출력해주는 용도로 사용한다.