java隨記

          堅(jiān)持就是勝利!

           

          j2ee web service開發(fā)(四) soap報(bào)頭與處理

          ?? SOAPHeaderElement 對(duì)象中的屬性決定了接收者怎樣處理消息,可以認(rèn)為header屬性提供了擴(kuò)展消息的方法,給出了像身份認(rèn)證,支付,轉(zhuǎn)發(fā)消息這樣的相關(guān)的事情。JAX-RPC客戶API(占位程序,動(dòng)態(tài)代理,DII)均沒有提供對(duì)SOAP文件頭的支持,SAAJ API提供了支持。所有消息處理程序都必須實(shí)現(xiàn)javax.xml.rpc.handler.Handler接口,該接口有一系列的方法用以處理soap消息。javax.xml.rpc.handler.GenericHandler是一個(gè)缺省適配器類,創(chuàng)建我們自己的消息處理程序的時(shí)候從該類繼承覆寫我們自己感興趣的方法就可以了。但每一個(gè)handler必須實(shí)現(xiàn) getHeader()方法跟 handleRequest()方法.具體實(shí)現(xiàn):

          服務(wù)類HandlerServic:

          package handler;

          ?

          public class HandlerService implements HandlerServiceInterface1 {

          ? public void testInOutHeader(String bodyMsg, String headerMsg)

          ?? {

          ????? System.out.print("testInHeader: " + bodyMsg + "," + headerMsg);

          ?

          ?? }

          ?

          }

          ?

          消息處理類:

          package handler;

          ?

          import javax.xml.rpc.handler.*;

          import javax.xml.soap.*;

          import javax.xml.namespace.QName;

          import javax.xml.rpc.JAXRPCException;

          import javax.xml.rpc.handler.soap.SOAPMessageContext;

          import java.util.Iterator;

          ?

          public class CutomerHandler extends GenericHandler {

          ? ??protected QName[] headers = new QName[] {

          ??????????????????????????????? new QName("http://handler", "headerMsg")

          ??? };

          ??? public QName[] getHeaders() {

          ??????? return headers;

          ??? }// 返回handler要處理的文件頭元素名的素組.

          ?

          ??? // 處理接收到的soap消息.如果返回值為false時(shí)JAX-RPC會(huì)立即中斷對(duì)SOAP消息處理并將soap消息回傳。關(guān)于saaj api使用方法見j2ee web service開發(fā)()

          ??? public boolean handleRequest(MessageContext msgContext) {

          ?

          ??????? try {

          ??????????? SOAPMessage soapMessage = ((SOAPMessageContext) msgContext).

          ????????????????????????????????????? getMessage();

          ??????????? SOAPHeader soapHeader = soapMessage.getSOAPHeader();

          ??????????? Iterator it = soapHeader.extractAllHeaderElements();

          ??????????? while (it.hasNext()) {

          ??????????????? SOAPHeaderElement headerElement = (SOAPHeaderElement) it.next();

          ????? ??????????Name headerName = headerElement.getElementName();

          ??????????????? System.out.println(" header name is: " +

          ?????????????????????????????????? headerName.getQualifiedName());

          ??????????????? System.out.println(" header value is: " +

          ????????????? ?????????????????????headerElement.getValue());

          ??????????? }

          ??????????? SOAPBody soapBody = soapMessage.getSOAPBody();

          ??????????? Iterator bodyIterator = soapBody.getChildElements();

          ??????????? while (bodyIterator.hasNext()) {

          ??????????????? SOAPBodyElement soapBodyElement = (SOAPBodyElement)

          ????????????????????????????????????????????????? bodyIterator.next();

          ??????????????? System.out.println("soapBodyElement print: " +

          ?????????????????????????????????? soapBodyElement.getNodeName());

          ??????????? }

          ??????????? SOAPBodyElement nextSoapBodyElement = (SOAPBodyElement) soapBody.

          ????????????????????????????????????????????????? getChildElements().next();

          ??????????? SOAPElement soapElement = (SOAPElement) nextSoapBodyElement.

          ????????????????????????? ????????????getChildElements().next();

          ??????????? System.out.println("soapElement print: " + soapElement.getLocalName() +

          ?????????????????????????????? "? " + soapElement.getValue());

          ??????? } catch (SOAPException e) {

          ??????????? throw new JAXRPCException(e);

          ??????? }

          ?

          ??????? return true;

          ??? }

          ?

          // 返回soap應(yīng)答消息,本例修改soap文件頭的值再返傳給客戶端.

          ??? public boolean handleResponse(MessageContext msgContext) {

          ?

          ??????? try {

          ??????????? SOAPMessage soapMessage = ((SOAPMessageContext) msgContext).

          ?????????????????????? ???????????????getMessage();

          ??????????? SOAPHeader soapHeader = soapMessage.getSOAPHeader();

          ?

          ??????????? SOAPBody soapBody = soapMessage.getSOAPBody();

          ??????????? SOAPBodyElement soapBodyElement = (SOAPBodyElement) soapBody.

          ??????????????????????????? ??????????????????getChildElements().next();

          ??????????? String rpcName = soapBodyElement.getElementName().getLocalName();

          ?

          ??????????????? SOAPFactory soapFactory = SOAPFactory.newInstance();

          ??????????????? Name headerName = soapFactory.createName("headerMsg", "ns","http://handler");

          ??????????????? SOAPHeaderElement she = soapHeader.addHeaderElement(headerName);

          ??????????????? she.setValue("return header message");

          ?

          ??????? } catch (SOAPException e) {

          ??????????? throw new JAXRPCException(e);

          ??????? }

          ?

          ??????? return true;

          ??? }

          ?

          ?

          }

          用于生成布署描述符的WSTOOLS工具的配置文件:

          <configuration xmlns="http://www.jboss.org/jbossws-tools"

          ?? xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

          ?? xsi:schemaLocation="http://www.jboss.org/jbossws-tools http://www.jboss.org/jbossws-tools/schema/jbossws-tool_1_0.xsd">

          ? <java-wsdl>

          ??? <service name="TestService" style="rpc" endpoint="handler.HandlerServiceInterface1">

          ?

          ????? <operation name="testInOutHeader">

          ??????? <parameter type="java.lang.String"/>

          ??????? <parameter type="java.lang.String"/>

          ????? </operation>

          ?

          ??? </service>

          ??? <namespaces target-namespace="http://handler" type-namespace="http://handler"/>

          ??? <mapping file="HandlerServiceInterface1.xml"/>

          ??? <webservices servlet-link="HandlerServiceInterface1"/>

          ? </java-wsdl>

          </configuration>

          關(guān)于wstools工具的使用見j2ee web service開發(fā)().

          在生成的webservice描述符文件中手工加入以下代碼:

          ???? <handler>

          ????? <handler-name>CutomerHandler</handler-name>

          ????? <handler-class>handler.CutomerHandler</handler-class>

          ??? </handler> 用以配置處理soap消息頭的類.

          ?

          客戶端代碼:利用j2ee web serive開發(fā)()介紹的api不難寫出saaj客戶端代碼就不再重復(fù)勞動(dòng)了。這里只介紹JBOss ws利用DII實(shí)現(xiàn)soap消息頭的處理,它擴(kuò)展了標(biāo)準(zhǔn)jax-rpc api.

          package handler;

          import javax.xml.namespace.QName;

          import javax.xml.rpc.Call;

          import javax.xml.rpc.ParameterMode;

          import javax.xml.rpc.Service;

          import org.jboss.ws.Constants;

          import org.jboss.ws.jaxrpc.CallImpl;

          import javax.xml.rpc.ServiceFactory;

          import java.util.*;

          public class HandlerClient {

          ??? public HandlerClient() {

          ??? }

          ?

          ??? public static void main(String[] args) throws Exception{

          ??????? HandlerClient handlerclient = new HandlerClient();

          ??????? handlerclient.testUnboundInOutHeader();

          ??? }

          ??? public void testUnboundInOutHeader() throws Exception{

          ??????? Service service = ServiceFactory.newInstance().createService(new QName("TestService"));

          ????? ??CallImpl call = (CallImpl)service.createCall();

          ??????? call.setOperationName(new QName("http://handler", "testInOutHeader"));

          ??????? call.addParameter("String_1", Constants.TYPE_LITERAL_STRING, ParameterMode.IN);

          ??????? call.addParameter("String_2", Constants.TYPE_LITERAL_STRING, ParameterMode.IN);

          ??????? call.setTargetEndpointAddress("http://hechang:8082/customer-handler/services/HandlerServiceInterface1");

          ??????? QName xmlName = new QName("http://handler", "headerMsg");

          ??????? // xmlName = new QName("http://otherns", "HeaderValue");

          ?

          ??????? call.addUnboundHeader(xmlName, Constants.TYPE_LITERAL_STRING, String.class, ParameterMode.IN);

          ??????? call.setUnboundHeaderValue(xmlName, " IN header message");

          // 設(shè)置消息頭 可以設(shè)定多組

          ??????? Object retObj = call.invoke(new Object[]{"Hello world!", "IN header message"});

          ???????

          ??????? String unboundRet = (String)call.getUnboundHeaderValue(xmlName);

          ?????? // 處理返回的消息頭的值

          ??????? System.out.println(" unboundReturn: "+unboundRet);

          }

          ?

          }
          打包的war文件

          歡迎加入QQ群:30406099




          posted on 2006-11-13 15:28 傻 瓜 閱讀(3444) 評(píng)論(0)  編輯  收藏 所屬分類: j2ee web service

          導(dǎo)航

          統(tǒng)計(jì)

          常用鏈接

          留言簿(7)

          我參與的團(tuán)隊(duì)

          隨筆分類

          隨筆檔案

          文章分類

          友情鏈接

          搜索

          積分與排名

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 玛纳斯县| 宽城| 界首市| 东安县| 南涧| 宜兰县| 舒城县| 新乐市| 瓦房店市| 江山市| 德安县| 苏州市| 尼木县| 来凤县| 伊宁县| 莱阳市| 子长县| 万年县| 宁南县| 无极县| 保康县| 昆明市| 南和县| 凤城市| 齐河县| 宜阳县| 剑阁县| 德昌县| 福贡县| 三台县| 通州区| 叶城县| 伊宁县| 昭觉县| 会理县| 明光市| 大宁县| 瑞丽市| 剑阁县| 莱州市| 景宁|