본문 바로가기

프로그래밍/JAVA, Servlet, JSP

jsp include

■  다음 두 가지 include 메커니즘을 사용하여 재사용 가능한 컴포넌트를 구축할 수 있다.

       지시자    :  <%@ include file="aaa.jsp"  %>

     표준 액션 : <jsp:include page="aaa.jsp" />

 

■  include 지시자는 전환할때 (jsp → java ) 에 포함 작업을 한다. 그것도 딱 한 번만.

      따라서, include 지시자는 배포된 다음 거의 수정을 하지 않는 컨텐츠에 적합한 메커니즘

      이다.

 

■  include 지시자는 포함할 파일 내용 전부를 복사하여 해당 위치에 붙여 넣는다.

     컨테이너는 이 파일을 합쳐 하나로 만든 다음 컴파일하고 서블릿 코드를 생성한다.

     Runtime 시에, include 지시자를 가진 페이지는 두 파일을 합쳐 하나로 만든 jsp 와 동일하게

    작동한다.

 

■  <jsp:include> 표준 액션은 Runtime 시에 포함될 페이지 응답을 원본 페이지에 포함한다.

      따라서, <jsp:include> 표준 액션은 배포되고 난 다음에도 수정이 되는 컨텐츠에 적합하다.

 

■  두 메커니즘 모두 동적인 컨텐츠를 포함 할 수 있다. 예를 들면, EL 표현식이 있는 JSP 를

      포함할 수 있다.

 

■  include 지시자는 여러 지시자 중 코딩 위치에 민감한 유일한 지시자이다. include 지시자가

      있는 바로 그 위치에 컨텐츠가 포함되기 때문이다.

 

■  include 지시자 속성과 <jsp:include> 표준 액션의 속성은 그 이름이 다르다.

       지시자    :  <%@ include file="aaa.jsp"  %>

     표준 액션 : <jsp:include page="aaa.jsp" />        

 

■  재사용 가능한 컴포넌트로 만들려면, 시작, 마침 태그를 제거해야 한다. 모든 브라우져가

     중간에 들어간 <html><body> ....</body></html> 등의 마침 태그를 제대로 출력하는

     것은 아니기 때문이다. 재사용 가능한 컴포넌트는 다른 컴포넌트에 포함/삽입된다는 것을

     늘 염두에 두고 설계, 구현해야만 한다.

 

■  <jsp:include> 표준 액션의 body 에 <jsp:param> 태그를 사용하여 요청 파라미터를

      설정(또는 대체) 할 수 있다.

 

■  <jsp:forward> 의 몸체에도 <jsp:param> 태그의 사용이 가능하다.

 

■  <jsp:param> 태그는 <jsp:include> 와 <jsp:foward> 태그 내에서만 의미가 있다.

 

■  <jsp:param> 파라미터가 요청 파라미터에 있는 것이라면 이전 값을 덮어쓰고(overwrite),

     그렇지 않으면 요청에 새로운 파라미터를 생성한다.

     (예를 들어..)

     원 페이지에 있는 A=foo 라는 파라미터가 있고, 몸체에서 A=bar 라는 파라미터를 추가했다면

     포함된 페이지에서 A 에는 bar 가 들어가 있다. 새로운 것이 항상 우선이다.

     그리고, 추가한 파라미터의 생존범위는 include 페이지로, 이 안에서만 유효하다.

     즉, 포함한 페이지에서는 항상 A=foo 이다.

 

■  포함될 자원은 다음과 같은 제한이 있다.

      포함될 자원에는 응답 상태코드(Response Status Code)를 변경할 수 없으며,

      헤더(header)를 설정할 수 없다.

 

■  <jsp:forward> 표준 액션은 동일 web application 에 있는 다른 자원으로 요청을 넘긴다.

      (RequestDispatcher 처럼... )

 

■  포워딩 작업 직전, 응답 버퍼의 내용을 먼저 지우게 된다.

     따라서, 응답을 넘겨받은 자원은 아주 깨끗한 상태에서 출력 스트림 작업을 하게 된다.

     포워딩 전에 쓰여진 내용이 혹시라도 있다면 모두 버려진다(clearing 된다) 는 것을

    항상 염두에 두고 있어야 한다.

 

■  포워딩 전에 응답을 보냈다면... (예를 들어,   out.flush() 를 호출했다면..) 

      클라이언트는 out.flush() 를 통해서 내보내진 등답을 받지만, forwarding 된 응답을

     받지 못한다. 물론, out.flush() 이후에 출력 스트림에 기록된 내용도 받지 못한다.