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 |