JSP/STUDY

[JSP] JSP 실습예제 - 3

코맹 2024. 8. 30. 09:48

 

 

BookRentalServlet.java
package ex03;

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("/rentBook")
public class BookRentalServlet extends HttpServlet{

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		// "bookName"과 "rentalDays" 파라미터 추출
		String bookName = req.getParameter("bookName");
		String rentalDaysStr = req.getParameter("rentalDays");
		int rentalDays;
		
		try {
			rentalDays = Integer.parseInt(rentalDaysStr);
			
		}catch (NumberFormatException e) {
			rentalDays = 0;
		}
		
		if(bookName == null || bookName.isEmpty() || rentalDays == 0) {
			bookName = "불편한 편의점";
			rentalDays = 10;
		}
		
		// 요청 속성에 도서명과 대여일수 저장
		req.setAttribute("bookName", bookName);
		req.setAttribute("rentalDays", rentalDays);
		
		// rentalConfirm.jsp로 포워딩
		RequestDispatcher dispatcher =
				req.getRequestDispatcher("/rentalConfirm.jsp");
		dispatcher.forward(req, resp);
		
	}

}

 

✔️ Request.setAttribute();

💡request.getParameter(), request.setParameter()는 파라미터의 값들을 String 타입으로 주고 받는데, Object형태로 더 많은 정보들을 주고 받기 위해 사용하는 것이 request.setAttribute()와 request.getAttribute()이다.

 

  • 동일한 웹 애플리케이션 안에 있는 모든 페이지에서 정보를 공유하기 위해 Servlet Context 객체를 사용한다.
  • Servlet Context 객체에 데이터를 등록하는 메소드 setAttribute()
  • 추출하는 메소드 getAttribute()
void setAttribute(String name, Object value);
  • 첫번째 인자 String name: 등록하는 데이터의 이름 지정하고, 추출할 때 등록한 이름으로 검색하여 추출한다.
  • 두번째 인자 Object value: 실제로 공유하기 위해서 등록하는 데이터로, Object로 선언되었으므로 어떠한 자바 객체도 공유 가능하다.
Object getAttribute(String name);
  • 인자 String name: 찾으려는 데이터의 등록된 이름
  • 주의사항: 반환하는 데이터의 타입 주의
    • setAttribute() 메소드로 어떠한 자바 객체도 등록할 수 있기 때문에 getAttribute() 메소드의 반환 타입은 자바 객체의 최상위 타입인 object로 반환됨
  • 따라서, getAttribute()로 추출한 데이터는 항상 원래 데이터 타입으로 캐스팅해서 사용해야 함

 

✔️ RequestDispatcher

  • 클라이언트로부터 최초로 들어온 요청을 JSP/Servlet 내에서 원하는 자원으로 요청을 넘기는(보내는) 역할을 수행하거나, 특정 자원에 처리를 요청하고 처리 결과를 얻어오는 기능을 수행하는 클래스
  • 요청을 보내는 방법
    • forward()
    • include()
forward()
  • 브라우저로 다시 요청하는 일 없이 서버 안에서 원하는 목적지로 이동함(ex. a.jsp -> b.jsp)

 

RequestDispatcher 생성 방법

1. ServletRequest를 통해 얻는 방법

  • 서블릿 클래스의 service(), doGet(), doPost() 등 메서드는 HttpServletRequest를 매개변수로 받기 때문에 이것을 이용해 RequestDispatcher을 얻을 수 있다.
  • URL 경로를 통해 호출 대상 지정(절대경로, 상대경로 모두 가능)
RequestDispatcher dispatcher = req.getRequestDispatcher("/rentalConfirm.jsp");

 

2. ServletContext를 통해 얻는 방법

  • 서블릿 이름, URL 경로(절대 경로만)를 통해 호출대상을 지정할 수 있게 한다.
// webl.xml에 지정한 서블릿 이름으로 호출대상 지정
ServletContext context = this.getServletContext();
RequestDispatcher dispatcher = context.getNamedDispatcher("helloServlet");

// URL 경로로 호출대상 지정(절대 경로만 가능)
ServletContext context = this.getServletContext();
RequestDispatcher dispatcher = context.getNamedDispatcher("/hello");

 

 

RequestDispatcher.forward()

 

  • 대상 자원으로 제어를 넘기는 역할을 한다.
    • 브라우저에서 /a.jsp를 요청
    • 서버에서는 /a.jsp가 forward()를 실행하여 /b.jsp로 제어를 넘김
    • 브라우저에 /b.jsp의 처리 결과를 응답
    • forward()가 제어를 넘기는 대상 자원은 Servlet 또는 JSP 페이지
  • HTTP 리다이렉트와 달리 하나의 HTTP Request 범위 안에서 동작이 이뤄짐

 

rentalConfirm.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>대여 확인</title>
</head>
<body>
	<h2>대여 확인</h2>
	<p>도서명: ${bookName}</p>
	<p>대여일수: ${rentalDays}</p>
	<p>${bookName}을 ${rentalDays}일 동안 대여하셨습니다.</p>
</body>
</html>

 

 

🌟 결과

 

 

 

 

 

 

 

 

 

📌 참고 자료

 

[Java]setAttribute()와 getAttribute()

jsp와 suvlet으로 emaillist 와 guestbook을 만들었습니다. 처음엔 model 1 방식으로 만들었고 드디어 model 2를 시작했습니다. 처음으로 controller를 만났는데 아직은 컨트롤러가 없는 1 방식에 익숙해서 적응

dynamoj.tistory.com

 

 

RequestDispatcher

RequestDispatcher, 특히 forward()에 대해 정리

velog.io

 

'JSP > STUDY' 카테고리의 다른 글

[JSP] JSP 실습예제 - 5  (0) 2024.09.02
[JSP] JSP 실습예제 - 4  (0) 2024.08.30
[JSP] JSP 실습예제 - 2  (0) 2024.08.29
[JSP] JSP 실습예제 - 1  (0) 2024.08.29
[JSP] request.getParameter()  (0) 2024.05.20