1. JWSDP
1.1 JWSDP란?
“Java Web Services Developer Pack”으로서 자바 개발자들이 XML 응용 프로그램과 웹 서비스 시스템 및 클라이언트를 쉽게 개발할 수 있도록 여러 가지 도구와 API를 제공하는 무료 통합 개발 툴킷이다. (http://java.sun.com)
JWSDP는 ① XML 웹 서비스 개발 및 테스트, ② 웹 응용 프로그램 (서블릿, JSP 개발 및 테스트), 그리고 ③ XML 클라이언트 응용 프로그램 개발 및 테스트에 활용되는 것으로, 다음과 같은 API와 도구를 포함하고 있다.
* Java API for XML Binding (JAXB)
* Java API for XML Messaging (JAXM)
* Soap with Attachments API for Java (SAAJ)
* Java API for XML Processing (JAXP)
* Java API for XML Registries (JAXR)
* Java API for XML-based RPC (JAX-RPC)
* JavaServer Page Standard Tag Library (JSTL)
* Tomcat (Java servelet and JavaServer Pages container)
- Administration Tool
- Web Application Manager
* Ant build tool
* Registry Server
1.2 웹 서비스 개발 구조
JWSDP를 이용한 웹 서비스 개발 구조는 다음과 같다.
1.3 SAAJ
JAXM Reference Implementation은 XML 기반의 메시징 시스템의 구현으로서, 다음과 같은 두 가지 스펙에 기초한다.
① SAAJ
SOAP 메시지를 생성하고 전송하는 API를 제공하는 javax.xml.soap 패키지를 가지고 있다. 이것은 JAX-RPC와 JAXR API가 실행되기 위해 반드시 필요한 API로서, 개발자는 웹 서비스 클라이언트와 같은 SOAP 메시지 응용 프로그램을 작성할 때 JAX-RPC를 사용하는 대신에 직접적으로 SAAJ를 이용해서 프로그래밍 할 수 있다.
SAAJ는 웹 서비스 시스템과 웹 서비스 클라이언트 간의 점대점(point-to-point) 연결을 이용해서 SOAP 메시지를 전송하는 것으로, 클라이언트의 요청을 처리한 후 응답을 다시 클라이언트로 전송하는 요청/응답형의 동기적 통신 방법이다.
② JAXM
메시지 전송을 위해 메시징 제공자가 사용하기 위한 API를 제공하는 javax.xml.messaging 패키지를 가지며, 비동기적 웹 서비스 형태를 구현하기 위한 API를 제공한다.
“JAXM”이라고 하면 SAAJ와 JAXM API 모두를 포괄적으로 언급하는데 사용된다.
참고: SOAP 패키지
javax.xml.soap 패키지에서 찾을 수 있는 클래스와 인터페이스를 보여주는 것으로, 이 항목들은 JAXM과 JAX-RPC 양쪽에서 공유하는 API를 나타낸다. 또한 SOAP 혹은 엔벨로프가 첨부된 SOAP의 구성과 해체에 필요한 모든 기능을 총괄적으로 제공한다.
인터페이스/클래스 | 설명 |
AttachmentPart Detail DetailEntry MessageFactory MimeHeader MimeHeaders Name Node SOAPBody SOAPBodyElement SOAPConnection SOAPConnectionFactory SOAPConstants SOAPElement SOAPElementFactory SOAPEnvelope SOAPFault SOAPFaultElement SOAPHeader SOAPHeaderElement SOAPMessage SOAPPart Text
|
SOAPMessage 객체에 대한 단일 첨부 DetailEntry 객체에 대한 컨테이너 SOAPFault 객체에 제공하는 Detail 객체에 대한 내용 SOAPMessage 객체를 생성하는 데 쓰이는 팩토리 MIME 헤더 이름과 그 값을 저장하는 객체 MimeHeader 객체에 대한 컨테이너로, 메시지의 MIME 부분에 MIME헤더가 있음을 나타낸다. XML 이름을 표시 트리 처리 메소드를 제공하는 XML 문서의 DOM 표현 안의 노드 표시 SOAP 메시지 내의 SOAP 바디 내용을 나타내는 객체 SOAPBody 객체 안의 내용을 나타내는 객체 클라이언트가 메시징 제공자를 사용하지 않고, 원격부분(이를테면, URL로 표현되는)에 직접 메시지를 전송하는 데 사용할 수 있는 점대점 접속 SOAPConnection 객체를 생성할 때 사용하는 팩토리 SOAP 1.1 프로토콜(예를 들면, URI_SOAP_ACTOR_NEXT와 URI_NS_SOAP_ENCODING)과 관련된 상수 정의 SOAPBody 객체의 내용, SOAPHeader 객체의 내용, SOAPEnvelope 객체 내의 SOAPBody 객체를 따를 수 있는 내용 또는 SOAPFault 객체내에서 상세 요소를 따르는 것을 나타내는 객체 결국 마지막에는 SOAP 부분이 되는 XML 단편화를 만드는 곳
SOAPPart 객체의 SOAPHeader와 SOAPBody 부분에 대한 컨테이너 오류 and/or 상황 정보를 포함한 SOAPBody 객체 요소 SOAPFault 객체 안에서 내용의 표현
SOAP 헤더 요소 표현 SOAP 엔벨로프의 SOAP 헤더 안 내용을 표현하는 객체
SOAP 메시지의 기본 클래스 SOAPMessage 객체의 SOAP-specific 부분에 대한 컨테이너
그 값이 텍스트인 노드의 표현 |
2. SOAP 메시지 송수신
2.1 SOAP 메시지 관련 객체SOAP 메시지를 생성할 때 사용할 객체들의 포함관계를 나타내면 다음과 같다. SOAPMessage 객체를 통해서 SOAPPart와 AttachmentPart 객체를 얻을 수 있다. 또한 SOAPPart 객체를 통해서 SOAPEnvelope 객체를 얻을 수 있고, SOAPEnvelope 객체를 통해서는 SOAPHeader 객체와 SOAPBody 객체를 얻을 수 있다.
SOAPMessage 객체 생성 MessageFactory factory = MessageFactory.newInstance();
SOAPMessage message = factory.createMessage(); |
SOAPPart 객체 얻기 SOAPPart soapPart = message.getSOAPPart();
|
AttachmentPart 객체 얻기 AttachmentPart attachment = message.createAttachmentPart();
|
SOAPEnvelope 객체 얻기 SOAPEnvelope envelope = soapPart.getEnvelope();
|
SOAPHeader 객체 얻기 SOAPHeader header = envelope.getHeader();
|
SOAPBody 객체 얻기 SOAPBody body = envelope.getBody();
|
2.2 SOAP 메시지 송수신
SOAP 메시지를 생성하고, 전송하기 위한 SOAP 응용 프로그램의 기본적인 골격은 다음과 같다.
import javax.xml.soap.*; public class Example1 { /// Field /// Constructor /// Method public static void main(String args[]) throws Exception { ① SOAPMessage 객체 생성
② 요청 SOAP 메시지 생성우선 요청 SOAP 메시지의 틀을 생성해 내는 객체를 생성해야 한다. 빈 SOAP 메시지를 생성한다. ③ 요청 SOAP 메시지 내용 구성
④ SOAPConnection 객체 생성요청 SOAP 메시지에 포함될 내용을 구성한다. 요청 SOAP 메시지를 송신하기 위해 필요한 객체를 생성한다. ⑤ 요청 SOAP 메시지 보내고, 응답 SOAP 메시지 받기 요청 SOAP 메시지를 보내고 응답 SOAP 메시지를 받는다. ⑥ 응답 SOAP 메시지 해석 응답 메시지를 해석해서 필요한 동작을 수행한다. } } |
import javax.xml.soap.*; public class Example1 { /// Field /// Constructor /// Method public static void main(String args[]) throws Exception { //SOAPMessage 객체 생성 MessageFactory messsageFactory = MessageFactory.newInstance(); //요청 SOAP 메시지 생성 SOAPMessage requestMessage = messageFactory.createMessage();
//요청 SOAP 메시지 구성 //~ //SOAPConnection 객체 생성 SOAPConnectionFactory soapConnectionFactory = SOAPConnectionFactory.newInstance(); SOAPConnection connection = soapConnectionFactory.createConnection(); //요청 SOAP 메시지 보내고, 응답 SOAP 메시지 받기 SOAPMessage responseMessage = connection.call ( requestMessage, "웹 서비스 종점 URL(수신자)"); //응답 SOAP 메시지 해석 //~ } } |
3.1 네임스페이스와 인코딩 표기법
SOAP 메시지에서 사용될 대부분의 네임스페이스 선언은 메시지의 루트 엘리먼트인 <Envelope>에 포함된다. 따라서 네임스페이스 선언을 포함하기 위해서는 SOAPEnvelope 객체와 addNamespaceDeclaration() 메소드를 이용한다.
한편 SOAP 메시지에서 사용될 데이터의 인코딩 표기법을 기술하기 위해서는 <Envelope> 엘리먼트 내에서 setEncodingStyle() 메소드를 사용한다.
응용 프로그램에서 네임스페이스 선언과 인코딩 방식을 지정하는 일련의 과정은 다음과 같다.
import javax.xml.soap.*; public class Example2 { /// Field /// Constructor /// Method public static void main(String args[]) throws Exception { //SOAPMessage 객체 생성 MessageFactory messsageFactory = MessageFactory.newInstance(); //요청 SOAP 메시지 생성 SOAPMessage requestMessage = messageFactory.createMessage(); ① SOAPPart 객체 생성 ② SOAPEnvelope 객체 생성
③ 네임스페이스 선언 ④ 인코딩 방식 지정 //요청 SOAP 메시지 구성 // SOAPConnection 객체 생성 //요청 SOAP 메시지 보내고 응답받기 //응답 SOAP 메시지의 해석 } } |
SOAPPart 객체 생성 SOAPPart soapPart = requestMessage.getSOAPPart ();
|
SOAPEnvelope 객체 생성 SOAPEnvelope envelopet = soapPart.getEnvelope (); |
네임스페이스 선언 envelope.addNamespaceDeclaration( "xsd", "http://www.w3.org/2001/XMLSchema"); envelope.addNamespaceDeclaration( "xsi", "http://www.w3.org/2001/XMLSchema-instance"); envelope.addNamespaceDeclaration( "enc", "http://schemas.xmlsoap.org/soap/encoding/"); envelope.addNamespaceDeclaration( "ns0", "http://localhost:8080/webservice"); envelope.addNamespaceDeclaration( "xsd", "http://www.w3.org/2001/XMLSchema"); |
인코딩 지정 방식 envelope.setEncodingStyle("http://schemas.xmlsoap.org/soap/encoding/"); |
import javax.xml.soap.*; public class Example3 { /// Field /// Constructor /// Method public static void main(String args[]) throws Exception { //SOAPMessage 객체 생성 MessageFactory messsageFactory = MessageFactory.newInstance(); //요청 SOAP 메시지 생성 SOAPMessage requestMessage = messageFactory.createMessage(); //SOAPPart 객체 생성 SOAPPart soapPart = requestMessage.getSOAPPart (); //SOAPEnvelope 객체 생성 SOAPEnvelope envelope = soapPart.getEnvelope ();
① SOAPFactory 객체 생성② SOAPHeader 객체 생성 ③ 헤더 엔트리 생성 ④ 헤더 엔트리의 자식 엘리먼트 생성 // SOAPConnection 객체 생성 //요청 SOAP 메시지 보내고 응답받기 //응답 SOAP 메시지의 해석 } } |
SOAPFactory 객체 생성 : Name 객체를 생성하기 위해 SOAPFactory 객체를 우선 생성한다. SOAPFactory soapFactory = SOAPFactory.newInstance(); |
SOAPHeader 객체 생성 : 헤더 엔트리는 SOAP <Header> 엘리먼트의 자식 엘리먼트이므로 SOAPEnvelope 객체를 통해서 SOAPHeader 객체를 생성한다. SOAPHeader header = envelope.getHeader(); |
헤더 엔트리 생성 :
1. 헤더 엔트리를 생성하기 위해 createName() 메소드를 이용해서 우선 Name 객체를 생성한다. Name name = soapFactory.createName("엘리먼트명", "접두사", "네임스페이스이름"); Name name = soapFactory.createName("authentication", "m", "http://cs.knou.ac.kr/soap/authentication"); 2. 헤더 엔트리의 루트 엘리먼트를 생성한다. 루트 엘리먼트는 반드시 QName 형태로 작성되어야 한다. SOAPHeaderElement headerElement = header.addHeaderElement(name); 3. 필요한 경우 헤더 엔트리의 actor 속성을 지정한다. headerElement.setActor("액터 URL"); headerElement.setActor("http://www.knou.ac.kr/authentication"); 4. 필요한 경우 헤더 엔트리의 mustUnderstand 속성을 지정한다. true는 1, false는 0을 의미한다. headerElement.setMustUnderstand( true | false ); headerElement.setMustUnderstand(true); |
헤더 엔트리의 자식 엘리먼트 생성 :
1. 헤더 엔트리의 루트 엘리먼트의 자식 엘리먼트를 생성하기 위해 createName() 메소드를 이용해서 Name 객체를 만든다. 자식 엘리먼트는 QName 형태가 아니어도 무방하다. Name name = soapFactory.createName("엘리먼트명"); Name name = soapFactory.createName("userID"); 2. 헤더 엔트리의 루트 엘리먼트의 자식 엘리먼트에 해당하는 SOAPElement를 작성한다. SOAPElemet useridElement = headerElement.addChildElement (name); 3 자식 엘리먼트의 문자 내용을 준다. useridElement.addTextNode ("gomdoli"); |
지금까지 살펴본 헤더 엔트리의 생성 과정은 결국 다음과 같은 SOAP 메시지를 표현한 것이다. 여기서 <password> 엘리먼트에 대해서는 헤더 엔트리의 자식 엘리먼트를 생성하는 코드를 추가하면 된다.
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> <soap:Header> <m:authentication xmlns:m="http://cs.knou.ac.kr/soap/authentication" soap:actor="http://www.knou.ac.kr/authentication" soap:mustUnderstand="1"> <userID>gomdoli</userID> <password>gmd123</password> </m:authentication> </soap:Header> <soap:Body> </soap:Body> </soap:Envelope> |
3.3 바디 엔트리
SOAP 메시지의 바디 엔트리를 생성은 다음과 같은 일련의 과정을 수행하면 된다.
import javax.xml.soap.*; public class Example4 { /// Field /// Constructor /// Method public static void main(String args[]) throws Exception { //SOAPMessage 객체 생성 //요청 SOAP 메시지 생성 //SOAPEnvelope 객체 생성 //SOAPFactory 객체 생성 //헤더 엔트리 생성 ① SOAPBody 객체 생성 ② 바디 엔트리 생성 ③ 바디 엔트리의 자식 엘리먼트 생성 // SOAPConnection 객체 생성 //요청 SOAP 메시지 보내고 응답받기 } } |
SOAPBody 객체 생성 : 바디 엔트리는 SOAP <Body> 엘리먼트의 자식 엘리먼트이므로 우선 SOAPBody 객체를 생성해야 한다. SOAPBody body = envelope.getBody(); |
바디 엔트리 생성 :
1. 바디 엔트리의 루트 엘리먼트를 생성하기 위해 Name 객체를 생성한다. 바디 엘리먼트는 반드시 QName 형태로 작성되어야 한다. 세 번째 인자의 위치에는 네임스페이스명이 오는데, 이미 SOAPEnvelope 객체에 네임스페이스를 선언하였을 경우에는 null로 표시한다. Name bodyname = soapFactory.createName ("원격프로시저명", "접두사", null); Name bodyname = soapFactory.createName("enrollment", "ns0", null); 2. 바디 엔트리의 루트 엘리먼트인 SOAPBodyElement 객체를 생성한다. SOAPBodyElement bodyElement = body.addBodyElement(bodyname); |
바디 엔트리의 자식 엘리먼트 생성 :
1. 바디 엔트리의 루트 엘리먼트의 자식 엘리먼트를 생성하기 위해서 Name 객체를 생성한다. Name childName = soapFactory.createName("인자명"); Name childName = soapFactory.createName("String_0"); 2. 자식 엘리먼트인 SOAPElement 객체를 생성한다. SOAPElement childElement = bodyElement.addChildElement(childName); 3. 자식 엘리먼트의 속성, 특히 자식 엘리먼트의 컨텐츠에 대한 데이터 타입을 지정하기 위해 "xsi:type"이라는 속성명으로 Name 객체를 생성한다. Name typeName = soapFactory.createName("xsi:type"); 4. 자식 엘리먼트에 속성명과 속성값을 추가한다. childElement.addAttribute(typeName, "데이터타입"); childElement.addAttribute(typeName, "xsd:string"); 5. 자식 엘리먼트에 대한 컨텐츠를 작성한다. childElement.addTextNode ("웹서비스특론"); * 자식 엘리먼트가 여러 개 있는 경우에는 위의 과정을 반복 적용한다. Name childName = soapFactory.createName("Int_0"); SOAPElement childElement = bodyElement.addChildElement(childName); Name typeName = soapFactory.createName("xsi:type"); childElement.addAttribute(typeName, "xsd:int"); childElement.addTextNode("2005"); |
지금까지 살펴본 바디 엔트리의 생성 과정은 결국 다음과 같은 SOAP 메시지를 생성하기 위한 것이다.
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns0="http://cs.knou.ac.kr/grad/" > <soap:Header> <m:authentication xmlns:m="http://cs.knou.ac.kr/soap/authentication" soap:actor="http://www.knou.ac.kr/authentication" soap:mustUnderstand="1"> <userID>gomdoli</userID> <password>gmd123</password> </m:authentication> </soap:Header> <soap:Body> <ns0:enrollment> <String_0> </String_0> 웹서비스특론 <Int_0>2005</Int_0> </ns0:enrollment> </soap:Body> </soap:Envelope> |
참고: 첨부 파일을 포함한 SOAP 메시지 첨부 파일을 포함한 SOAP 메시지(SOAP Messages with Attachments) 스펙은 한 개의 SOAP 메시지 안에 하나 이상의 첨부 파일을 보내는 방법을 정의하고 있다. 첨부 파일은 그림 파일처럼 이진 데 이터도 가능하다. 첨부 파일의 종류를 구분하는 방법은 이메일을 첨부 파일을 보내는 것과 동일한 방식은 MIME 타입을 사용한다. 첨부 파일이 포함된 SOAP 메시지는 크게 두 부분으로 구성된다. ① SOAP Part SOAP <Envelope> 엘리먼트가 포함되어 있는 부분으로 반드시 하나는 있어야 한다. ② Attachment Part 첨부 파일이 포함되는 부분으로 0개 이상 존재하며, SOAP Part의 뒷부분에 첨부된다. 참고 사이트 : SOAP Message with Attachments http://www.w3.org/TR/SOAP-attachment |
import javax.xml.soap.*; import java.net.*; import javax.activation.DataHandler; public class Example5 { /// Field /// Constructor /// Method public static void main(String args[]) throws Exception { //SOAPMessage 객체 생성, 요청 SOAP 메시지 생성 //SOAPPart 객체 생성 //SOAPEnvelope 객체 생성 //SOAPFactory 객체 생성 //헤더 엔트리 및 헤더 엔트리의 자식 엘리먼트 생성 //바디 엔트리 및 바디 엔트리의 자식 엘리먼트 생성 ① 첨부물의 위치 지정 ② AttachmentPart 객체 생성 ③ 요청 SOAP 메시지에 추가 //SOAPConnection 객체 생성 //요청 SOAP 메시지를 보내고, 응답 SOAP 메시지 받기 } } |
첨부물의 위치 지정 : 첨부물의 위치를 알려주는 URL 객체를 생성한다.
URL url = new URL("첨부물의 URL 경로");
URL url = new URL("file:///C:/webservices/image.gif");
AttachmentPart 객체 생성 :
1. 첨부물의 내용을 SOAP 메시지 내용으로 만들어 주는 javax.activation.DataHandler 객체를 생성 한다. DataHandler dataHandler = new DataHandler(url); 2. 첨부 파트를 생성하기 위해서 먼저 AttachmentPart 객체를 생성한다. AttachmentPart attachment = requestMessage.createAttachmentPart(dataHandler); 3. 첨부물들을 구분하기 위해서 Content ID를 부여한다. attachment.setContentID("ID명"); attachment.setContentID("attached_image"); |
요청 SOAP 메시지에 추가 : 첨부 파트를 메시지에 추가한다. requestMessage.addAttachmentPart (attachment); |
3.5 <Fault> 엘리먼트
<Fault> 엘리먼트는 <Body> 엘리먼트의 자식 엘리먼트로 작성되기 때문에 SOAPBody 객체에 SOAPFault 객체를 추가하기 위해서는 다음의 일련의 과정을 거쳐서 생성된다.
import javax.xml.soap.*; public class Example6 { /// Field /// Constructor /// Method public static void main(String args[]) throws Exception { //SOAPMessage 객체 생성, 요청 SOAP 메시지 생성 //SOAPPart 객체 생성 //SOAPEnvelope 객체 생성 //SOAPFactory 객체 생성 //헤더 엔트리 생성 및 헤더 엔트리의 자식 엘리먼트 생성 //SOAPBody 객체 생성 SOAPBody body = envelope.getBody(); //바디 엔트리 및 바디 엔트리의 자식 엘리먼트 생성 ① SOAPBody 객체에 SOAPFault 객체를 추가 ② <faultcode> 엘리먼트의 구성 ③ <faultactor> 엘리먼트, <faultstring> 엘리먼트의 구성 ④ <detail> 엘리먼트의 구성 //SOAPConnection 객체 생성 //요청 SOAP 메시지를 보내고, 응답 SOAP 메시지 받기 } } |
SOAPFault 객체의 추가 : SOAPFault 객체를 SOAPBody 객체에 추가한다. SOAPFault fault = body.addFault(); |
<faultcode> 엘리먼트의 구성 : 오류의 종류를 나타내는 코드를 이용해서 오류를 쉽게 판별할 수 있도록 한다. fault.setFaultCode("오류코드"); fault.setFaultCode("Client"); |
<faultactor> 엘리먼트의 구성 : 오류가 발생한 액터를 알려준다. fault.setFaultActor("액터 URL"); fault.setFaultActor("http://www.knou.ac.kr/authentication"); |
<faultstring> 엘리먼트의 구성 : 오류에 대한 간략한 설명을 기술한다. fault.setFaultString("오류에 대한 설명"); fault.setFaultString("The necessary information is missed"); |
<detail> 엘리먼트의 구성 : 오류에 대한 자세한 내용을 표현한다. 1. <detail> 엘리먼트를 추가한다. Detail detail = fault.addDetail(); 2. <detail> 엘리먼트의 자식 엘리먼트를 생성하기 위해 Name 객체를 생성한다. SOAPFactory 객체의 createName() 메소드를 이용한다. Name entryName = soapFactory.createName("자식 엘리먼트 이름"); Name entryName = soapFactory.createName("content"); 3. <detail> 엘리먼트의 자식 엘리먼트를 생성한다. DetailEntry entry = detail.addDetailEntry(entryName); 4. 자식 엘리먼트의 컨텐츠 내용을 기술한다. entry.addTextNode("오류에 대한 자세한 설명"): entry.addTextNode("There is no value in the userid element"); |
지금까지 살펴본 <Fault> 엘리먼트 생성 과정은 다음과 같은 SOAP 메시지로서 표현된다.
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> <soap:Header> ... </soap:Header> <soap:Body> <soap:Fault> <faultcode>Client</faultcode> http://www.knou.ac.kr/authentication <faultstring>The necessary information is missed</faultstring> <detail> <content>There is no value in the userid element</content> </detail> </soap:Fault> </soap:Body> </soap:Envelope> |
4. DOM 객체 이용
외부 XML 문서에 있는 SOAP 메시지를 DOM 객체로 만들고, 이것을 SOAPPart 객체의 내용으로 만드는 일련의 과정은 다음과 같다.
우선, 다음과 같은 SOAP 메시지를 포함하고 있는 XML 문서(“test.xml”)가 있다고 가정하자.
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:enc="http://schemas.xmlsoap.org/soap/encoding" xmlns:ns0="http://cs.knou.ac.kr/grad/" soap:encodingStyle="http://schemas.xmlsoap.org/soap/encoding"> <soap:Body> <ns0:enrollment> <String_0 xsi:type="xsd:string">웹서비스</String_0> <Int_0 xsi:type="xsd:int">2005</Int_0> </ns0:enrollment> </soap:Body> </soap:Envelope> |
이와 같은 외부 XML 문서를 DOM과 같다.
import java.util.*; import javax.xml.parsers.*; import org.w3c.dom.*; import org.xml.sax.*; import javax.xml.soap.*; import javax.xml.transform.dom.*; public class Example7 { /// Field /// Constructor /// Method public static void main(String args[]) { try { ① DocumentBuilderFactory 객체 생성 ② DOM 파서가 네임스페이스 인식하도록 설정 ③ DOM 파서 생성 ④ XML 문서 파싱후 DOM 객체 생성 ⑤ DOMSource 객체 생성 //SOAPMessage 객체 생성 //SOAPPart 객체 생성 ⑥ SOAPPart 객체 내용의 설정 //SOAPConnection 객체 생성 //요청 SOAP 메시지를 보내고, 응답 SOAP 메시지 받기 } catch(Exception e) { e.printStackTrace(); } } } |
DocumentBuilderFactory 객체 생성 : DOM 파서를 만들기 위해서 객체를 생성한다. DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); |
DOM 파서가 네임스페이스를 인식하도록 설정 : dbf.setNamespaceAware(true); |
DOM 파서 생성 : DOM 파서인 DocumentBuilder 객체를 생성한다. DocumentBuilder parser = dbf.newDocumentBuilder(); |
XML 문서 파싱 후 DOM 객체 생성 : XML 문서를 파싱해서 DOM 객체를 생성한다. Document dct = parser.parse("XML 문서 경로"); Document dct = parser.parse("test.xml"); |
DOMSource 객체 생성 : DOM 객체를 사용해서 DOMSource 객체를 생성한다. DOMSource requestSource = new DOMSource(dct); |
SOAPPart 객체 내용의 설정 : DOMSource 객체 내용을 SOAPPart 객체의 내용으로 설정한다. requestSoapPart.setContent(requestSource); |
정리하기
① JWSDP를 이용해서 XML 웹 서비스, 웹 응용 프로그램, 그리고 XML 클라이언트 응용 프로그램을 개발하고 테스트할 수 있다.
② SOAPMessage 객체를 통해서 SOAPPart와 AttachmentPart 객체를 얻을 수 있다. 또한 SOAPPart 객체를 통해서 SOAPEnvelope 객체를 얻을 수 있고, SOAPEnvelope 객체를 통해서는 SOAPHeader 객체와 SOAPBody 객체를 얻을 수 있다.
③ 네임스페이스 선언과 인코딩 표기법을 지정하기 위해서는 <Envelope> 엘리먼트 내에서 각각addNamespaceDeclaration() 메소드와 setEncodingStyle() 메소드를 사용한다.
④ 헤더 엔트리를 생성하기 위해서는 SOAPFactory 객체의 createName() 메소드, SOAPHeader 객체의addHeaderElement() 메소드, SOAPHeaderElement 객체의 setActor(), setMustUnderstand() 및 addChildElement() 메소드, 그리고 SOAPElement 객체의 addTextNode() 메소드를 이용한다.
⑤ 바디 엔트리를 생성하기 위해서는 SOAPFactory 객체의 createName() 메소드, SOAPBody 객체의 addBodyElement() 메소드, SOAPBodyElement 객체의 addChildElement() 메소드, SOAPElement 객체의 addAttribute()와 addTextNode() 메소드를 이용한다.
⑥ 데이터가 첨부된 SOAP 메시지를 생성하고 전송하기 위해서는 URL 객체와 AttachmentPart 객체를 이용한다.
⑦ <Fault> 엘리먼트를 SOAP 메시지 내에 포함시키기 위해서는 SOAPFault 객체, Detail 객체 그리고 DetailEntry 객체를 이용한다.
⑧ DOM 객체를 이용하면 외부 XML 문서에 있는 SOAP 메시지를 SOAPPart 객체의 내용으로 만들 수 있다.
'정보과학 > 웹서비스특론' 카테고리의 다른 글
웹 서비스 클라이언트 개발 (1) | 2023.09.11 |
---|---|
웹 서비스 시스템 개발 (1) | 2023.09.09 |
SOAP (0) | 2023.09.07 |
XML 스키마 (2) (0) | 2023.09.06 |
XML 스키마 (1) (0) | 2023.09.05 |