Daily coding
Servlet : Java에서 데이터 보내는방식 2 ( forward ) 본문
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
}
'Front-end > 비동기통신' 카테고리의 다른 글
Servlet : 정리 (0) | 2020.01.18 |
---|---|
Servlet : servlet 과 jsp 연결하기 (0) | 2020.01.18 |
Servlet : Java에서 데이터 보내는방식 1 ( sendRedirect ) (1) | 2020.01.17 |
Servlet : 에러 만들기 및 xml <init- parameter> (0) | 2020.01.16 |
Servlet : 서버와 연결하기 2 ( Java Servlet 파일 만들기 ) (0) | 2020.01.16 |