<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)

    我參與的團隊

    隨筆分類

    隨筆檔案

    文章分類

    友情鏈接

    搜索

    積分與排名

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 亚洲熟妇av一区| 亚洲欧洲精品久久| 激情婷婷成人亚洲综合| 在线天堂免费观看.WWW| 亚洲婷婷在线视频| A级毛片内射免费视频| 亚洲精品伊人久久久久| 免费网站看v片在线香蕉| 一本色道久久88—综合亚洲精品 | 亚洲国产香蕉人人爽成AV片久久| 亚洲中文字幕久久精品无码A| 女人张开腿等男人桶免费视频 | a级毛片毛片免费观看永久| 久久亚洲精品无码播放| a级成人毛片免费图片| 亚洲一区二区在线免费观看| 国产免费一区二区三区| ASS亚洲熟妇毛茸茸PICS| 韩国18福利视频免费观看| 国产精品亚洲专一区二区三区| 亚洲国产中文字幕在线观看| 国产乱妇高清无乱码免费| 亚洲AV综合色区无码一区爱AV | 久久久精品国产亚洲成人满18免费网站| 一级美国片免费看| 久久夜色精品国产嚕嚕亚洲av| 一区二区三区四区免费视频| avtt天堂网手机版亚洲| 又大又粗又爽a级毛片免费看| 一级有奶水毛片免费看| 亚洲美女色在线欧洲美女| 免费无码看av的网站| aaa毛片视频免费观看| 亚洲第一精品电影网| 国产在线播放免费| av永久免费网站在线观看| 亚洲人成日本在线观看| 亚洲成A人片在线观看中文| 精品免费视在线观看| 亚洲日韩精品无码专区加勒比 | 亚洲一级免费毛片|