2022. 3. 19. 20:49ㆍLanguage`/JSP (Java Server Page)
<jsp:forward>
- 하나의 JSP 페이지에서 다른 JSP 페이지로 request 처리를 전달할 때 사용
- Client로부터 request를 받는거는 from.jsp이지만, 최종적으로 response를 전달하는거는 to.jsp이다
1. Client가 from.jsp로 request 전달
2. from.jsp는 코드내에 존재하는 <jsp:forward> 액션 태그를 실행
3. <jsp:forward> 액션 태그로 인해서 요청 흐름이 to.jsp로 넘어간다
- 이 때, from.jsp에서 사용한 request/response 객체가 to.jsp로 전달된다
4. to.jsp가 response 생성
5. to.jsp가 생성한 결과를 Client에게 전달
<jsp:forward page="이동할 페이지" />
## 방법 1) ##
<jsp:forward page = "/to/to.jsp" />
## 방법 2) ##
<%
String uri = "/to/to.jsp";
%>
<jsp:forward page = "<%=uri%>" />
Example 1)
## from.jsp ##
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>[forward] -> from.jsp</title>
</head>
<body>
현재 페이지는 "from.jsp"입니다.
<jsp:forward page="to.jsp"/>
</body>
</html>
## to.jsp ##
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>[forward] -> to.jsp</title>
</head>
<body>
현재 페이지는 "to.jsp"입니다.
</body>
</html>
URL을 보면 from.jsp이지만 <jsp:forward> 액션 태그로 인해서 흐름이 to.jsp로 넘어갔고 최종적으로 Client에게 전달된 결과는 to.jsp의 내용이다
>> "리다이렉트"는 아예 페이지가 이동됨에 따라 주소가 변경되지만, "<jsp:forward>" 액션 태그는 결과는 다른 JSP 페이지이지만, 주소가 변경되지는 않는다
<jsp:forward> & 출력 버퍼의 관계
<jsp:forward> 액션 태그를 실행하기 전에는 출력 버퍼에 존재하는 모든 데이터를 지운다. 이러한 이유 때문에 <jsp:forward> 전에 출력 버퍼에 존재하던 여러 내용들이 최종 결과에서는 보이지 않는 것이다
Example 2)
## page_select.jsp ##
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>select</title>
</head>
<body>
<form action="select_server.jsp" method="get">
보고싶은 페이지 선택
<label>
<select name="type">
<option value="A">A 페이지</option>
<option value="B">B 페이지</option>
<option value="C">C 페이지</option>
</select>
</label>
<button type="submit" value="이동"></button>
</form>
</body>
</html>
## select_server.jsp ##
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>server</title>
</head>
<%
String type = request.getParameter("type");
String forwardURL;
if (type.equals("A")) {
forwardURL = "chap07/pageA.jsp";
} else if (type.equals("B")) {
forwardURL = "chap07/pageB.jsp";
} else {
forwardURL = "chap07/pageC.jsp";
}
%>
<jsp:forward page="<%=forwardURL%>"/>
<body>
</body>
</html>
select_server.jsp에서 선택한 페이지로 forward를 시켰기 때문에 "select_server.jsp"라는 url은 변경되지 않고 흐름만 완전히 각 page로 넘어감을 확인할 수 있다
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>server</title>
</head>
<%
String type = request.getParameter("type");
if (type.equals("A")) {
response.sendRedirect("/chap07/pageA.jsp");
} else if (type.equals("B")) {
response.sendRedirect("/chap07/pageB.jsp");
} else {
response.sendRedirect("/chap07/pageC.jsp");
}
%>
<body>
</body>
</html>
forward가 아닌 "response.sendRedirect"를 통해서 리다이렉트 시키면 URL이 어떻게 변경되는지 살펴보자
<jsp:forward> & <jsp:param>
<jsp:forward page = "~~~~">
<jsp:param name="~~" value="~~"/>
<jsp:param name="~~" value="~~"/>
</jsp:forward>
<jsp:include>와 동일한 방식으로 <jsp:param>을 통해서 이동할 페이지로 파라미터를 전달할 수 있다
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<%
String type = request.getParameter("type");
String forwardURL;
String value;
if (type.equals("A")) {
value = "Hello A";
forwardURL = "/chap07/paramPageA.jsp";
} else if (type.equals("B")) {
value = "Hello B";
forwardURL = "/chap07/paramPageB.jsp";
} else {
value = "Hello C";
forwardURL = "/chap07/paramPageC.jsp";
}
%>
<jsp:forward page="<%=forwardURL%>">
<jsp:param name="forward" value="<%=value%>"/>
</jsp:forward>
<body>
</body>
</html>
여러가지 type으로 값 전달?
request.getParameter("~~");
- 이렇게 request.getParameter로 값을 전달받게되면 "String"으로 return값이 정해져 있고 Date 값을 받고 싶으면 이 "String"을 변환해줘야 한다
>> 기본 객체의 속성을 사용하면 변환할 필요가 없다 :: Why? 기본 객체의 속성 (getAttribute)는 return 타입이 Object이기 때문이다
Example)
## setObject_test.jsp ##
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page import="java.util.*"%>
<html>
<head>
<title>Title</title>
</head>
<body>
<%
Calendar c = Calendar.getInstance();
request.setAttribute("time", c);
%>
<jsp:forward page="getObject_test.jsp"/>
</body>
</html>
## getObject_test.jsp ##
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page import="java.util.*"%>
<html>
<head>
<title>Title</title>
</head>
<body>
<%
Calendar cal = (Calendar)request.getAttribute("time");
out.print("현재 시간 : ");
out.print(cal.get(Calendar.HOUR) + "시 ");
out.print(cal.get(Calendar.MINUTE) + "분 ");
out.print(cal.get(Calendar.SECOND) + "초");
%>
</body>
</html>
당연히 getAttribute는 return type이 Object이므로 원하는 타입으로 casting해줘야 한다