[Caster] XML만을 사용시 서버측 XML 객체 상호변환
출처 : http://cafe.naver.com/flexcomponent/12264
아시는 분들도 계시겠으나...
DataService 를 사용하지 않고 XML 응답만으로 Flex 를 개발할때
java 서버측 구현에 쉽게 적용 가능한 Caster 라는 XML 변환 프레임웍을 소개해 드립니다.
아래의 링크에서 Caster 를 다운로드 받습니다. 샘플도 많습니다. 다운받으세요~
http://www.castor.org/download.html
아래의 링크는 맵핑에 관련된 설명입니다.
http://www.castor.org/xml-mapping.html
간단히 소개해 드리자면
------------------------------------------------
Java결과객체 → Caster프레임웍 → 변환된 XML
↑
XML맵핑룰.xml
------------------------------------------------
와 같이 동작하는 매우 일반적 형태의 프레임웍입니다.
바로 사용할 수도 있으나 사용의 편이성을 위해 아래와 같은 클래스를 맹길었습니다.
public class CasterMapper {
/** XML 맵핑 객체 */
Mapping mapping;
// .. 스트림이나 파일을 받는 생성자 등등등...
/**
* XML 파일을 객체로 변환한다
* @param xmlIn
* @return
* @throws MappingException
* @throws ValidationException
* @throws MarshalException
*/
public Object xmlToObject(Reader xmlReader)
throws MappingException, MarshalException, ValidationException {
Unmarshaller unmarshaller = new Unmarshaller(this.mapping);
return unmarshaller.unmarshal(new InputSource(xmlReader));
}
/**
* 객체를 XML 로 변환한다.
* @param obj
* @param xmlOut
* @throws IOException
* @throws MappingException
* @throws ValidationException
* @throws MarshalException
*/
public void objectToXml(Object obj, Writer xmlWriter)
throws IOException, MappingException, MarshalException, ValidationException {
Marshaller marshaller = new Marshaller(xmlWriter);
marshaller.setMapping(this.mapping);
marshaller.marshal(obj);
}
}
그리고 Flex의 요청에 대한 응답을 처리하는 Servlet 내에서 아래처럼 결과객체를 변환하여
응답을 보냅니다.
// #. 결과객체 (변환하고자 하는 객체)
Object resultObject = new Object(); // 개인마다 DB의 결과를 담은 다른 클래스형의 객체가 들어갈겁니다...
// #. 맵핑룰 XML 얻기
InputStream xmlInputStream = getClass().getResourceAsStream("test_ed_mapping.xml");
CasterMapper mapper = new CasterMapper(xmlInputStream);
// #. print response
mapper.objectToXml(resultObject, response.getWriter());
아래는 test_ed_mapping.xml 의 예로서 전체 XML응답전문을 Header 와 Body 로 구분하고
사용자 목록을 출력하도록 지정했습니다.
맵핑전문은 아래와 같은 특징이 있으니 잘 살펴보시기 바랍니다.
- Element(태그)는 클래스와 맵핑된다.
- 값은 Attribute 나 Element 로 표현될 수 있다.
- 위쪽에서 사용된 클래스에 대한 정의로 바로 아래에서 표현한다.
test 로 시작되는 패키지 내의 Class 는 개인적으로 만드셔야 합니다.
전문을 눈여겨 보면 어렵지 않게 클래스를 만들수 있으시라라 생각됩니다.
참고로 PagingList 란 넘은 java.util.ArrayList 형의 list 어트리뷰트를 가지고 있습니다.
<?xml version="1.0"?>
<!DOCTYPE mapping PUBLIC "-//EXOLAB/Castor Mapping DTD Version 1.0//EN" "http://castor.org/mapping.dtd">
<mapping>
<class name="test.common.xml.ed.XmlResponse">
<map-to xml="response"/>
<field name="header" type="test.common.xml.ed.XmlHeader">
<bind-xml name="header" node="element"/>
</field>
<field name="body" type="test.common.xml.ed.XmlBody">
<bind-xml name="body" node="element"/>
</field>
</class>
<!-- HEADER -->
<class name="test.common.xml.ed.XmlHeader">
<map-to xml="header"/>
<field name="id" type="java.lang.String">
<bind-xml name="id" node="attribute"/>
</field>
<field name="group" type="java.lang.String">
<bind-xml name="group" node="attribute"/>
</field>
<field name="code" type="java.lang.String">
<bind-xml name="code" node="attribute"/>
</field>
<field name="message" type="java.lang.String">
<bind-xml name="message" node="attribute"/>
</field>
</class>
<!-- BODY -->
<class name="test.common.xml.ed.XmlBody">
<map-to xml="body"/>
<field name="obj" type="test.common.xml.ed.PagingList">
<bind-xml name="users" node="element"/>
</field>
</class>
<!-- Users -->
<class name="test.common.xml.ed.PagingList">
<map-to xml="users"/>
<field name="list" type="test.beans.User" collection="arraylist">
<bind-xml name="user" node="element"/>
</field>
</class>
<!-- USER -->
<class name="test.beans.User">
<map-to xml="user"/>
<field name="id" type="java.lang.String">
<bind-xml name="id" node="attribute"/>
</field>
<field name="name" type="java.lang.String">
<bind-xml name="name" node="attribute"/>
</field>
<field name="email" type="java.lang.String">
<bind-xml name="email" node="attribute"/>
</field>
</class>
</mapping>
이리하여 결과는 아래와 같습니다.
DB의 사용자 테이블에 질의한 쿼리의 결과가 User 객체의 List 로 반환이 되었다고 가정하고
이것에 대한 서블릿의 결과는 다음과 같습니다.
<?xml version="1.0" encoding="UTF-8"?>
<response>
<header>
<id>test.ViewMembers</id>
<group>admin</group>
<code>0000</code>
<message>SUCCESS</message>
</header>
<body>
<users>
<user id="honggildong1" name="길동이" email="honggildongika@gildong.com"/>
<user id="honggildong2" name="길동이" email="honggildongika@gildong.com"/>
<user id="honggildong3" name="길동이" email="honggildongika@gildong.com"/>
<user id="honggildong4" name="길동이" email="honggildongika@gildong.com"/>
<user id="honggildong5" name="길동이" email="honggildongika@gildong.com"/>
<user id="honggildong6" name="길동이" email="honggildongika@gildong.com"/>
<user id="honggildong7" name="길동이" email="honggildongika@gildong.com"/>
<user id="honggildong8" name="길동이" email="honggildongika@gildong.com"/>
<user id="honggildong9" name="길동이" email="honggildongika@gildong.com"/>
<user id="honggildong10" name="길동이" email="honggildongika@gildong.com"/>
</users>
</body>
</response>
편리하겠죠?
기존 JSP 로 작성된 시스템에서 Flex Client로 전환시 Layer 가 잘 나눠져 있다면
아주 쉽게 커스터마이징 가능하리라 생각됩니다.
간단한 내용이나 걍 참고하시라고 적어봤습니다.
[참고링크]
이곳에 뉴스그룹이 있으니 기타 트러블슈트 참고하시고요~
http://www.mail-archive.com/castor-dev@exolab.org/
'개발 > FLEX & AIR' 카테고리의 다른 글
FLEX - Style Exploer (0) | 2010.01.19 |
---|---|
Flex 흐르는 텍스트 효과 (0) | 2010.01.12 |
Flex 컴포넌트의 비율 유지 (0) | 2009.12.21 |
Flex와 Java간 소켓 통신 (1) | 2009.12.21 |
XML과 E4X 다루기 (0) | 2009.12.20 |