티스토리 뷰
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 요청에 대해 비교해보도록 하자.
'WEB > Java BackEnd' 카테고리의 다른 글
[WEB-jsp/servlet] Filter 사용하기 / 한글 인코딩, 로그인에 필터 사용헤보기 (0) | 2021.11.30 |
---|---|
[WEB-jsp/servlet] Forward와 Redirect의 비교 (0) | 2021.11.30 |
[WEB-jsp/servlet] 로그인 / 로그아웃 구현하기 (0) | 2021.11.30 |
[WEB-jsp/servlet] jsp와 servlet에서 session 구현하기 (0) | 2021.11.30 |
[WEB] 회원가입 폼 만들기 / getParameterValues() , trim(), join(), contains() (0) | 2021.11.25 |
- Total
- Today
- Yesterday
- Django
- 단계별로풀어보기
- web
- python
- javascript
- 프로그래머스
- 큐
- baekjoon
- 파이썬
- Case When
- Java
- 정렬
- 자바스크립트
- jQuery
- CSS
- 장고
- 고득점 키트
- Oracle
- jsp
- append
- 브루트 포스
- 백준
- 문자열
- R
- 덱
- brute force
- bootstrap
- html
- 자바
- 스프링
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |