티스토리 뷰

Servlet

서블릿 - 바인딩

dev23 2024. 8. 12. 17:03
반응형

바인딩

- 서블릿에서 다른 서블릿으로 포워딩할 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 를 입력한다.

second로 포워드됨

- /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 를 입력한다.

dispatcher를 이용한 포워딩

- dispatch 이용하여 데이터 바인딩 포워딩 문제 없이 데이터가 출력된다.

- 첫 번째 서블릿에서 두 번째 서블릿으로 전달되는 request가 브라우저를 거치지 않고 바로 전달되었다. 따라서 번째
서블릿의 request 바인딩된 데이터가 그대로 전달된 것이다.

 

- 모델2, 스트럿츠, 스프링 프레임워크로 개발할 때는 dispatch 방식으로 바인딩된 데이터를 서블릿이나 JSP 전달한다.

반응형
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
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
글 보관함