본문 바로가기
웹프로그램

JSP include 집중해부

by 세이박스 2009. 6. 9.
반응형
include 에는 크게 2가지가 있습니다. 잘 아시는 <%@ include file="" %> 과 조금은 낯선 <jsp:include page="" flush="true"/> 입니다. 일단 3개의 파일을 먼저 보겠습니다.

ok.jsp
<%@ page contentType="text/html;charset=euc-kr"%><%
String ab="파일 ok.jsp 입니다.";
%><%=ab%>
<br>
<%@ include file="okD.jsp" %>
<br>
<jsp:include page="okA.jsp" flush="true"/>


unix 계열에서 돌아갈 경우 소스입니다. 한글 때문에 한번더 꽈줍니다.
okD.jsp
<%
String abc="파일 okD.jsp 입니다.";
%><%=new String(abc.getBytes("8859_1"),"euc-kr")%>
<br><%=new String("HTML 텍스트입니다.".getBytes("8859_1"),"euc-kr")%>
<br>


환경(jsp엔진)에 따라 아래처럼 인코딩을 없애줘도 됩니다. 재수가 좋은 경우죠
(okD.jsp)
<%
String abc="파일 okD.jsp 입니다.";
%><%=abc%>
<br>HTML 텍스트입니다.
<br>


page Directive로 charset을 정해주어야 한글이 깨지지 않습니다.
okA.jsp
<%@ page contentType="text/html;charset=euc-kr"%><%
String abc="파일 okA.jsp 입니다.";
%><%=abc%>
<br>
<br>


파일 3개를 저장하시고, 브라우저에서 http://localhost:8080/ok.jsp 로 실행해보십시오. 물론 기본디렉토리에 위치시켜야죠. 이거 질문하는 분들 장난아니게 많습니다. tomcat 의 경우 server.xml 을 변경하지 않고 bin/startup.bat (startup.sh) 를 실행하셨다면 webapps/ROOT/ 가 기본디렉토리입니다. resin 의 경우는 doc 디렉토리가 기본 디렉토리겠죠. apache 랑 연동했을 경우 apache의 DocumentRoot 를 톰캣의 c:/jakarta-tomcat/webapps/ROOT 로 맞춰주시는 것이 헷갈리지 않을 겁니다.

include Directive 는 <%@ ... %> 로 싸여있습니다. @은 Directive 라는 의미죠. 포함하는 문서에 정적으로 컴파일 됩니다. 포함하는 파일(ok.jsp)에서 사용한 변수를 따로 선언하지 않고 바로 사용할 수 있습니다. 물론 여기(okD.jsp)에서 선언된 변수도 포함하는 파일(ok.jsp)에서 따로 선언하지 않고 사용할 수 있습니다. 대신 이 파일(okD.jsp)을 변경할 경우 포함하는 파일(ok.jsp)의 시스템 날짜를 변경해서 재컴파일을 유도해야 이 파일(okD.jsp)의 변경사항이 적용되는 것을 볼 수 있습니다.

include Action은 xml 형식으로 <jsp:include page=... flush="true" /> 를 사용합니다. flush="true" 는 그냥 쓰십시오 false로 바꾼다거나 빼먹거나 하면 안됩니다. 묻지 마십시오. 다칩니다. (==O%TT; 퍽!)

include Action은 동적이라고 합니다. 처음엔 저도 이해가 안 갔습니다. 하지만 쓰면서 이 넘이 얼마나 독립적인지 아주 잘 알게 되었고, 왠만한 경우 저는 directive 보다는 action 을 사용합니다. 이 넘은 포함하는 파일과 상관없이 실행이 됩니다. directive 의 경우 ok.jsp와 okD.jsp 의 소스가 합져져서 하나로 컴파일되어 동작하는 것과 같지만 action 의 경우 ok.jsp 컴파일하고 okA.jsp 따로 컴파일되어서 ok.jsp가 okA.jsp를 호출해서 사용하고 다시 ok.jsp가 동작하는 구조라고 생각하시면 될 것입니다. (죄송합니다만 제가 경험상 체득한 것이라 검증이 필요한 부분입니다.)

include Action 에는 page directive가 있습니다. include directive 에는 Page directive 가 없습니다. 만일 okD.jsp 에 <%@ page contentType="text/html;charset=euc-kr"%> 를 넣는다면 contentType="text/html;charset=euc-kr" 가 두개가 되기 때문에 Page directive: can't have multiple occurrences of contentType 라고 Exception 메시지를 보실 수 있습니다. import 속성이 틀리다면 contentType="text/html;charset=euc-kr" 만 삭제해주시면 될 것입니다. (이것도 자주 질문 하시는 것 중의 하나입니다.)

파일을 변경해보겠습니다. (ok.jsp) 는
ok.jsp
<%@ page contentType="text/html;charset=euc-kr"%><%
String ab="파일 ok.jsp 입니다.";
%><%=ab%>
<br>HTML 텍스트입니다.
<br>
<br>
<%@ include file="okD.jsp" %>
<br>
<jsp:include page="okA.jsp" flush="true">
<jsp:param name="ab" value="<%=ab%>"/>
</jsp:include>


okD.jsp
<%
String abc="파일 okD.jsp 입니다."+"###"+ab;
%><%=new String(abc.getBytes("8859_1"),"euc-kr")%>
<br><%=new String("HTML 텍스트입니다.".getBytes("8859_1"),"euc-kr")%>
<br>


okA.jsp
<%@ page contentType="text/html;charset=euc-kr"%><%
String ab =request.getParameter("ab");
String abc="파일 okA.jsp 입니다."+"###"+ab;
%><%=abc%>
<br>
<br>


이해가 가실라나요? 변수전달방법입니다. Action 에 대해서 좀더 살펴봐야 할 것이 있습니다. 잠시 커피좀...

관련 사이트
■http://aboutjsp.com/lec/include.htm
hsboy님의 include 강좌
반응형