티스토리 뷰

Dev/EL & JSTL

JSTL <xml>

Pupustory 2009. 2. 12. 15:43
xml을 이용하기 위한 JSTL tlb 사용법을 알아보자. 지금까진 별도의 .jar없이(JSTL관련 제외)사용했지만 xml 이용을 위해선 xalan.jar를 추가해야 한다. 만약 추가 하지 않으면 다음과 같은 문제를 발견할 것이다.

root cause

java.lang.NoClassDefFoundError: org/apache/xpath/XPathException

따라서 먼저 xalan.jar를 설치해야 한다.
JSTL xml 사용을 위한 xalan.jar 추가방법
1. xalan.jar 라이브러리를 다운로드 2. 프로젝트에 xalan.jar 추가

<x:parse doc="" filter="" scope="" scopeDom="" systemId="" var="" varDom="" xml=""> body </x:parse>
Dom이 분은 부분은 Dom으로 이용하는 의미고 .. var는 파싱된 xml 변수이다. 만약 외부에서 가져오는 부분이 있다면 jstl core부분에서 다룬 <c:import url="" var="xml"/>로 포함시킨 뒤 이것을 파싱해야 한다. <x:parse xml="$xml" />의 식으로 사용하면 된다. 만약 직접 작성되는 xml이라면 body부분에 직접 작성할 수도 있다.(<x:parse var="xmldata"> <root></root></x:parse>)

filter는 org.xml.sax.XMLFilter인스턴스를 지정하여 파싱 전 문서를 걸러낸다. 이부분은 필자도 구체적으로 사용한바 없어 추가설명은 넘어가겠다.


<x:set var="" select="" scope=""/>
위 예제코드에서 사용한데로 select를 통해 저장된 xml정보를 변수에 저장 했다. 여기서 jstl의 xml은 select를 통해 변수를 선택 하는데 count()는 xml부분에서 사용하는 '함수'로 선택된 노드의 갯수를 가져온다.

따라서 위 코드의 name노드는 총 4개이므로 4라는 값이 변수에 저장된다. 노드번호 접근은 배열과 마찬가지로 []로 접근하는데 시작은 1부터 시작한다.(자세한건xml관련 자료 참조) count()와 같은 함수는 여럿 있는데 그중 last()는 마지막 노드를 지정함을 의미한다.

xml에 접근하는데 있어 파싱된 변수 xmldata에 $xmldata/로 접근하는데 /가 한개 더 온 것은 루트노드(xml에서 말하는 root node)를 의미하고, *은 모든 노드를 의미 한다.

일반적으로 노드접근은 상단의 예제처럼 하고, 속성에 대한접근은 @로 이용하는데 위 예제에서 name부분에 att라는 속성이 있다. 만약 att속성 내용을 모두 출력하고자 한다면 다음과 같은 방식을 이용하면 된다.
<x:forEach select="$xmldata//*[name()='name']" var="node">
 <x:out select="@att"/>
</x:forEach>
[name()='']부분은 엘리먼트 이름을 의미한다. 위에서 name엘리먼트 이므로 name를 적었다. 출력부분에 "@att"부분은 편리하게도 node값의 속성중(@가 붙었으므로) att인값을 가져온다는 의미이다. 모든 노드의 속성과 차일드 노드의 값도 저런식으로 접근하여 출력할 수 있다.

<x:forEach select="$xmldata//*[name='pupustory']" var="node">
 <x:out select="age"/>
 <x:out select="email"/>
</x:forEach>

이것은 루트노드에서 모든노드 중 가지고 있는 name노드가 'pupustory'인 값을 가져오는 것 이다. 노드 검색의 경우 [name()='nodename']로 사용하지만 노드가 갖고있는 값은 위와 같은 방식으로 접근 한다. 마찬가지로 속성값을 검색할 경우엔 [@att='']로 사용하면 된다.

name노드가 pupustory인 값은 단 하나이므로 forEach는 한번만 돌고, 노드 age와 email를 출력하는 부분이다.
<x:forEach select="" begin="" end="" step="" var="" varStatus=""></x:forEach>

<x:if select="" var="" scope=""></x:if>

<x:out select="" escapeXml="" /x:out>

<x:choose>


 <x:when select=""> body1</x:when>


 <x:when select="">body 2</x:when>


 <x:otherwise>other body </x:otherwise>


</x:choose>


모두 core부분에서 다룬 내용이므로 별도의 설명은 않하고 스펙만 나열 하였다. 역시 xml에서 가장 큰 문제는 어떻게 노드값을 가져오냐 가 아닐까 싶다. 무엇보다 xml에서 사용한 부분은 출력시 core부분이 아닌 xml부분으로 사용해야 한다는 점이다. 필자는 멍청하게도(..)<c:out/>로 구성했다 계속 null값이 나와 애먹었는데 .. <x:out/>를 이용하라고 해서 해보니 .. 문제 없다 --b


'Dev > EL & JSTL' 카테고리의 다른 글

JSTL <fmt>  (1) 2009.02.13
JSTL <xml>  (0) 2009.02.12
JSTL <functions>  (0) 2009.02.11
JSTL <sql>  (0) 2009.02.11
JSTL <core>  (0) 2009.02.06
JSTL 처음 시작하기  (0) 2009.02.06
댓글
댓글쓰기 폼
Total
524,813
Today
4
Yesterday
2
«   2020/01   »
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31  
글 보관함