<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    java隨記

    堅持就是勝利!

     

    j2ee web service開發(四) soap報頭與處理

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

    服務類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消息.如果返回值為falseJAX-RPC會立即中斷對SOAP消息處理并將soap消息回傳。關于saaj api使用方法見j2ee web service開發()

    ??? 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應答消息,本例修改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>

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

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

    ???? <handler>

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

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

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

    ?

    客戶端代碼:利用j2ee web serive開發()介紹的api不難寫出saaj客戶端代碼就不再重復勞動了。這里只介紹JBOss ws利用DII實現soap消息頭的處理,它擴展了標準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");

    // 設置消息頭 可以設定多組

    ??????? 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 傻 瓜 閱讀(3451) 評論(0)  編輯  收藏 所屬分類: j2ee web service

    導航

    統計

    常用鏈接

    留言簿(7)

    我參與的團隊

    隨筆分類

    隨筆檔案

    文章分類

    友情鏈接

    搜索

    積分與排名

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 国产一级大片免费看| 免费观看男人免费桶女人视频| 亚洲精品偷拍视频免费观看| 中文字字幕在线高清免费电影| 国产免费观看a大片的网站| 日本亚洲免费无线码| 蜜臀AV免费一区二区三区| 久久精品国产亚洲AV大全| 鲁大师在线影院免费观看| 亚洲无线电影官网| 国产四虎免费精品视频| 亚洲人成免费电影| 最近中文字幕免费mv视频7| 亚洲av最新在线观看网址| 免费真实播放国产乱子伦| 日本高清不卡中文字幕免费| 久久久久亚洲爆乳少妇无| 三年片免费观看大全国语| 亚洲国语精品自产拍在线观看| 57pao国产成视频免费播放| 亚洲人和日本人jizz| 日本大片在线看黄a∨免费| 日本免费精品一区二区三区| 国产偷国产偷亚洲高清日韩| 美女视频黄a视频全免费网站色窝| 婷婷亚洲综合五月天小说| 国产美女在线精品免费观看| 激情婷婷成人亚洲综合| 亚洲国产精品无码av| 成年人免费的视频| 国产成人 亚洲欧洲| 亚洲国产精品SSS在线观看AV| 最近免费中文字幕大全高清大全1| 亚洲AV成人一区二区三区在线看| 国产精品免费电影| 99免费精品视频| 亚洲Av高清一区二区三区| 亚洲va中文字幕无码| 久久国产色AV免费看| 美女被免费视频网站a| 亚洲小视频在线观看|