본문 바로가기

JSP

[JSP/Servlet] RequestDispatcher와 JSP Model2

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

 

[JSP]Model1, Model2

Controller, Model, View Controller : 사용자 요청화면 처리, 화면의 로직 처리 담당 Model : 알고리즘, DB와의 상호작용, 데이터 처리담당 View : 사용자에게 보여줄 UI(User Interface)담당 Model1 JSP가Controller + View

tatsu.tistory.com

https://tatsu.tistory.com/entry/JSPForward%EC%99%80-Redirect%EC%9D%98-%EC%B0%A8%EC%9D%B4

 

[JSP]Forward와 Redirect의 차이

Forward와 Redirect Forward와 Redirect는 작업 중이 페이지가 전환된다는 점에서 비슷한 역할을 하지만, 이 둘 사이에는 페이지를 전환하는 주체가 다르다는 큰 차이점이 존재하며, 이로인해 동작에 큰

tatsu.tistory.com

예제

  • 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