RequestDispatcher
- 클라이언트로부터 최초에 들어온 요청을 JSP/Servlet내에서 원하는 자원으로 요청을 넘기는 역할을 하거나 특정 자원에 처리를 요청하고 처리 결과를 얻어오는 기능을 수행하는 클래스이다.
- forward(), include() 등의 메서드를 지원한다.
RequestDispatcher의 사용이유
- JSP Model2 방식을 이용해 웹 애플리케이션을 개발하기 위해 사용한다.
- Model1 방식에서는 JSP의 액션태그를 이용해 forwarding할 수 있다.
- Model2 방식에서 Controller의 역할을 하는 Servlet은 자바클래스로, JSP의 액션태그를 사용할 수 없기 때문에 RequestDispatcher의 도움을 받아 forwarding을 할 수 있다.
- 즉 Servlet에서 비지니스 로직을 처리한 결과물을 View역할을 하는 JSP페이지에 넘기기 위해 사용된다.
JSP Model과 Forward와 Redirect의 차이가 궁굼한사람은 해당 글을 참고하길 바란다.
https://tatsu.tistory.com/entry/JSPModel1-Model2
https://tatsu.tistory.com/entry/JSPForward%EC%99%80-Redirect%EC%9D%98-%EC%B0%A8%EC%9D%B4
예제
- DB에서 데이터를 가져오기 어떤 비지니스 로직의 처리를 담당하는 Servlet 작성
- RequestDispatcher객체를 가져올때 URL의 절대경로는 java/src/webapp이다.
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("/example")
public class Controller extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//비지니스 로직 수행
String[] data = {"java", "servlet", "jsp"};
req.setAttribute("data", data);
//forward를 통해 HttpServletRequest, HttpServletResponse에 담긴정보를 해당 URL에서 사용할 수 있게 만든다.
RequestDispatcher dispatcher = req.getRequestDispatcher("/WEB-INF/example.jsp");
dispatcher.forward(req, resp);
}
}
- RequestDispatcher에 의해서 forwarding되는 jsp페이지 작성
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>Model2</h1>
<c:forEach var="list" items="${data}">
<div><c:out value="${list}"/></div>
</c:forEach>
</body>
</html>
결과
부수적인 이점
- RequestDispatcher를 이용하여 Model2 방식으로 개발함으로써 JSP페이지는 화면 출력에만 집중할 수 있게되었다.
- 하지만 이런것 외에도 부가적인 이익이 발생하게된다. 서버내에서 포워딩을 통해 JSP페이지에 데이터를 전달하므로 서버내에서 접근가능한 폴더인 WEB-INF 폴더에 jsp페이지를 둘 수 있게 된다.
- 즉 클라이언트측에서 비정상적인 접근을 통해 웹 어플리케이션에 접근하는 루트가 차단이 되는것이다.
한계점
- JSP Model2 방식은 분명 각 역할을 분리하여 개발을함으로써 유지보수적인 측면에서 많은 이점을 갖는다는 것이 장점이다. 하지만 JSP와 Servlet이 1:1 매핑되어 사용되기 때문에 프로젝트의 크기가 커지면 커질수록 구조를 파악하기 어려워진다는 점이 존재한다.
- 이러한 문제점을 해결하기 위해 Front Controller 패턴을 사용하는 Spring이 사용될 수 있다.
'JSP' 카테고리의 다른 글
[JSP] JSTL (0) | 2023.03.16 |
---|---|
[JSP]EL (0) | 2023.03.16 |
[WEB] HTTP 프로토콜에서 상태를 지속시키기 위한 방법들 (1) | 2023.03.15 |
[JSP] Java Beans와 JSP 빈즈태그 (0) | 2023.03.15 |
[JSP] 내부객체 (0) | 2023.03.15 |