帶附件的soap消息api,其內容很豐富,它是一個允許用soap消息而不是用jax-rpc來調用web service的API .它通過直接創建XML消息來完成web serivce的調用.SOAP API 簡化了創建XML的工作.?取自j2ee文檔的soap消息的結構圖.

?
完整的SAAJ客戶端程序. 服務器端的程序在j2ee web service開發(一) 里可以找到.沒有詳細介紹saaj的一些類
的使用.好在它們都有很好的自解釋性.
package array;
import javax.xml.soap.*;
import java.net.*;
import java.io.*;
import java.util.*;
import java.text.SimpleDateFormat;
public class SaajClient {
??? public SaajClient() {
??? }
??? public static void main(String[] args) throws Exception {
??????? SaajClient client = new SaajClient();
??????? User[] user = new User[2];
??????? user[0] = new User("張三", "027-88888888", new Date());
??????? user[1] = new User("lisi", null, new Date());
??????? saajTest(user);
??? }
??? private static void saajTest(User[] user) throws MalformedURLException,
??????????? IOException,
??????????? UnsupportedOperationException, SOAPException {
??????? MessageFactory factory = MessageFactory.newInstance();//SAAJ的根工廠類
??????? SOAPMessage message = factory.createMessage();
??????? //SOAPMessage 對象需要一些元素,包括SOAPPart,SOAPEnvelope,SOAPHeader,SOAPBody對象
??????? //SAAJ通過返回一個新的已經包括這些元素的SOAPMessage對象來簡化操作
??????? SOAPFactory s = SOAPFactory.newInstance();//通用工廠類,創建Name,SOAPElement對象
??????? Name countUser = s.createName("countUser", "mh", "http://array");
??????? //Name對象表示一個XML限定名稱
??????? Name arrayOfUser_1 = s.createName("arrayOfUser_1");
??????? Name xsi = s.createName("xmlns:xsi");
??????? Name nullAttribute = s.createName("xsi:nil");
??????? //下面的代碼創建soap對象
??????? SOAPBody body = message.getSOAPBody();
??????? SOAPBodyElement bodyChildElement = body.addBodyElement(countUser);
??????? SOAPElement arrayOfUser = bodyChildElement.addChildElement(
??????????????? arrayOfUser_1);
????? //? arrayOfUser.addAttribute(xsi, "http://www.w3.org/2001/XMLSchema-instance");
??????? arrayOfUser.addNamespaceDeclaration("xsi","http://www.w3.org/2001/XMLSchema-instance");
??????? //定義arrayOfUser的 xmlns:xsi屬性? 該名稱空間是XML模式實例命名空間,由XML模式規范定義,它定義了
??????? //可以在XML文檔中使用的屬于該命名空間的一些特性.
??????? for (int i = 0; i < user.length; i++) {
??????????? //需要注意順序,也就是和復雜類型的sequence元素的順序對應
??????????? Name valueName = s.createName("value");
??????????? SOAPElement value = arrayOfUser.addChildElement(valueName);
??????????? Name birthday = s.createName("birthDay");
??????????? SOAPElement birthdayElement = value.addChildElement(birthday);
??????????? if (user[i].getBirthDay() == null) {
??????????????? birthdayElement.addAttribute(nullAttribute, "1");
??????????? } else {
??????????????? //日期類型必須進行格式化
??????????????? SimpleDateFormat format= new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
??????????????? birthdayElement.addTextNode(format.format(user[i].getBirthDay()));
??????????? }
??????????? Name name = s.createName("name");
??????????? SOAPElement nameElement = value.addChildElement(name);
??????????? if (user[i].getName() == null) {
??????????????? //傳送空值
??????????????? nameElement.addAttribute(nullAttribute, "1");
??????????? } else {
??????????????? nameElement.addTextNode(user[i].getName());
??????????? }
??????????? Name phone = s.createName("phone");
??????????? SOAPElement phoneElement = value.addChildElement(phone);
??????????? if (user[i].getPhone() == null) {
??????????????? phoneElement.addAttribute(nullAttribute, "1");
??????????? } else {
??????????????? phoneElement.addTextNode(user[i].getPhone());
??????????? }
??????? }
??????? //發送soap消息
??????? SOAPConnectionFactory f = SOAPConnectionFactory.newInstance();
??????? SOAPConnection conn = f.createConnection();
??????? URL url = new URL("http://localhost:8082/complexType-array/services/CountUser");
??????? SOAPMessage response = conn.call(message, url);
??????? SOAPBody soapBody = response.getSOAPBody();
??????? Iterator it = soapBody.getChildElements();
??????? while (it.hasNext()) {
??????????? SOAPBodyElement bodyElement = (SOAPBodyElement) it.next();
??????????? String returnValue = bodyElement.getValue();
??????????? System.out.println(bodyElement.getElementName().getLocalName() +
?????????????????????????????? "????? " + returnValue);
??????? }
??????? response.writeTo(System.out);
??? }
}
程序向服務器端傳送的數據:
POST /complexType-array/services/CountUser HTTP/1.1
SOAPAction: ""
Content-Type: text/xml; charset=UTF-8
User-Agent: Java/1.5.0_03
Host: localhost:8082
Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2
Connection: keep-alive
Content-Length: 448
<env:Envelope xmlns:env='http://schemas.xmlsoap.org/soap/envelope/'>
?? <env:Header/>
?? <env:Body>
????? <mh:countUser xmlns:mh='http://array'>
???????? <arrayOfUser_1 xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'>
??????????? <value>
?????????????? <birthDay>2006-11-08T22:36:13</birthDay>
?????????????? <name>張三</name>
?????????????? <phone>027-88888888</phone>
??????????? </value>
??????????? <value>
?????????????? <birthDay>2006-11-08T22:36:13</birthDay>
?????????????? <name>lisi</name>
?????????????? <phone xsi:nil='1'/>
??????????? </value>
???????? </arrayOfUser_1>
????? </mh:countUser>
?? </env:Body></env:Envelope>
從傳送的數據來看,就是一個符合soap規范的xml文檔.既然是xml文檔,也就是說可以用jdom api 來操作它
事實上就是這樣,soap api 可以跟 jdom api混合使用.
如果你想賜教或者討論,歡迎加入QQ群:30406099
凡是有該標志的文章,都是該blog博主Caoer(草兒)原創,凡是索引、收藏
、轉載請注明來處和原文作者。非常感謝。