티스토리 뷰

728x90
반응형

Forward에 대한 개념적 설명은 아래 링크 참고 !

 

https://live-for-myself.tistory.com/168

 

[WEB] Forward와 Redirect의 비교

이전 게시물에서 forward와 redirect를 사용해보았다. https://live-for-myself.tistory.com/167 jsp도 가능하지만, 보통 servlet => jsp가 일반적이다. 예제 1 index.jsp <%@ page language="java" contentType="..

live-for-myself.tistory.com


 

jsp => jsp도 가능하지만, 보통 servlet => jsp가 일반적이다.

 

예제 1

index.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>index.jsp</title>
</head>
<body>
	<h1>인덱스 페이지입니다.</h1>
	<ul>
		<li><a href="fortune">오늘의 운세</a></li>

	</ul>
	
	
</body>
</html>

url 패턴이 "fortune"이므로, 해당 url 패턴에 매핑된 서블릿 파일이 존재함을 유추할 수 있다.

(@WebServlet("/fortune")

 


"RequestDispatcher"

FortuneServlet.java

package test.servlet;

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("/fortune")
public class FortuneServlet extends HttpServlet{
	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		//1. 오늘의 운세를 얻어오는 비즈니스 로직을 수행한다.(수행했다고 가정)
		String fortuneToday = "동쪽으로 가면 귀인을 만나요";
		//2. 로직의 수행결과 데이터(모델)을 HTttpServletRequest 객체의 속성(attribute)으로 담는다.
		req.setAttribute("fortuneToday", fortuneToday);
		/* 
		 * 3. jsp 페이지로 forward 이용해서 응답한다.
		 * forward 이동은 응답을 위임하는 동작이다.
		 * 응답을 위임할 때 서블릿에 전달되었던 HttpServletRequest, HttpServletResponse 객체의
		 * 참조값을 전달해 주어야 한다.
		 */
		RequestDispatcher rd = req.getRequestDispatcher("/test/fortune.jsp");
		rd.forward(req, resp);
		
	
	}
	

}

"forward 하는 방법"

1. "RequestDispatcher 객체"를 생성

2. RequestDispatcher의 forward 메소드로 서블릿에 전달되었던 HttpServletRequest, HttpServletResponse 객체의 참조값 전달


fortune.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>/test/fortune.jsp</title>
</head>
<body>
<%
	//FortuneServlet에서 "fortuneToday"라는 키값으로 담은 String type 얻어내기
	String fortuneToday = (String)request.getAttribute("fortuneToday");

%>
</body>
<p>오늘의 운세:<strong><%=fortuneToday%></strong></p>
</html>

결과

 

인덱스 페이지에서 다음의 링크를 클릭하면, 

 

 

경로가 fortune임을 확인할 수 있다.

url만 봐서는 FortuneServlet에서 모든 작업을 수행한 것 같지만, 사실은 fortune.jsp에서 FortuneServlet이 보낸 데이터를 위임받아 응답을 대신한 것이다.


구조

최초 요청은 서블릿이 받아 복잡한 비즈니스 로직을 처리하고, html 응답이 전문인 jsp 페이지에 위임.


예제 2

index.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>index.jsp</title>
</head>
<body>
	<h1>인덱스 페이지입니다.</h1>
	<ul>
	
		<li><a href="member">회원 한명의 정보 보기</a></li>

	</ul>
	
</body>
</html>

MemberServlet.java

package test.servlet;
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;

import test.member.dto.MemberDto;

@WebServlet("/member")
public class MemberServlet extends HttpServlet{
	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		//1. 회원 한명의 정보를 얻어오는 비즈니스 로직을 수행한다.
		MemberDto dto = new MemberDto(1,"김구라","노량진"); //DB에서 읽어온 정보라고 가정하자.
		
		//2. 로직수행결과 모델(data)를 request 영역(scope)에 담는다.
		req.setAttribute("dto", dto);
		
		//3. jsp 페이지로 forward 이동해서 응답
		RequestDispatcher rd = req.getRequestDispatcher("/test/member.jsp");
		rd.forward(req,resp);
	}

}

member.jsp

<%@page import="test.member.dto.MemberDto"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>/test/member.jsp</title>
</head>
<body>
<%
	//request 영역(scope)에 "dto"라는 키값으로 저장된 MemberDto 객체의 참조값 얻어오기
	MemberDto dto = (MemberDto)request.getAttribute("dto");
%>
<p>번호: <strong><%=dto.getNum() %></strong></p>
<p>이름: <strong><%=dto.getName() %></strong></p>
<p>주소: <strong><%=dto.getAddr() %></strong></p>
</body>
</html>

결과


전체 코드

index.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>index.jsp</title>
</head>
<body>
	<h1>인덱스 페이지입니다.</h1>
	<ul>
		<li><a href="fortune">오늘의 운세</a></li>
		<li><a href="member">회원 한명의 정보 보기</a></li>
		<li><a href="test/fortune.jsp">서블릿을 거치지 않고 바로 요청하면?</a></li>
		<li><a href="test/member.jsp">서블릿을 거치지 않고 바로 요청하면?</a></li>
	</ul>
	
</body>
</html>

 

 

결과

 

 

"서블릿을 거치지 않고 바로 요청하면?" 클릭 시

 

1) fortune.jsp

 

 

 

2) member.jsp


구조


다음 게시물은 forward 요청과 redirect 요청에 대해 비교해보도록 하자.

반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함