[서블릿] 바인딩

hoonak·2023년 6월 21일
0

서블릿

목록 보기
7/16

앞 절에서 서블릿에서 다른 서블릿으로 포워딩 할 때 get 방식으로 전달하는 방법을 알아 봤는 데, 전달하는 데이터 양이 적을 떄는 이 방법이 편리함, 하지만 서블릿에서 조회한 대량의 상품 정보를 jsp로 전달할 때는 jsp로 전달할 때는 get 방식이 불편함. 따라서 서블릿에서 다른 서블릿 또는 jsp로 대량의 데이터를 공유하거나 전달하고 싶을 때는 바인딩 기능을 사용함. 실제 모델2, 스트럿츠, 스프링 프레임워크로 구현하는 웹프로그램은 이 바인딩 기능을 이용해 서블릿이나 jsp 같 데이터를 전달하고 공유함.

- 서블릿 객체에서 사용되는 바인딩 관련 메서드

- setAttribute(String name, Object obj) : 데이터를 각 객체에 바인딩 함.
- getAttribute(String name) : 각 객체에 바인딩된 데이터를 name으로 가져옴.
- removeAttribute(String name) : 각 객체에 바인딩된 데이터를 name으로 제거함.

예 1) HttpServletRequest를 이용한 redirect 포워딩 시 바인딩

FirstServlet.java

package sec01.ex06;

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.setAttribute("address", "서울시 성북구"); // 웹브라우저에서 요청한 request 객체에 address의 값으로 "서울시 성북구"를 바인딩 함.
		response.sendRedirect("second"); // 두 번째 서블릿으로 전달하기 위해 sendRedirect를 호출함.		
	}

}

SecondServlet.java

package sec01.ex06;

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");
		PrintWriter out = response.getWriter();
		String address = (String)request.getAttribute("address"); //전달된 request에서 getAttribute()를 이용해 address의 값을 가져옴.
		out.println("<html><body>");
		out.println("주소" + address); // 주소 null이 출력 됨. redirect 방식으로는 서블릿에서 바인딩한 데이터를 다른 서블리승로 전송할 수 없음.
		out.println("<br>");
		out.println("redirect를 이용한 바인딩 실습입니다."); //브라우저로 출력합니다.
		out.println("</html></body>");
	}

}

실행 결과를 보면 '서울시 성북구'가 출력돼야 하는데 null이 출력됨. 그 이유는 redirect 방식 포워드 과정 때문임. 포워딩 과정 1단계인 웹 브라우저에서 요청할 때 서블릿에 전달되는 첫 번째 request는 웹 브라우저를 통해 재요청되는 3단계 두 번째 request와 다른 요청임. 즉, redirect 방식으로는 서블릿에서 바인딩한 데이터를 서블릿으로 전송할 수 없다는 것.

그럼 이런 의문이 들 수 있을 것. 앞서 redirect 방식을 실습 했을 때 처럼 get 방식으로 전송하면 되지 않느냐. 물론 전달하고자 하는 데이터가 보안과 상관이 없으면, 데이터 양이 적다면 그렇게 해도 괜찮음.

예 2) HttpServletRequest를 이용한 dispatch 포워딩 시 바인딩

FirstServlet.java

package sec01.ex07;

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.setAttribute("address", "서울시 성북구"); //웹브라우저의 최초 요청 request에 바인딩 함.
		RequestDispatcher dispatch = request.getRequestDispatcher("second"); //바인딩된 request를 다시 두 번째 서블릿으로 포워드 함.
		dispatch.forward(request, response);
	}

}

SecondServlet.java

package sec01.ex07;

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");
		PrintWriter out = response.getWriter();
		String address = (String)request.getAttribute("address"); //전달된 request에서 getAttribute()를 이용해 address의 값을 가져옴.
		out.println("<html><body>");
        // 주소 null이 출력 됨. redirect 방식으로는 서블릿에서 바인딩한 데이터를 다른 서블리승로 전송할 수 없음.
		out.println("주소" + address); 
		out.println("<br>");
         //브라우저로 출력합니다.
		out.println("dispatch를 이용한 바인딩 실습입니다.");
		out.println("</html></body>");
	}

}

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

예 3) 두 서블릿 간 회원 정보 조회 바인딩

첫 번째 서블릿에서 조회한 회원 정보를 List에 저장한 후 다시 바인딩하여 두 번째 서블릿으로 전달함.

MemberServlet.java

package sec01.ex08;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;

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("/member")
public class MemberServlet extends HttpServlet {
	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
		doHandle(request, response);
	}
	
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
		doHandle(request, response);
	}
	
	private void doHandle(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
		request.setCharacterEncoding("utf-8");
		response.setContentType("text/html; charset = utf-8");
		PrintWriter out = response.getWriter();
		MemberDAO dao = new MemberDAO();
		List membersList = dao.listMembers();
		request.setAttribute("membersList", membersList); // 조회된 회원 정보를 ArrayList 객체에 저장한 후 request에 바인딩 함.
        // 바인딩한 request를 ViewMembers 서블릿으로  포워딩 함.
		RequestDispatcher dispatch = request.getRequestDispatcher("viewMembers"); 
		dispatch.forward(request, response);
	}
}

getAttribute() 메서드를 이용해 첫 번째 서블릿에서 바인딩한 회원 정보를 List로 가져옴.

ViewServlet.java

package sec01.ex08;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;

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("/viewMembers")
public class viewMembers 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에서 회원정보를 가져옴.
		List membersList = (List)request.getAttribute("membersList"); 
		out.print("<html><body>");
		out.print("<table border = 1><tr align = 'center' bgcolor = 'lightgreen'>");
		out.print("<td>아이디</td><td>비밀번호</td><td>이름</td><td>이메일</td><td>삭제</td></tr>");
		
		for(int i = 0; i <= membersList.size(); i++) {
			MemberDTO memberDTO = (MemberDTO)membersList.get(i);
			String id = memberDTO.getId();
			String pwd = memberDTO.getPwd();
			String name = memberDTO.getName();
			String email = memberDTO.getEmail();
			out.print("<tr><td>" + id + "</td><td>" + pwd + "</td><td>" + name + "</td><td>" + email + "</td><td>"
					+ "<a href = 'member3?command=delMember&id=" + id + "'> 삭제  </a></td></tr>");		
		}
		out.print("</table></body></html>");
		out.print("<a href = 'pro08/memberForm.html'>새회원 등록하기</a>");
	}

}
profile
Hello World!

0개의 댓글