-> 블로그 이전

[JSP] <jsp:foward> 액션 태그

2022. 3. 19. 20:49Language`/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해줘야 한다