forward는 페이지 흐름 제어를 한다.
[a.jps]
<jsp:forward page="b.jsp" />
위처럼 a.jsp에서 실행을 시키면 a에 어떤 내용이 있는지는 중요하지 않음.
바로 b.jsp에 있는 내용이 출력되고 url은 a.jsp로 출력되는 것이 특징이다.
[forward02.jsp]
<jsp:forward page="/ch04/forward02_data.jsp">
<jsp:param name="dan" value="5" />
</jsp:forward>
위처럼 forward로 페이지를 출력할때 <jsp:param name="dan" value="5" />로 넘겨 줄 수 있다. 넘어간 파라미터는 두가지로 받을 수 있다.
첫번째
<% Integer num = Integer.parseInt(request.getParameter("dan"));%>
<%=num %>
두번째
${param.dan }
첫번째 방법과 두번째 방법이 있는데 첫번째는 request객체를 통해서 name값이었던 dan을 파라미터로 받는 방법과 두번째는 ${}안에 'param.name명' 형식으로 출력하여 value값을 받는 방법이다.
여기서 첫번째 방법으로 하여 앞에서 배웠던 taglib을 사용하면..
<c:set var="num" value="<%=num %>" />
'${num}'형식으로 사용할 수 있다.
include는 jsp페이지 내에 다른 페이지를 출력하는 것이다. forward와 다른 점은 forward는 페이지를 호출하면 현재페이지의 내용은 뭐가 있든지 알 수 없지만 include는 페이지 사이에 들어가면 중간에 출력하여 보여주고 이어서 현재페이지 내용들을 보여준다.
외부 파일로는 jsp, html, 서블릿페이지가 있다.
includeAction03.jsp
<h2>include 액션 태그</h2>
<jsp:include page="includeAction04.jsp" flush="false">
<jsp:param name="date" value="<%=new Date() %>" />
</jsp:include>
<p>----------------------</p>
*flush는 'false'로 지정하는 것이 일반적이다. 만일 true로 지정하게 되면 출력 버퍼의 내용을 웹브라우저에 전송하는데 헤더 정보도 같이 전송이되어 헤더정보를 후에 추가시 결과가 반영되지 않아 일반적으로 false를 지정해준다.
includeAction04.jsp
<p>오늘은 몇일? 그리고 지금 시간은?</p>
<p><%=(new Date()).toLocaleString() %></p>
<p>Today is : <%=request.getParameter("date") %></p>
위에 두 jsp중에 위에 includeAction03.jsp를 실행 시키면 중간에 includeAction04.jsp가 나오는 것을 아래 출력 화면에서 볼 수 있다.
*** 여기서 나는 의문점을 갖는 것이 있었다. 디렉티브태그의 <%@ include.. %>와 현재 액션 태그의 <jsp:include..>의 차이를 알 수 없었다. 그래서 똑같은건가라는 의문이 들었다. 궁금해서 검색해보니 디렉티브의 include는 소스가 실행 되긴 전에 include가 되어 변수를 같이 사용할 수 있고 대신 동적으로 페이지 할당을 할 수 없다고 한다. 반면에 액션태그 include는 변수를 같이 사용 할 수 없고, 실행 중에 동적으로 페이지가 할당이 가능하다고 한다.
param 태그는 앞에 forward할때 잠깐 나왔지만 다시 한번 설명을 하면 forward나 include, plugin에 파라미터를 넘겨주고 싶을 때 사용이 된다. 다시말하면 단독으로는 사용 할 수 없다는 것을 의미한다.
forward예시는 앞에 있었으니 include예시를 작성하겠다.
param02.jsp
<h3>param 액션 태그</h3>
<jsp:include page="param02_data.jsp">
<jsp:param name="title" value='<%=URLEncoder.encode("오늘의 날짜와 시각") %>' />
<jsp:param name="date" value="<%=Calendar.getInstance().getTime() %>" />
</jsp:include>
<h3>param 액션 태그</h3>
param02_data.jsp
<p><%=URLDecoder.decode(request.getParameter("title")) %></p>
<p><%=request.getParameter("date") %></p>
param02.jsp를 실행하고 include태그 안에 param값을 넣어서 param02_data.jsp를 포함한다. 파라미터 값은 name값으로 가져와 value값을 얻는다.
*** 한글이 깨지는 것을 방지하기 위해서 파라미터를 보내줄때 encoding하고 받을때 decoding을 했다.