티스토리 뷰
바인딩
- 서블릿에서 다른 서블릿으로 포워딩할 때 GET 방식으로 데이터를 전달할 수 있다. 이 방법은 데이터의 양이 적을 때는 편리하다. 그러나 서블릿에서 조회한 대량의 상품 정보를 JSP로 전달할 때는 GET 방식이 불편하다.
- 따라서 서블릿에서 다른 서블릿 또는 JSP로 대량의 데이터를 공유하거나 전달하고 싶을 때는 바인딩(binding) 기능을 사용한다.
- 바인딩의 사전적 의미는 "두 개를 하나로 묶는다" 이다. 이는 웹 프로그램 실행 시 자원(데이터)을 서블릿 관련 객체에 저장하는 방법으로, 주로 HttpServletReqeust, HttpSession, ServletContext 객체에서 사용되며 저장된 자원(데이터)은 프로그램 실행 시 서블릿이나 JSP에서 공유하여 사용한다.
- 실제 모델2, 스트럿츠, 스프링 프레임워크로구현하는 웹 프로그램은 이 바인딩 기능을 이용해 서블릿이나 JSP간 데이터를 전달하고 공유한다.
- 서블릿 객체에서 사용되는 바인딩 관련 메서드
관련 메서드 | 기능 |
setAttribute(String name, Object obj) | 자원(데이터)을 각 객체에 바인딩한다. |
getAttribute(String name) | 각 객체에 바인딩된 자원(데이터)을 name으로 가져온다. |
removeAttribute(String name) | 각 객체에 바인딩된 자원(데이터)을 name으로 제거한다. |
HttpServletRequest를 이용한 redirect 포워딩 시 바인딩
- 브라우저에서 전달 받은 request를 서블릿에서 redirect 방식으로 다른 서블릿에 전달해 보자.
* FirstServlet.java
package servlet;
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;
/**
* Servlet implementation class FirstServlet
*/
@WebServlet("/first")
public class FirstServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
request.setAttribute("address", "서울시");
response.sendRedirect("second");
}
}
* SecondServlet.java
package servlet;
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;
/**
* Servlet implementation class FirstServlet
*/
@WebServlet("/second")
public class SecondServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
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.print("<html><body>");
out.print("redirect를 이용한 바인딩 확인 페이지<br />");
out.print("주소 : " + address);
out.print("</body></html>");
}
}
- 코드 작성 후 톰캣을 재시작하고 브라우저에 localhost:[port]/[project_name]/first 를 입력한다.
- /first 페이지를 요청했고, 포워딩된 페이지의 주소 데이터 "서울시"가 출력되어야 하는데 출력되지 않았다.
- 이유는 redirect 방식 포워드 과정 때문이며, 포워딩 과정 1단계인 웹 브라우저에서 요청 시 서블릿에 전달되는 첫 번째 request는 웹 브라우저를 통해 재요청되는 3단계의 두 번째 request와 다른 요청이다.
- 즉 redirect 방식으로는서블릿에서 바인딩한 데이터를 다른 서블릿으로 전송할 수 없다.
- GET 방식인 경우 데이터를 전송할 수 있으나, 해당 데이터가 보안과 상관이 없고, 양이 적으면 괜찮다. 그러나 DB에서 조회된 수십 개의 회원 정보나 상품 정보를 전달해야 한다면 redirect 방식에는 문제가 있다.
HttpServletRequest를 이용한 dispatch 포워딩 시 바인딩
- dispatch 방법으로 바인딩 기능을 사용한다.
* FirstServlet.java
package servlet;
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;
/**
* Servlet implementation class FirstServlet
*/
@WebServlet("/first")
public class FirstServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
request.setAttribute("address", "서울시");
RequestDispatcher dispatch = request.getRequestDispatcher("second");
dispatch.forward(request, response);
}
}
* SecondServlet.java
package servlet;
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;
/**
* Servlet implementation class FirstServlet
*/
@WebServlet("/second")
public class SecondServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
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.print("<html><body>");
out.print("redirect를 이용한 바인딩 확인 페이지<br />");
out.print("주소 : " + address);
out.print("</body></html>");
}
}
- 코드 작성 후 톰캣을 재시작하고 브라우저에 localhost:[port]/[project_name]/first 를 입력한다.
- dispatch를 이용하여 데이터 바인딩 후 포워딩 시 문제 없이 데이터가 출력된다.
- 첫 번째 서블릿에서 두 번째 서블릿으로 전달되는 request가 브라우저를 거치지 않고 바로 전달되었다. 따라서 첫 번째
서블릿의 request에 바인딩된 데이터가 그대로 전달된 것이다.
- 모델2, 스트럿츠, 스프링 프레임워크로 개발할 때는 dispatch 방식으로 바인딩된 데이터를 서블릿이나 JSP로 전달한다.
'Servlet' 카테고리의 다른 글
세션 트래킹 (0) | 2024.08.12 |
---|---|
서블릿 컨텍스트(ServletContext) (0) | 2024.08.12 |
서블릿 포워드(Forward) (0) | 2024.08.12 |
서블릿 - 비즈니스 로직(회원 정보 삭제) (0) | 2024.08.11 |
서블릿 - 비즈니스 로직(회원 정보 등록) (0) | 2024.08.11 |
- Total
- Today
- Yesterday
- 서브넷팅
- 내장객체
- FMT
- 제이쿼리
- CSS 속성
- 리액트
- nodejs
- Spring MVC
- 네트워크
- 세션
- html css
- Binding
- el
- react
- JSP
- a 태그
- Session
- script element
- 스프링
- HTML
- Redux
- javaserverpage
- Network
- CSS
- Java Server Page
- Servlet
- httpServletRequest
- Spring
- 서블릿
- 미들웨어
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |