JSTL <xml>
2009/02/12 15:43
xml을 이용하기 위한 JSTL tlb 사용법을 알아보자. 지금까진 별도의 .jar없이(JSTL관련 제외)사용했지만 xml 이용을 위해선 xalan.jar를 추가해야 한다. 만약 추가 하지 않으면 다음과 같은 문제를 발견할 것이다.
따라서 먼저 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속성 내용을 모두 출력하고자 한다면 다음과 같은 방식을 이용하면 된다.
[name()='']부분은 엘리먼트 이름을 의미한다. 위에서 name엘리먼트 이므로 name를 적었다. 출력부분에 "@att"부분은 편리하게도 node값의 속성중(@가 붙었으므로) att인값을 가져온다는 의미이다. 모든 노드의 속성과 차일드 노드의 값도 저런식으로 접근하여 출력할 수 있다.
이것은 루트노드에서 모든노드 중 가지고 있는 name노드가 'pupustory'인 값을 가져오는 것 이다. 노드 검색의 경우 [name()='nodename']로 사용하지만 노드가 갖고있는 값은 위와 같은 방식으로 접근 한다. 마찬가지로 속성값을 검색할 경우엔 [@att='']로 사용하면 된다.
name노드가 pupustory인 값은 단 하나이므로 forEach는 한번만 돌고, 노드 age와 email를 출력하는 부분이다.
모두 core부분에서 다룬 내용이므로 별도의 설명은 않하고 스펙만 나열 하였다. 역시 xml에서 가장 큰 문제는 어떻게 노드값을 가져오냐 가 아닐까 싶다. 무엇보다 xml에서 사용한 부분은 출력시 core부분이 아닌 xml부분으로 사용해야 한다는 점이다. 필자는 멍청하게도(..)<c:out/>로 구성했다 계속 null값이 나와 애먹었는데 .. <x:out/>를 이용하라고 해서 해보니 .. 문제 없다 --b
root cause
java.lang.NoClassDefFoundError: org/apache/xpath/XPathException
따라서 먼저 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>
<x:out select="@att"/>
</x:forEach>
<x:forEach select="$xmldata//*[name='pupustory']" var="node">
<x:out select="age"/>
<x:out select="email"/>
</x:forEach>
<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>
<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 |