홈페이지 꼭대기로

JSP 2.0: 뭐가 바뀌었나? - 3부

원문 : http://www.onjava.com/pub/a/onjava/2004/04/21/JSP2part3.html

by Hans Bergsten, JavaServer Pages, 3판의 저자

번역 손권남(kwon37xi_aT_yahoo dOt co DoT kr

2004/04/21

더욱 유연해진 JSP 문서 포맷 규칙

JSP 스펙은 두 가지 형태의 JSP 페이지를 지원한다. 어떤 형태의 텍스트나 마크업이라도 포함하는 일반 JSP 페이지와 XHTML이나 JSP 엘리먼트와 같은 웰폼드(Well-formed) XML 인 JSP 문서(Document)이다. 웰폼드 XML 문서가되려면 JSP 지시자와 스크립트 요소들이 일반 JSP와는 다른 방식으로 기술되어야 한다.

일반 JSP 페이지 JSP 문서
<%@ page 속성목록 %> <jsp:directive.page 속성목록 />
<%@ include file="path"%> <jsp:directive.include file="path" />
<%! 선언 %> <jsp:declaration>선언 </jsp:declaration>
<%= 수식 %> <jsp:expression>수식</jsp>
<% 스크립틀릿 %> <jsp:scriptlet>스크립틀릿</jsp:scriplet>

태그 라이브러리는 JSP 문서에서 XML 네임스페이스로 선언된다. 예를들어 XHTML과 JSP 표준 액션 그리고 JSTL 코어 라이브러리를 사용하는 JSP 문서는 <html> 루트 엘리머튼에 다음과 같은 네임 스페이스 선언을 가져야 한다.

<html
    xmlns="http://www.w3c.org/1999/xhtml"
    xmlns:jsp="http://java.sun.com/JSP/Page"
    xmlns:c="http://java.sun.com/jsp/jstl/core"
    xml:lang="en" lang="en">

xmlns 속성은 기본 네임스페이스를 XHTML의 네임스페이스로 설정한다. xmlns:jsp 속성은 JSP 표준 액션에 정의된 jsp 접두사에 관한 것이고, xmlns:c 속성은 JSTL Core 라이브러리에 의해 정의된 c 접두사에 관한 것이다.

JSP 문서는 처음부터 JSP 명세의 한 부분이었으나 초기에는 선택사항일 뿐이었고 나중에도 많은 제약을 갖고 있었다. JSP 2.0 은 대부분의 제약을 없애고, 매우 쉽게 XML과 JSP를 함께 사용할 수 있게 했다.

JSP 2.0 이전에는 JSP 문서는 <jsp:root>요소를 꼭 포함하여 JSP 컨테이너에게 이것이 JSP 페이지임을 알려주어야만 했다. JSP 2.0은 JSP 문서임을 알려주는 다른 방법을 정의하여 이 제한을 없앴다. 다음 조건들 중 한 가지만 만족하면 JSP 컨테이너는 파일을 JSP 문서로서 처리한다 :

  1. 요청된 경로가 web.xml 파일에서 JSP 속성 그룹의 선언에 <is-xml> 요소를 true로 하여 정의된 URL 패턴과 일치하면 된다. Part 2 에서 JSP 속성 그룹의 선언에 대해 더 자세한 사항을 볼 수 있다.
  2. 요청된 경로의 확장자가 .jspx이고, 이 확장자가 JSP 속성 그룹 선언에서 <is-xml> 요소를 false로 지정하지 않았다면 JSP 문서로 인식한다. 다시 말해 .jspx는 JSP 문서의 기본 확장자이다. 하지만 속성 그룹 선언에 의해 명시적으로 다른 용도로 사용할 수 있다.
  3. 요청된 경로의 확장자가 .jsp이거나 혹은 JSP 속성 그룹 선언의 URL 패턴에 일치하고 최상위 요소(root element)가 <jsp:root>이면 JSP 문서로 간주한다.

이 새로윤 규칙에 의해 JSP 문서를 <jsp:root> 요소가 필요 없는 일반 XHTML 파일처럼(물론 동적 컨텐트를 위해서 JSP 요소를 포함하면서) 작성할 수 있게 되었다. JSP 속성 그룹 선언을 다음과 같이 하면 확장자가 .html인 JSP 문서도 가능하다 :

...
<jsp-config>
  <jsp-property-group>
    <url-pattern>*.html</url-pattern>
    <is-xml>true</is-xml>
  </jsp-property-group>
</jsp-config>
...

XML 요소를 생성하는 새로운 방식

JSP 1.2 명세에 따라 JSP 문서를 작성해보았다면, 거의 대부분 XML 요소의 속성에 동적으로 값을 대입할때 문제가 있음을 발견했을 것이다. 예를 들어, XML 요소의 class 속성에 사용자의 스타일 설정을 가지고 있는 빈(bean) 프라퍼티 값을 대입한다고 하자. 당신은 아마 다음과 같은 시도를 먼저 해볼 것이다 :

<table class="<%= user.getTableClass() %>">

JSP 문서에서 이런 형태의 자바 수식이 JSP 액션 요소의 속성 값으로 사용될 수도 있으나, JSP는 템플릿 텍스트에서는 이러한 문법을 인정하지 않는다. 그러므로 여기서와 같은 방법은 작동하지 않는다.

JSP 액션 요소를 사용하여 속성값을 정하려는 시도 또한 작동하지 않는다:

<table class="<c:out value="${user.tableClass}"/>">

이것은 작동하지 않는다. 웰폼드 XML은 요소의 속성값으로 보다 작다 기호(<)를 포함할 수 없다.

JSP 1.2에서 웰폼드 XML을 준수하면서 동적으로 XML 요소의 속성값을 지정하는 방법은 매우 보기 안좋은 CDATA 섹션을 이용하는 것이다. 이것은 XML 요소의 처음과 끝을 마크업이 아닌 일반 텍스트(동적으로 생성된 값으로 둘러 쌓인)로 간주한다 :

<jsp:text><!CDATA[<table class="]]></jsp:text>
<c:out value="${user.tableClass}""/>
<jsp:text>[CDATA[">]]</jsp:text>

JSP 2.0은 매우 간단한 해결책을 제시해 준다. 템플릿 텍스트 중간에 EL 표현식을 사용하거나 요소를 생성하는 새로운 표준 액션을 사용하면 된다. EL 표현식으로 예제를 바꿔 쓰면 다음과 같다:

<table class="${user.tableClass}">

JSP 2.0 컨테이너는 액션의 속성은 물론 템플릿 텍스트 사이의 EL 표현식을 평가(계산)한다. 그러므로 거의 모든 경우에 이것이 가장 훌륭한 해결책이 된다.

EL 표현식으로 대입하고자 하는 값을 평가할 수 없다면, 그 대신에 3개의 새로운 표준 액션과 속성값을 나타낼 수 있는 아무 JSP 코드나 함께 이용하여 동적으로 XML 요소를 만들어낼 수 있다:

<jsp:element name="table">
  <jsp:attribute name="class">
    <c:out value="${user.tableClass}"/>
  </jsp:attribute>
  <jsp:body>
   ....
  </jsp:body>
</jsp:element>

<jsp:element> 액션은 XML 요소를 만들고 거기 포함된 <jsp:attribute> 요소는 요소의 속성을 만든다. 속성의 값은 <jsp:attribute>의 바디의 평가 결과로 설정된다. 그러므로 이 예에서 사용한 <c:out>을 쓴 것 처럼 요소 값을 생성하는 사용자 정의 액션을 사용하여도 된다. 유사하게 <jsp:body> 요소에 포함된 값을 평가하여 생성될 요소의 값으로 지정할 수 있다.

XML 선언을 위한 새로운 표준 액션

XML 문서는 문서의 맨 위에 XML 선언을 가질 수 있다. 일반적으로 그 뒤에 DOCTYPE 선언이 뒤따른다. JSP 2.0 에서는 <jsp:output> 표준 액션을 이용하여 이 두가지 선언의 생성을 조절할 수 있다.

JSP 문서가 최상위 요소로 <jsp:root> 요소를 가지고 있지 않은 이상(혹은 이 시리즈의 다음 기사에서 다룰 tag 파일을 나타내거나), JSP 컨테이너는 기본적으로 다음과 같은 XML 선언을 생성한다:

<? xml version="1.0" encoding="encodingValue" ?>

encoding 속성의 값은 JSP page 지시자의 contentType 속성에 의해 지정된 문자 인코딩이 되거나 명시적으로 지정하지 않았을 경우에는 UTF-8이 된다. XML 선언이 생성되는 것을 막고 싶을 때(아마도 JSP 문서가 다른 JSP 페이지에 포함될 경우에), JSP 문서에서 <jsp:output> 액션 요소를 사용해 JSP 컨테이너를 설득할 수 있다 :

<jsp:output omit-xml-declaration="true" />

선언 생성을 막기 위해 속성의 값을 'true'나 'yes'로 지정하고, 그렇지 않다면 'false'나 'no'를 사용한다.

DOCTYPE 선언은 XML 파서(브라우저에서 사용되는 것과 같은)에게 이 문서가 어떤 Document Type Declaration(DTD)를 따르는지를 알려준다. 파서는 이 정보를 이용해서 오직 DTD에 의해 선언된 XML 요소만을 포함하고 있는 문서인지를 검사한다. JSP 문서에 의해 생성될 문서에 대한 DOCTYPE 선언을 넣어서는 안된다. 그렇게 하면 JSP 문서 자신이 그 DTD에 따른다고 지정하는 것이 되어버린다. 대신 <jsp:output> 액션을 사용하여 JSP 문서에 의해 생성될 결과 문서의 DTD 선언을 추가할 수 있다 :

<jsp:output doctype-root-element="html"
  doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN"
  doctype-system="http://www.w3c.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"/>

<jsp:directive.page contentType="text/html" />

이 예에서와 같이 사용하면 <jsp:output> 액션은 결과로 XHTML을 위한 DOCTYPE 선언을 추가한다 :

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"   "http://www.w3c.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

나는 또한 이 예제에서 브라우저가 결과 컨텐트를 어떻게 다뤄야 할지를 판단하게 하기 위해, <jsp:directive.page> 선언에 contentType 속성을 text/html MIME 타임으로 지정하여 포함시켰다. 참고로 XHTML에 맞는 정확한 MIME 타입은 application/xhtml+xml인데, 몇몇 최신 브라우저(특히 Internet Explorer 6)은 그것을 인식하지 못한다. text/html은 대부분의 브라우저들이 어떻게 다뤄야 할지를 아는 XHTML을 위한 MIME 타입으로 통용된다.

마무리

지금까지 보았듯이 JSP 2.0은 매우 쉽게 JSP 페이지를 XML 문서로 작성할 수 있도록 해준다. 이 시리즈의 마지막 편은 커스텀 태그 라이브러리에 관한 새로운 특징들을 알아볼 것이다 : 새로운 태그 파일 형식과 간단한 태그 API.

JSP 2.0의 새로운 기능들을 접해보고 싶다면, Apache Tomcat 5를 사용해보라고 권하고 싶다. 톰캣은 새로운 JSP 스펙을 최초로 구현한 JSP 컨테이너이다. Jakarta Project 사이트에서 구할 수 있다.