자바 - include 관련

web 2007. 9. 28. 20:39

어제 c:import를 쓰면서 문득 생각난 것이 있었는데. jsp:include였다.

차이가 무엇일까 문서를 찾게 되었다.

 

c:import는 상대적인 URL, 외부 웹을 include하지만, jsp:include는 내부가 한계인듯 하다. (틀리면 알려주시요...)

 

밑에 발췌한 jsp:include는 relativeURL 나 표현식만을 page 어트리뷰트에 저장할 수 있다.

 

발췌

http://java.sun.com/products/jsp/syntax/1.2/syntaxref1214.html

 

 

<jsp:include>

Includes a static file or the result from another web component.

JSP Syntax

<jsp:include page="{relativeURL | <%= expression %>}" 	
   flush="true| false" />

or

<jsp:include page="{relativeURL | <%= expression %>}" 	
   flush="true| false" >	
   <jsp:param name="parameterName"	
      value="{parameterValue | <%= expression %>}" />+	
</jsp:include>

XML Syntax

<jsp:include page="{relativeURL | %= expression %}"	
   [ flush="true | false" ] /> 

or

<jsp:include page="{relativeURL | %= expression %}"	
[ flush="true | false" ] > 	
   [ <jsp:param name="parameterName" 	
      value="{parameterValue | %= expression %}" /> ] +	
</jsp:include> }

Examples

<jsp:include page="scripts/login.jsp" />
<jsp:include page="copyright.html" />
<jsp:include page="/index.html" />
<jsp:include page="scripts/login.jsp">	
   <jsp:param name="username" value="jsmith" />	
</jsp:include>

Description

The <jsp:include> element allows you to include either a static or dynamic resource in a JSP page. The results of including static and dynamic resources are quite different. If the resource is static, its content is included in the calling JSP page. If the resource is dynamic, it acts on a request and sends back a result that is included in the JSP page. When the include action is finished, the JSP container continues processing the remainder of the JSP page.

You cannot always determine from a pathname if a resource is static or dynamic. For example, http://server:8080/index.html might map to a servlet through a server alias. The <jsp:include> element handles both types of resources, so it is convenient to use when you don't know whether the resource is static or dynamic.

If the included resource is dynamic, you can use a <jsp:param> clause to pass the name and value of a parameter to the resource. As an example, you could pass the string username and a user's name to a login form that is coded in a JSP page.

Attributes

  • page="{ relativeURL | <%= expression %> }"

    The relative URL that locates the resource to be included, or an expression that evaluates to a String equivalent to the relative URL.

    The relative URL looks like a pathname--it cannot contain a protocol name, port number, or domain name. The URL can be absolute or relative to the current JSP page. If it is absolute (beginning with a /), the pathname is resolved by your web or application server.

  • flush="true | false"

    If the page output is buffered and the flush attribute is given a true value, the buffer is flushed prior to the inclusion, otherwise the buffer is not flushed. The default value for the flush attribute is false.

  • <jsp:param name="parameterName"
      value="{parameterValue | <%= expression %>}" />+ 

The <jsp:param> clause allows you to pass one or more name/value pairs as parameters to an included resource. The included resource should be dynamic, that is, a JSP page, servlet, or other resource that can process the parameter.

You can use more than one <jsp:param> clause if you want to send more than one parameter to the included resource. The name attribute specifies the parameter name and takes a case-sensitive literal string. The value attribute specifies the parameter value and takes either a case-sensitive literal string or an expression that is evaluated at request time.

 

 

발췌

http://aboutjsp.com/lec/include.jsp

 

 
* JSP Action - <jsp:include page="URI" flush="true" />

[syntax]
1). body 구문이 없는 경우
<jsp:include page="URI" flush="true" />

2). body 구문이 있는 경우
<jsp:include page="URI" flush="true">
<jsp:param name="파라메터이름" value="파라메터값" /> /* xxx.jsp?파라메터이름=파라메터값 */
</jsp:include>  

위와 같이 두가지 사용 용법이 있으며, 두번째 방법을 사용하면 해당 jsp파일에 파라메터값도 넘겨 줄수가 있습니다.
JSP Action 구문의 include 는 include되는 파일과 include 시키는 파일(doc1.jsp와 doc3.jsp)를 각각 컴파일 한후 두 파일의 실행 결과를 한곳에 합쳐서 출력을 하게 됩니다. 즉, 완전히 "별도로" 동작하게 됩니다.
여기에서 flush="true" 문장은 true나 false 가 들어 갈수 있는 부분으로써 include를 실행하기 전에 out.flush()를 실행할지 여부를 결정하는 것입니다. 물론 true일때 out.flush()를 실행하겠지요. JSP 스펙 1.1 까지는 반드시 true로 설정이 되어 있어야만 했으니, 1.2 부터는 true/false중 원하는것을 선택하면 됩니다.


* include 지시어 - <%@ include file="URI" %>

include 지시어 와 Action 구문과의 가장 큰 차이점은 include 지시어는 컴파일 되기전에 파일이 내용이 합쳐진다는 것입니다. 즉, doc3.jsp 는 doc2.jsp의 내용을 자신의 문서내에 포함하여 하나의 파일로 인식한다는 것입니다. doc2.jsp 에 보면 page Directive 가 생략이 되어 있는데, 그것이 바로 이러한 이유 때문입니다.

doc2.jsp에도 page Directive를 설정해 주었다면 에러가 발생할 것입니다. 하나의 페이지에 두번 선언을 하는 꼴이 되어 버릴테니까 말이죠.

 

그런데, Action 구문을 사용 하였을 때에는 두개의 파일 각각 다른 파일처리 되어 두개의 servlet 파일 생성하게 됩니다. 따라서 어느 한 파일이 수정되면 곧바로 적용되어 화면에 출력이 되게 됩니다.

하지만 include 지시어 문을 사용하게 되면 하나의 servlet 파일이 생성되게 됩니다. 이로 인해 엄청난 차이점이 발생하게 되는데, JSP의 특성상 JSP파일이 조금이라도 수정이 되어 있으면 servlet 으로 재 변경되어 다시 컴파일이 이루어 지게 됩니다. 그런데, doc2.jsp 파일을 내용을 수정하고, doc3.jsp 파일을 부르게 되면 수정되기 전의 doc2.jsp 파일의 내용이 출력됩니다.

 

이러한 특징은 tomcat 5 버젼대부터 달라지게 되었는데, include되는 파일을 수정하더라도 서블릿 컨테이너가 알아서 모두 재 컴파일 해준다는 것입니다. 필자가 확인한 바로는 OC4J 최신 버젼에서도 tomcat 5와 같이 자동으로 처리되었습니다.

 

 

 톰캣 5부터는 이러한 문제가 사라진다고 하는군... include에 대한 dependency를 제거된다고 한다.. 오호라~ 굿!

'web' 카테고리의 다른 글

L7 스위치 개념 및 동작원리  (0) 2007.09.29
L4스위치와 L7스위치의 차이점  (0) 2007.09.29
외부 컨텐츠를 가져오는 법  (0) 2007.09.28
jsp에서 한글이 깨지는 현상  (0) 2007.09.28
SSL (c, java)  (0) 2007.09.28
Posted by '김용환'
,