Daily coding

Servlet : Java에서 데이터 보내는방식 2 ( forward ) 본문

Front-end/비동기통신

Servlet : Java에서 데이터 보내는방식 2 ( forward )

sunnnkim 2020. 1. 18. 15:00

web ( client )  <---- 통신 ----> Java ( server )

 

* * web (client) ------> Java (Server)

: sendRedirect와 마찬가지로 Servlet에서 페이지를 이동할 수 있는 또다른 방식이 있다

  RequestDispatcher 소속의 forward 메소드를 사용하여 링크를 이동할 수 있다.

  sendRedirect 는 GET 방식으로 페이지를 이동하지만 

  forward 방식은 클라이언트가 요청한 방식에 따라 이동한다.

  또한, 가장 큰 차이점이라고 할 수 있는 것은 바로 '데이터 포함 여부" 이다.

  forward 방식은 데이터를 가지고 이동할 수 있으며 인코딩여부에 상관없이 데이터가 나온다

 

** 비교

// sendRedirect : 단순이동할 때 사용하는 함수 (데이터 넘기는것보다 단순하게 페이지 이동할 때)

// 짐을 가져가지 않음 (가져갈 수 있으나 매우 귀찮음)

// resp.sendRedirect("ResultServlet");

 

// forward

// 짐(데이터)을 들고 감

// getRequestDispatcher("가려고하는 곳의 servlet name).forward(req, resp);

 

 

 

1. 데이터 보내기

 

< RequestDispatcher.forward 실제 코드 >

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
	
    
    	// Client로부터 받은 데이터 담기
		String name = req.getParameter("name");
		int age  = Integer.parseInt(req.getParameter("age"));
		String fruits[] = req.getParameterValues("fruits");
		
		
		// 보낼 데이터 패키징
		// setAttribute ("이름",실제 짐이되는 데이터) 
		// : 데이터를 클래스로 묶어 이름을 정해 보낸다.
        
        //데이터 모으기
		ObjectDto dto = new ObjectDto(name, age, fruits);	
        
		req.setAttribute("Obj", dto);
		// dto 클래스는 직렬화(Serializable 인터페이스 상속) 해주기
		// 직렬화 ? 웹에서 처리하도록 데이터를 일렬로 세워놓는 작업 
		
		
			
	}

 

 

* 보낼 데이터 세팅하기

 

- setAttribute() 

 : HttpServletRequest 소속의 함수

   보낼 데이터를 담고, 데이터의 레이블(이름)을 붙이는 작업

 

ex> Obj라는 이름으로 dto 변수를 담기

req.setAttribute("Obj", dto);

 

 

* 데이터와 함께 이동하기

 

- getRequestDispatcher() 

 : HttpServletRequest 소속의 함수

   데이터를 가지고 다른 서블릿/html/jsp 로 이동하기

 

ex> weh.xml (어노테이션) 에 등록된 helloserv 서블릿으로 데이터를 가지고 이동

RequestDispatcher dispatcher = req.getRequestDispatcher("helloserv");

dispatcher.forward(req, resp);

// 현재 이동방식에 맞추어 다음 서블릿으로 이동한다

 

 

 

2. 데이터 받기

 

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		
		// 들고온 짐 풀기
		ObjectDto dto = (ObjectDto)req.getAttribute("Obj");	
        // 기본 데이터 타입이 Object이므로 캐스트변환해야함
		
        
		// 들고온 짐의 데이터 확인
		String name = dto.getName();
		int age = dto.getAge();
		String[] fruits = dto.getFruits();
		
		
		// html 시각화
		resp.setContentType("text/html; charset=UTF-8");
		PrintWriter pw = resp.getWriter();
		
		pw.println("<html>");
		pw.println("<head>");
		pw.println("<title>제목</title>");
		pw.println("<body>");
		
		pw.println("<p>이름: "+ name +"</p>");
		pw.println("<p>나이: "+ age +"</p>");
		for (int i = 0; i < fruits.length; i++) {
			pw.println("<p>좋아하는 과일:"+ fruits[i] +"</p>");
		}
		pw.println("</body>");
		pw.println("</head>");
		pw.println("</html>");
		pw.close();		
	
	}

 

 

* 받은 데이터 풀기


getAttribute () 

 : HttpServletRequest 소속의 함수

   이전 서블릿에서 던진 데이터를 받는다

   타입은 모두 Object 로 들어오기 때문에 사용할 때는 형변환을 시켜주어야 한다.

 

ex> Obj 라는 이름으로 보낸 데이터를 ObjectDto 타입의 변수 dto에 형변환하여 담는다

ObjectDto dto = (ObjectDto)req.getAttribute("Obj");

  

 

 

3. 데이터 DTO 설정 

 

* 서블릿에서 데이터를 보낼 때의 변수 타입은 반드시 Serializable 인터페이스를 상속해야한다 

  ( 전송시 데이터의 직렬화가 필요하기 때문에 )

 

import java.io.Serializable;

public class ObjectDto implements Serializable {	

//Serializable : 직렬화

	private String name;
	private int age;
	private String fruits[];
	
	public ObjectDto() {
		// 생성자
	}

	public ObjectDto(String name, int age, String[] fruits) {
		super();
		this.name = name;
		this.age = age;
		this.fruits = fruits;
	}
	
    // getter / setter
    
    // toString
	
}