서블릿에서 다른 서블릿으로 전달하려는 데이터의 양이 많을 때는 GET방식으로 데이터를 전달하는 것이 불편하다.
서블릿에서 다른 서블릿 또는 JSP로 대량의 데이터를 공유하거나 전달하고 싶을 때는 바인딩 기능을 사용한다.
웹 프로그램 실행 히 데이터를 서블릿 관련 객체에 저장하는 방법으로, 주로 HttpServletRequest, Httpession, ServletContext 객체에서 사용되며 저장된 데이터는 프로그램 실행 시 서블릿이나 JSP에서 공유하여 사용한다.
관련 메소드 | 기능 |
setAttribute(객체명, "객체값") | 데이터를 객체에 바인딩 한다. 객체명 = 객체값 ex) address = "수원시 권선구" |
getAttribute(String name) | setAttribute에서 받아온 데이터를 가져온다. ex) getAttribute(address) |
removeAttribute(String name) | 각 객체에 바인딩 된 데이터를 name으로 제거한다. |
HttpServletRequest를 이용한 redirect 포워딩 시 바인딩
브라우저에서 전달받은 request를 서블릿에서 redirect 방식으로 다른 서블릿에 전달
FirstServlet.java
package ex02;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/first")
public class FirstServlet extends HttpServlet
{
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html; charset=\"UTF-8\"");
//request에서 요청한 request객체의 address 값으로 "수원시 권선구"를 바인딩
request.setAttribute("address", "수원시 권선구");
//두 번째 서블릿으로 전달하기 위해 sendRedirect()를 호출
response.sendRedirect("second");
}
}
SecondServlet.java
package ex02;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/second")
public class SecondServlet extends HttpServlet
{
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html; charset=\"UTF-8\"");
PrintWriter out = response.getWriter();
String address = (String) request.getAttribute("address");
out.println("<html><body>");
out.println("주소: " + address);
out.println("<br>");
out.println("redirect를 이용한 바인딩 실습");
out.println("</body></html>");
}
}
실행 결과를 보면 정상적으로는 '수원시 권선구'가 출력되어야 하는데 null이 출력된다.
이유는 redirect 방식 포워드 과정 때문이다.
포워딩 과정 1단계인 웹브라우저에서 요청할 때 서블릿에 전달되는 첫 번째 request는 웹 브라우저를 통해 재 요청되는 3단계의 두 번째 request와는 다른 요청이다.
즉, redirect 방식으로는 서블릿에서 바인딩한 데이터를 다른 서블릿으로 전송할 수 없다는 것이다.
HttpServletRequest를 이용한 dispatch 포워딩 시 바인딩
FirstServlet.java
package ex02;
import java.io.IOException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/first")
public class FirstServlet extends HttpServlet
{
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html; charset=\"UTF-8\"");
//웹 브라우저의 최초 요청 request에 바인딩한다.
request.setAttribute("address", "수원시 권선구");
//바인딩된 request를 다시 두 번째 서블릿으로 포워드한다.
RequestDispatcher dispatch = request.getRequestDispatcher("second");
dispatch.forward(request, response);
}
}
SecondServlet.java
package ex02;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/second")
public class SecondServlet extends HttpServlet
{
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
//한글 인코딩
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html; charset=\"UTF-8\"");
PrintWriter out = response.getWriter();
//전달된 request에서 getAttribute()를 이용해 주소를 받아온다.
String address = (String) request.getAttribute("address");
out.println("<html><body>");
out.println("주소: " + address);
out.println("<br>");
out.println("dispatch를 이용한 바인딩 실습");
out.println("</body></html>");
}
}
이 포워딩 과정을 보면 첫 번째 서블릿에서 두 번째 서블릿으로 전달되는 request가 브라우저를 거치지 않고 바로 전달되었다. 따라서 첫 번째 서블릿의 request에 바인딩 된 데이터가 그대로 전달된 것이다.
모델2, 스트릿츠, 스프링 프레임워크로 개발할 때는 dispatch방식으로 바인딩 된 데이터를 서블릿이나 JSP로 전달한다.
'Web > JSP' 카테고리의 다른 글
[JSP] scope란? (0) | 2023.05.17 |
---|---|
[JSP] MVC 디자인 패턴 (0) | 2022.02.08 |
세션을 이용한 웹페이지 연동기능 (0) | 2022.02.05 |
DataSource 이용해 데이터베이스 연동하기 (0) | 2022.02.05 |
서블릿의 비즈니스 로직 처리 방법 (0) | 2022.01.31 |