通常soap消息中,消息體是攜帶消息的核心內容;消息頭中的字段,多數用於校驗。定義消息頭,就至關於定義一個bean對象。本例中,在上一篇的繼承上,爲消息增長消息頭,其中消息頭核心內容包括三個字段:serviceId,servPassWord和timeStamp。源代碼以下:java
package com.yht.msg.header;
apache
/** ide
* 定義消息頭中包含哪些內容的bean。 * @author Administrator * */ public class AttachHeader { /** * 消息節點標籤。 */ public static final String NODEFLAG = "tns"; /** * 消息頭標籤。 */ public static final String HEADFLAG = "RequestHeader"; /** * 命名空間。 */ public static final String NAMESPACE = "http://com.yht.msg"; /** * 時間戳標籤。 */ public static final String TIMESTAMP = "timeStamp"; /** * 業務編號標籤。 */ public static final String SERVICEID = "serviceId"; /** * 業務對於的校驗密碼標籤。 */ public static final String SERVPASSWORD = "servPassWord"; /** * 時間戳。 */ private String timeStamp; /** * 業務編號。 */ private String serviceId; /** * 業務對於的校驗密碼。 */ private String servPassWord; /** * 獲取時間戳。 * @return 時間戳。 */ public String getTimeStamp() { return timeStamp; } /** * 設置時間戳。 * @param timeStamp 時間戳。 */ public void setTimeStamp(String timeStamp) { this.timeStamp = timeStamp; } /** * 獲取業務編號。 * @return 業務編號。 */ public String getServiceId() { return serviceId; } /** * 設置業務編號。 * @param serviceId 業務編號。 */ public void setServiceId(String serviceId) { this.serviceId = serviceId; } /** * 獲取校驗密碼。 * @return 校驗密碼。 */ public String getServPassWord() { return servPassWord; } /** * 設置校驗密碼。 * @param servPassWord 校驗密碼。 */ public void setServPassWord(String servPassWord) { this.servPassWord = servPassWord; } }消息頭中字段定義好了,那麼對於demo做爲:客戶端,發送出去的消息攜帶消息頭,須要一個大包消息頭的方法;服務端,接受別處來的消息,須要一個解析消息頭的方法。這從新定義一個類:DealHeader繼承消息頭定義的類AttachHeader。該類中,有兩個方法:packSoapHeader和parseSoapHeader。源代碼以下:測試
package com.yht.msg.header; this
import java.util.Iterator; spa
import org.apache.axiom.om.OMAbstractFactory; orm
import org.apache.axiom.om.OMElement; 對象
import org.apache.axiom.om.OMFactory; 繼承
import org.apache.axiom.om.OMNamespace; element
import org.apache.axiom.soap.SOAPFactory;
import org.apache.axiom.soap.SOAPHeader;
import org.apache.axiom.soap.SOAPHeaderBlock;
import org.apache.axis2.client.ServiceClient;
/**
* 提供上下行消息中,處理消息頭的方法。
* 做爲服務端,須要解析消息中的消息頭;做爲客戶端,須要在消息頭中加入消息頭。
* @author Administrator
*
*/
public class DealHeader extends AttachHeader
{
/**
* 打包消息頭。將設置到AttachHeader中的各字段的內容,打包到消息中發送出去。
* @param serviceClient
*/
public void packSoapHeader(ServiceClient serviceClient)
{
//獲取建立工廠。
OMFactory oMFactory = OMAbstractFactory.getOMFactory();
SOAPFactory sOAPFactory = OMAbstractFactory.getSOAP11Factory();
//利用工廠,建立命名空間和消息頭。
OMNamespace oMNamespace = oMFactory.createOMNamespace(NAMESPACE, NODEFLAG);
SOAPHeaderBlock soapHeader =
sOAPFactory.createSOAPHeaderBlock(HEADFLAG, oMNamespace);
//消息頭中的時間錯節點。
String timeStamp = (getTimeStamp() == null) ? "" : getTimeStamp();
SOAPHeaderBlock timeBlock =
sOAPFactory.createSOAPHeaderBlock(TIMESTAMP, oMNamespace);
timeBlock.addChild(sOAPFactory.createOMText(timeStamp));
//消息頭中的業務表示節點。
String serviceId = (getServiceId() == null) ? "" : getServiceId();
SOAPHeaderBlock serviceIdBlock =
sOAPFactory.createSOAPHeaderBlock(SERVICEID, oMNamespace);
serviceIdBlock.addChild(sOAPFactory.createOMText(serviceId));
//消息頭中的業務校驗密碼節點。
String servPassWord = (getServPassWord() == null) ? "" : getServPassWord();
SOAPHeaderBlock servPassWordBlock =
sOAPFactory.createSOAPHeaderBlock(SERVPASSWORD, oMNamespace);
servPassWordBlock.addChild(sOAPFactory.createOMText(servPassWord));
//將各個節點加入到消息頭中。
soapHeader.addChild(serviceIdBlock);
soapHeader.addChild(servPassWordBlock);
soapHeader.addChild(timeBlock);
//將消息頭加入到當前消息中。
serviceClient.addHeader(soapHeader);
}
/**
* 解析消息頭。做爲服務端接受消息時,將當前消息中的消息頭取出,單獨解析成AttachHeader中設定的字段的值。
* @param soapHeader
*/
public void parseSoapHeader(SOAPHeader soapHeader)
{
//消息頭非空判斷。
if(soapHeader == null)
{
return ;
}
//獲取消息流中的消息頭列表,並作非空判斷。
Iterator<?> headerList = soapHeader.examineHeaderBlocks(null);
if(headerList == null)
{
return ;
}
//獲取第一個消息頭,並獲取消息頭中的元素。
SOAPHeaderBlock header = (SOAPHeaderBlock)headerList.next();
Iterator<?> elementList = header.getChildElements();
OMElement element = null;
String key = null;
String value = null;
if(elementList != null)
{
//解析非空列表中的全部節點。
while(elementList.hasNext())
{
//獲取節點key和value值。
element = (OMElement)elementList.next();
key = element.getLocalName();
value = element.getText().trim();
//若是是業務標籤,將值設置。
if(SERVICEID.equals(key))
{
setServiceId(value);
}
//若是是校驗密碼,將值設置。
if(SERVPASSWORD.equals(key))
{
setServPassWord(value);
}
//若是是時間戳,將值設置。
if(TIMESTAMP.equals(key))
{
setTimeStamp(value);
}
}
}
}
}
客戶端大包消息頭和服務端解析消息頭的方法都定義好了,那麼如何大包解析呢?
對於上篇中封裝的客戶端類SendAttachClient,要實現打包須要作以下步驟:
1、SendAttachClient繼承DealHeader。
2、根據服務地址,建立一個發送消息的客戶端時,打包消息頭。以下代碼:
//一、根據服務地址,建立一個發送消息的客戶端。
try
{
stub = new SendAttachServiceStub(serviceAddress);
packSoapHeader(stub._getServiceClient());
}
catch (AxisFault e1)
{
// TODO Auto-generated catch block
e1.printStackTrace();
}
3、測試代碼,增長設置消息頭字段的代碼。源代碼以下:
package main;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import com.yht.msg.client.SendAttachClient;
/**
* 客戶端測試類。
* @author Administrator
*
*/
public class Test
{
/**
* 入口方法。
* @param args
*/
public static void main(String[] args)
{
//獲取系統時間,爲日曆對象。
Calendar calendar = Calendar.getInstance();
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("HH:mm:ss");
String time = simpleDateFormat.format(calendar.getTime());
String result = null;
String subject = "Hello Axis2-1.6.2!";
String serviceAddress = "http://127.0.0.1:8088/SendAttachService";
String serviceId = "12345";
String servPassWord = "54321";
String timeStamp = time;
//建立客戶端類。
SendAttachClient client = new SendAttachClient();
client.setServiceId(serviceId);
client.setServPassWord(servPassWord);
client.setTimeStamp(timeStamp);
//設置消息體內容。
client.setSubject(subject);
//設置服務地址。
client.setServiceAddress(serviceAddress);
//發送消息獲取,結果。
result = client.sendAttach();
//打印結果。
System.out.println(result);
}
}
做爲服務端,只要獲取當前消息中的消息頭;new一個打包消息的類對象,將消息頭放到對象中解析;消息中的值就消息到該對象中。對於上一篇中的服務端類GetAttachService,增長解析消息頭能力後,源代碼以下:
package com.yht.msg.service;
import org.apache.axiom.soap.SOAPHeader;
import org.apache.axis2.context.MessageContext;
import com.yht.msg.SendAttach;
import com.yht.msg.SendAttachResponse;
import com.yht.msg.SendAttachServiceSkeletonInterface;
import com.yht.msg.header.DealHeader;
/**
* 服務端,接受消息。
* @author Administrator
*
*/
public class GetAttachService
implements SendAttachServiceSkeletonInterface
{
/**
* 接受消息並返回相應的相應。
*/
public SendAttachResponse sendAttach(SendAttach arg0)
{
//獲取上下行消息中的消息頭。
MessageContext context = MessageContext.getCurrentMessageContext();
SOAPHeader soapHeader = context.getEnvelope().getHeader();
//解析消息頭。
DealHeader dealHeader = new DealHeader();
dealHeader.parseSoapHeader(soapHeader);
// TODO Auto-generated method stub
System.out.println(dealHeader.getServiceId());
System.out.println(dealHeader.getServPassWord());
System.out.println(dealHeader.getTimeStamp());
System.out.println(arg0.getArgs0());
//響應。
SendAttachResponse response = new SendAttachResponse();
response.set_return("success");
return response;
}
}