본문 바로가기

컴퓨터 프로그래밍/servlet

page이동-RequestDispatcher-1) forwarding

forwarding 방식

- forward 하는 페이지로 현재 서블릿의 전권을 가지고 서버상에서 다이렉트로 이동합니다. 

- 제어권이 완전히 이동하는 jsp 페이지로 가버리기 때문에 다시 서블릿으로 되돌아오지 않습니다. 

- 그렇기 때문에 서블릿에서 PrintWriter 객체를 사용할 일이 없다. (응답이 이곳에서 이뤄지지 않는다는 의미입니다.

- 응답의 내용은 JSP이지만, 출력된 결과창의 주소는 서블릿의 전권을 가지고 이동했기 때문에 forwarding이 일어난 서블릿 주소가 뜨는 것을 알수 있습니다. 

 

공통

- 서버상에서 직접 다른 페이지를 호출 하는 방식이기 때문에 페이지의 이동속도가 빠르다. 

- 중요한 것은 서버상에서 바로 이동하기 때문에 브라우저를 거치지 않는 다는 것입니다. 

- 모든 페이지 연결방식의 80% 이상이 forwarding 방식을 사용합니다. 

- servletRequest 객체 바인딩에 대해서 잘 알고 사용해야합니다. 

 

 

Page이동방법과 ServletRequest를 Attribute로 사용하기.

1. Forwarding(RequestDispatcher): 응답하지 않고 서버상에서 다른 서블릿으로 다이렉트로 요청으로 가지고 갑니다. 페이지 이동중에 이 방법이 forwarding입니다. 그렇기 때문에 servletRequest에 data(객체를)를 넣어서 가는 게 좋습니다. 왜냐하면 응답을 하지 않기 때문에 다음 서블렛이 응답하기 전까지 살아 있기 때문입니다. 

 

- 서버상에서 바로 이동합니다.(응답을 하지 않는 다는 말입니다.)

(동일한 기능이 서로 다른 객체에 있을 때는 눈여겨 봐야합니다. )

1) request.getRequestDispatcher("-")-> 대부분 이를 대부분 사용> 상대 경로 가능

- context.getRequestDispatcher("-")-> 절대 경로만 됨

2) rdp.forward(req, res);

    rdp.include(req, res);

 

- forwarding 방법을 사용하는 경우: 단순 검색에 많이 쓰입니다. 

 

 

이동하고자 하는 페이지를 아래에 연결합니다. 

 

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script type="text/javascript">
/*
 * 나이를 문자로 입력 했을 때 숫자로 입력하는 메세지를 띄우고 return false 시킨다. 
 */
function() {
		var f = documnet.frm
	if(isNaN(f.age.value)){
		alert("나이는 숫자입력바랍니다.");
		return false;
	}
	}
</script>
</head>
<body>
	<h2 align="center">Register Cafe Member Form</h2>
	<form name="frm" action="EntranceServlet" method="post"
		onsubmit="return checkData()">
		이 름<input type="text" name="name" required="required"><br>
		나 이<input type="text" name="age" required="required"><br>
		주 소<input type="text" name="addr" required="required"><br>
		<input type="submit" value="회원가입">
	</form>
</body>
</html>
package servlet.controller;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import servlet.model.MemberVO;
/*
 * 회원가입하면 정보를 바탕으로 
 * MemberVO를 생성 ArrayList에 추가
 * 회원가입을 5명이면, MemberVO 5개
 * ArrayList를 통째로 ServletContext에 바인딩
 */
