본문 바로가기
학습/JSP

9. 포워드

by Elfen Lied 2022. 11. 7.
반응형

- redirect 방법

src/main/java에 FirstServlet과 SecondServlet 만들어줌

sendRedirect() 할때는 컨텍스트패스를 붙여줘야함

  • HttpServletResponse객체의 sendRedirect() 메소드 이용
  • 웹 브라우저에 재요청하는 방식
package sec01.ex01;

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 {
		System.out.println("첫 번째 서블릿");
		response.sendRedirect("/pro09/second");
	}

}

 

package sec01.ex01;

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 {
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();
		out.print("<h1>sendRedirect 실습</h1>");
	}

}

 

 

- Refresh 방법

  • HttpServletResponse객체의 addHeader() 메소드 이용
  • 웹 브라우저에 재요청하는 방식
package sec01.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("/first2")
public class FirstServlet extends HttpServlet {
	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("첫 번째 서블릿");
		response.addHeader("Refresh", "3;url=/pro09/second2");
		// response.addHeader("Refresh", 경과시각(초);url=요청할 서블릿 또는 JSP);
		// 3초후 지정된 페이지로 이동
	}

}

 

package sec01.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("/second2")
public class SecondServlet extends HttpServlet {
  
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();
		out.print("<h1>Refresh를 이용한 실습</h1>");
	}

}

 

 

- location 방법

  • 자바스크립트 location객체의 href 속성 이용
  • 자바스크립트에서 재요청하는 방식
package sec01.ex03;

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("/first3")
public class FirstServlet extends HttpServlet {
	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("첫 번째 서블릿");
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();
		out.print("<script>");
		out.print("location.href='/pro09/second3");
		out.print("</script>");
		
	}

}

 

package sec01.ex03;

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("/second3")
public class SecondServlet extends HttpServlet {
  
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();
		out.print("<h1>location.href를 이용한 실습</h1>");
	}

}

 

 

- redirect 방식으로 다른 서블릿에 데이터 전달하기

한글이 깨지므로 encode(파라미터 두개 있는것) 해줘야함

package sec01.ex04;

import java.io.IOException;
import java.io.PrintWriter;
import java.net.URLEncoder;

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("/first4")
public class FirstServlet extends HttpServlet {
	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();
		
		String name = URLEncoder.encode("고길동","utf-8");
		response.sendRedirect("/pro09/second4?user_id=admin&user_name="+name);
	}

}

 

package sec01.ex04;

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("/second4")
public class SecondServlet extends HttpServlet {
  
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();
		String id = request.getParameter("user_id"); 
		String name = request.getParameter("user_name"); // 고길동
		
		out.print("<h1>아이디 : " + id + "</h1>");
		out.print("<h1>이름 : " + name + "</h1>");
		
	}

}

 

 

 

- dispatch를 이용한 포워딩

  • 웹 브라우저를 거치지 않고 바로 서버에 포워딩이 진행됨
  • RequestDispatcher 클래스의 forward() 메소드 이용
  • 일반적으로 포워딩 기능을 지칭함
  • 서블릿이 직접 요청하는 방법
package sec03.ex01;

import java.io.IOException;
import java.io.PrintWriter;
import java.net.URLEncoder;

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("/first5")
public class FirstServlet extends HttpServlet {
	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html;charset=utf-8");
		System.out.println("첫 번째 서블릿");
		
		// 매개값 : 이동할 경로
		// 컨텍스트 패스를 붙이지 않는다.
		RequestDispatcher rd = request.getRequestDispatcher("/second5");
		rd.forward(request, response);
	}

}

 

package sec03.ex01;

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("/second5")
public class SecondServlet extends HttpServlet {
  
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();
		
		out.print("<h1>RequestDispatcher 객체 이용</h1>");
	}

}

 

- 바인딩

  • 서블릿에서 다른 서블릿 또는 JSP로 대량의 데이터를 공유하거나 전달하고 싶을때 사용
package sec04.ex01;

import java.io.IOException;
import java.io.PrintWriter;
import java.net.URLEncoder;

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("/first6")
public class FirstServlet extends HttpServlet {
	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html;charset=utf-8");
		System.out.println("첫 번째 서블릿");
		
		request.setAttribute("address", "서울시 성북구");
		response.sendRedirect("/pro09/second6");
	}

}

 

package sec04.ex01;

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("/second6")
public class SecondServlet extends HttpServlet {
  
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();
		
		String addr = (String) request.getAttribute("address");
		
		out.print("<h1> 주소 : " + addr + "</h1>");
	}

}

 

HttpServletRequest의 유효범위 : 다음 요청까지

- sendRedirect 흐름

첫 번째 서블릿 -> 웹브라우저 -> 두 번째 서블릿(여기서 유효범위 바뀜)

 

첫 번째 서블릿 -> 두번째 서블릿

forward() 바로 전달하면 유효범위가 바뀌지 않아서 출력됨

 

 

 

- MemberServlet와 ViewServlet 만듬

- setAttribute()

- getAttribute()

 

package sec04.ex03;

import java.io.IOException;
import java.util.ArrayList;
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/list")
public class MemberServlet extends HttpServlet {
	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		List<MemberVO> memberList = new ArrayList<MemberVO>();
		memberList.add(new MemberVO("김범수", "kim@example"));
		memberList.add(new MemberVO("나얼", "na@example"));
		memberList.add(new MemberVO("박효신", "park@example"));
		memberList.add(new MemberVO("이수", "lee@example"));
		
		request.setAttribute("members", memberList);
		
		RequestDispatcher rd = request.getRequestDispatcher("/member/view");
		rd.forward(request, response);
	}
}

class MemberVO{
	private String name;
	private String email;
	public MemberVO(String name, String email) {
		this.name = name;
		this.email = email;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getEmail() {
		return email;
	}
	public void setEmail(String email) {
		this.email = email;
	}
	
}

 

package sec04.ex03;

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("/member/view")
public class ViewServlet extends HttpServlet{

	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();
		
		List<MemberVO> list = (List<MemberVO>) request.getAttribute("members");
		System.out.println(list);
		
		for(MemberVO vo : list) {
			String name = vo.getName();
			String email = vo.getEmail();
			out.print("<h1>이름 : " + name + "</h1>");
			out.print("<h1>이름 : " + email + "</h1>");
		}
		
	}
}

 

반응형

댓글