이전글


<jsp:include> 액션 태그 사용법
<jsp:include> 액션 태그를 사용하면 현재 JSP 페이지에 대상 JSP 페이지의 처리 결과를 포함시킬 수 있습니다. <jsp:include> 액션 태그의 내부 동작 및 자세한 내용은 이전글을 참고합니다. <jsp:include> 액션 태그의 사용 형식은 다음과 같습니다.
<jsp:include page="포함시킬 JSP 페이지" flush="출력 버퍼 flush 여부" />                        
cs

 

 

page 속성 - page 속성에는 포함시키고 싶은 JSP 페이지를 지정해주면 됩니다.
flush 속성 - 포함 대상 JSP 페이지에 제어를 넘기기 직전에 출력 버퍼를 클라이언트로 출력하는 flush를 수행할지 여부(true, false)를 지정합니다. 기본값은 false이며, flush 하지 않습니다.


main.jsp 페이지에서 included.jsp 페이지를 포함시키는 방법은 다음과 같습니다. 다음은 main.jsp 페이지이며, 액션태그를 사용하면 해당 위치에 included.jsp 페이지의 처리 내용이 포함될 것입니다.
<%@ page contentType="text/html; charset=utf-8"%>                                        
<html>
<head>
</head>
<body>
      main.jsp 페이지 before
 
 
      <jsp:include page="/included.jsp" flush="false" />
 
 
      main.jsp 페이지 after
</body>
</html>
cs

 

 


included.jsp 페이지의 내용입니다.
<%@ page contentType = "text/html; charset=utf-8" %>                                    
 
 
<h1>included.jsp 페이지 내용</h1>
cs

 

 


브라우저를 통해 main.jsp 페이지를 요청하면 다음과 같은 결과를 볼 수 있습니다.


최종적으로 출력된 HTML을 보니 다음과 같습니다.



include 액션태그는 개념적으로는 대상 페이지의 처리 내용을 포함시키는 것이지만 내부적인 동작은 request, response, out 객체를 공유하면서 제어를 넘겨 처리하기 때문에 출력 버퍼를 공유하는 것입니다. 자세한 내용은 이전글을 참고합니다.



flush 속성
flush 속성은 제어를 포함 페이지로 넘기기 전에 출력 버퍼를 flush 할것인지 여부를 지정하는 것인데, 이 값을 true로 하게 되면 포함되는 included.jsp 페이지에서는 response.setHeader() 메서드를 실행하여 HTTP 응답 헤더를 바꾸려 해도 적용되지 않게 됩니다.

그 이유는 출력 버퍼에 가장 최초에 저장되는 내용이 HTTP 응답 메시지의 헤더 부분이기 때문입니다. 따라서 최초에 출력버퍼가 flush 되는 시점에 HTTP 응답 메시지의 헤더는 브라우저로 출력되는데, 여기서는 flush 값이 true이므로 제어가 넘어가기 직전에 헤더 내용이 브라우저로 출력 되어 버립니다.

다음 글들을 참고하시면 이해가 빠를것입니다.




<jsp:param> 으로 파라미터 데이터 넘기기
앞서 말했듯이 include 액션 태그를 사용하면 request 객체를 공유한다고 했습니다. 하나의 request 객체를 공유한다는 것은 다시 말하면 브라우저가 보낸 하나의 HTTP 요청범위 안에서 동작한다는 점 입니다. 이점을 이용한것이 <jsp:param> 액션 태그입니다. <jsp:param> 액션태그를 사용하면 포함되는 대상 페이지에 요청 파라미터를 넘길 수 있습니다. 즉 메인 페이지와 포함되는 페이지 사이에 데이터를 공유할 수 있는 것입니다.


main.jsp
<%@ page contentType="text/html; charset=utf-8"%>                                            
<html>
<head>
</head>
<body>
      <%
            request.setCharacterEncoding("UTF-8");
      %>
 
 
      <jsp:include page="/included.jsp" flush="false">
            <jsp:param name="greeting" value="안녕하세요." />
            <jsp:param name="pageName" value="main.jsp" />
      </jsp:include>
 
 
</body>
</html>
cs

 



/included.jsp
<%@ page contentType = "text/html; charset=utf-8" %>                                        
 
 
<%
      String greeting = request.getParameter("greeting");
      String pageName = request.getParameter("pageName");
%>
 
 
<%= greeting %> <%= pageName %> 페이지입니다.
cs

 

 


main.jsp로 요청을 하면 main.jsp에서는 <jsp:param> 액션태그를 통해 request 객체에 담아 included.jsp 페이지와 파라미터를 공유합니다.




pageName 속성처럼 표현식을 통해서 <jsp:param> 액션태그의 값을 설정할수도 있습니다.
      <%
            request.setCharacterEncoding("UTF-8");
            String pageName = "main.jsp";
      %>
      <jsp:include page="/included.jsp" flush="false">
            <jsp:param name="greeting" value="안녕하세요." />
            <jsp:param name="pageName" value="<%= pageName %>" />                            
      </jsp:include>
cs

 

 




<jsp:param> 동작 방식
<jsp:include> 액션태그는 포함시킬 페이지에게 제어를 넘김과 동시에 request, response, out 기본 객체를 넘겨 공유합니다. JSP 페이지가 서블릿으로 변환될 때 <jsp:include> 액션태그와 <jsp:param> 액션태그는 다음과 같은 방식으로 변환됩니다. request 객체를 공유하지만 포함되는 페이지인 included.jsp 페이지 입장에서는 /included.jsp?greeting=안녕하세요. 로 요청이 들어온것처럼 판단합니다.

main.jsp
<%
      request.setCharacterEncoding("UTF-8");
%>
 
 
<jsp:include page="/included.jsp" flush="false">
      <jsp:param name="greeting" value="안녕하세요." />                                        
</jsp:include>    
 
 
<%=   request.getParameter("greeting"%>
cs

 

 


main.jsp가 서블릿으로 변환되었을때 로직
spRuntimeLibrary.include(request, response, "/included.jsp" + "?" +  org.apache.jasper.runtime.JspRuntimeLibrary.URLEncode("greeting",  request.getCharacterEncoding())+ "=" 
            +  org.apache.jasper.runtime.JspRuntimeLibrary.URLEncode("안녕하세요.",  request.getCharacterEncoding()), outfalse);
cs

 

 




파라미터 공유시 한글 처리
포함되는 페이지와 파라미터를 공유할 때 한글데이터가 들어가는 경우 request.setCharacterEncoding("UTF-8") 메서드를 공유 전에 사용하여, 파라미터 인코딩 설정을 해주어야 합니다. 그렇지 않으면 한글 데이터가 URL이 인코딩 되지 않아 깨지게 됩니다. 동작 방식에서 변환된 서블릿 로직에 보면 설정된 캐릭터 셋으로 값을 넘길때 인코딩 한다는것을 알 수 있습니다.
JspRuntimeLibrary.URLEncode("안녕하세요.",  request.getCharacterEncoding())                
cs

 

 


다음글


참고글
블로그 이미지

도로락

IT, 프로그래밍, 컴퓨터 활용 정보 등을 위한 블로그

,