public class EntranceServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
	List<MemberVO> list=Collections.synchronizedList(new ArrayList<MemberVO>());//동기화처리 해줍니다. 
	private ServletContext context;
	@Override
		public void init() throws ServletException {
	/*	context = getServletContext();
		System.out.println("ServletContext의 주소:"+context);
		
		context.setAttribute("list", list);
		System.out.println("ServletContext에 카페 입장명단을 저장할 List를 미리 바인딩 합니다.");*/
	}
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doProcess(request, response);
	}
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doProcess(request, response);
	}
	protected void doProcess(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		PrintWriter out = response.getWriter();
		
		request.setAttribute("list",list);
		
		String name = request.getParameter("name");
		int age = Integer.parseInt(request.getParameter("age"));
		String addr = request.getParameter("addr");
		System.out.println("1. 폼값을 받아 옵니다. ");
		
		MemberVO vo =new MemberVO(name, age, addr);
		System.out.println("2. MemberVO생성");
		list.add(vo);
		System.out.println("3. MemberVO를 List에 저장");//ServletContext에 바인딩 된 List에 VO가 저장
		out.println(name+"님이 카페에 입장하셨습니다. ");
		System.out.println(name+"님이 카페에 입장하셨습니다.");
		
		//out.println("<a href=viewMember.jsp?name="+name+">viewMember.jsp페이지로 이동합니다.</a>");
		//네이베이션
		RequestDispatcher rdp=request.getRequestDispatcher("viewMember.jsp");
		rdp.forward(request, response);
		out.println("페이지 이동 시켰습니다. forward");
	}
}
<%@page import="servlet.model.MemberVO"%>
<%@page import="java.util.List"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<b><%= request.getParameter("name") %>님이 방금전 회원 가입 하신 분입니다.</b><p>
<!-- request에 똑같은걸 가져왔기 때문에 getParameter로 받을 수 있습니다.  -->
<hr>
<h2>전체 카페 명단 리스트</h2>
<table border="2px">
	<tr>
	<td>회원번호</td>
	<td>이름</td>
	<td>나이</td>
	<td>주소</td>
	</tr>
<%
	//List<MemberVO> list = (List<MemberVO>)application.getAttribute("list");
	List<MemberVO> list = (List<MemberVO>)request.getAttribute("list");
	for(int i=0; i<list.size();i++){
%>
	<tr>
	<td><%= i+1 %></td> 
	<td><%= list.get(i).getName() %></td> 
	<td><%= list.get(i).getAge() %></td> 
	<td><%= list.get(i).getAddr() %></td>
	</tr>
<%
	}
%>
</table>
</body>
</html>

 

 

 

 

out.println("페이지 이동 시켰습니다. forward");

이걸 썼는데, 안나온다. 왜냐하면 forwarding하면 제어권이 다시 안돌아 오기 때문입니다. 

 

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h2 align="center">단순검색</h2>
<form action="SMS" >
	조회ID<input type="text" name="id" required="required">
	<input type="submit" value="단순조회">
	</form>
</body>
</html>
package servlet.model;

public class MemberVO {
	
	private String id;
	private String password;
	private String name;
	private String address;
	
	public MemberVO() {
		super();
	}
	public MemberVO(String id, String password, String name, String address) {
		super();
		this.id = id;
		this.password = password;
		this.name = name;
		this.address = address;
	}
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getAddress() {
		return address;
	}
	public void setAddress(String address) {
		this.address = address;
	}
	@Override
	public String toString() {
		return "MemberVO [id=" + id + ", password=" + password + ", name=" + name + ", address=" + address + "]";
	}
}
package servlet.controller;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class SearchMemberServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

    public SearchMemberServlet() {
        super();
    }

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doProcess(request, response);
	}
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doProcess(request, response);
	}
	protected void doProcess(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		/*
		 * Controller logic 공식
		 * 1. form value 받습니다. 
		 * 2. VO객체 생성(조회일때는 vo생성 안하고 생략 가능)
		 * 3. MemberDAO return
		 * 4. biz logic 호출(이 부분이 Controller logic에 있어서 가장 중요합니다.)
		 * 5. 4의 결과 값을 attribute에 binding(4의 return값이 void인 경우 생략)
		 * 6. navigation
		 */
		String id =request.getParameter("id");
		request.setAttribute("id", id);
		
		request.getRequestDispatcher("resultView.jsp").forward(request, response);
		//제어권이 이쪽으로 오지 않으므로 이 아래는 아무것도 실행이 안됨.
	}
}
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    
<%
String id =(String)request.getAttribute("id");

%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h2>조회한 id님의 정보입니다.</h2>
이름: 이재헌 <br>
조회ID: <%=id%>

</body>
</html>

 

 

 

 

 

 

2. Redirecting

 

'컴퓨터 프로그래밍 > servlet' 카테고리의 다른 글

page이동-RequestDispatcher-2) include  (0) 2020.06.05
Controller 공식  (0) 2020.06.05
Attribute  (0) 2020.06.04
ServletContext  (0) 2020.06.04
ServletContext-여러개의 객체를 list에...  (0) 2020.06.04