自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

J2EE web service開發(fā)(四)soap報頭與處理

開發(fā) 后端
本文敘述了J2EE web service開發(fā)中的soap報頭與處理。SOAPHeaderElement 對象中的屬性決定了接收者怎樣處理消息,可以認為header屬性提供了擴展消息的方法,給出了像身份認證,支付,轉發(fā)消息這樣的相關的事情。

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

服務類HandlerServic:

  1. package handler;   
  2.  
  3. public class HandlerService implements HandlerServiceInterface1 {   
  4.   public void testInOutHeader(String bodyMsg, String headerMsg)   
  5.    {   
  6.       System.out.print("testInHeader: " + bodyMsg + "," + headerMsg);   
  7.    }   
  8. }   

消息處理類:

  1. package handler;   
  2.  
  3. import javax.xml.rpc.handler.*;   
  4. import javax.xml.soap.*;   
  5. import javax.xml.namespace.QName;   
  6. import javax.xml.rpc.JAXRPCException;   
  7. import javax.xml.rpc.handler.soap.SOAPMessageContext;   
  8. import java.util.Iterator;   
  9.  
  10. public class CutomerHandler extends GenericHandler {   
  11.     protected QName[] headers = new QName[] {   
  12.                                 new QName("http://handler""headerMsg")   
  13.     };   
  14.     public QName[] getHeaders() {   
  15.         return headers;   
  16.     }// 返回handler要處理的文件頭元素名的素組.   
  17.  
  18.     // 處理接收到的soap消息.如果返回值為false時JAX-RPC會立即中斷對SOAP消息處理并將soap消息回傳。關于saaj api使用方法見j2ee web service開發(fā)(三)   
  19.     public boolean handleRequest(MessageContext msgContext) {   
  20.  
  21.         try {   
  22.             SOAPMessage soapMessage = ((SOAPMessageContext) msgContext).   
  23.                                       getMessage();   
  24.             SOAPHeader soapHeader = soapMessage.getSOAPHeader();   
  25.             Iterator it = soapHeader.extractAllHeaderElements();   
  26.             while (it.hasNext()) {   
  27.                 SOAPHeaderElement headerElement = (SOAPHeaderElement) it.next();   
  28.                 Name headerName = headerElement.getElementName();   
  29.                 System.out.println(" header name is: " +   
  30.                                    headerName.getQualifiedName());   
  31.                 System.out.println(" header value is: " +   
  32.                                    headerElement.getValue());   
  33.             }   
  34.             SOAPBody soapBody = soapMessage.getSOAPBody();   
  35.             Iterator bodyIterator = soapBody.getChildElements();   
  36.             while (bodyIterator.hasNext()) {   
  37.                 SOAPBodyElement soapBodyElement = (SOAPBodyElement)   
  38.                                                   bodyIterator.next();   
  39.                 System.out.println("soapBodyElement print: " +   
  40.                                    soapBodyElement.getNodeName());   
  41.             }   
  42.             SOAPBodyElement nextSoapBodyElement = (SOAPBodyElement) soapBody.   
  43.                                                   getChildElements().next();   
  44.             SOAPElement soapElement = (SOAPElement) nextSoapBodyElement.   
  45.                                       getChildElements().next();   
  46.             System.out.println("soapElement print: " + soapElement.getLocalName() +   
  47.                                "  " + soapElement.getValue());   
  48.         } catch (SOAPException e) {   
  49.             throw new JAXRPCException(e);   
  50.         }   
  51.         return true;   
  52.     }   
  53. // 返回soap應答消息,本例修改soap文件頭的值再返傳給客戶端.   
  54.     public boolean handleResponse(MessageContext msgContext) {   
  55.  
  56.         try {   
  57.             SOAPMessage soapMessage = ((SOAPMessageContext) msgContext).   
  58.                                       getMessage();   
  59.             SOAPHeader soapHeader = soapMessage.getSOAPHeader();   
  60.  
  61.             SOAPBody soapBody = soapMessage.getSOAPBody();   
  62.             SOAPBodyElement soapBodyElement = (SOAPBodyElement) soapBody.   
  63.                                               getChildElements().next();   
  64.             String rpcName = soapBodyElement.getElementName().getLocalName();   
  65.                 SOAPFactory soapFactory = SOAPFactory.newInstance();   
  66.                 Name headerName = soapFactory.createName("headerMsg""ns","http://handler");   
  67.                 SOAPHeaderElement she = soapHeader.addHeaderElement(headerName);   
  68.                 she.setValue("return header message");   
  69.         } catch (SOAPException e) {   
  70.             throw new JAXRPCException(e);   
  71.         }   
  72.         return true;   
  73.     }   
  74. }   

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

  1. < configuration xmlns="http://www.jboss.org/jbossws-tools"   
  2.    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   
  3.    xsi:schemaLocation="http://www.jboss.org/jbossws-tools http://www.jboss.org/jbossws-tools/schema/jbossws-tool_1_0.xsd">   
  4.   < java-wsdl>   
  5.     < service name="TestService" style="rpc" endpoint="handler.HandlerServiceInterface1">   
  6.       < operation name="testInOutHeader">   
  7.         < parameter type="java.lang.String"/>   
  8.         < parameter type="java.lang.String"/>   
  9.       < /operation>   
  10.     < /service>   
  11.     < namespaces target-namespace="http://handler" type-namespace="http://handler"/>   
  12.     < mapping file="HandlerServiceInterface1.xml"/>   
  13.     < webservices servlet-link="HandlerServiceInterface1"/>   
  14.   < /java-wsdl>   
  15. < /configuration>   

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

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

  1. < handler>   
  2.  < handler-name>CutomerHandler< /handler-name>   
  3.  < handler-class>handler.CutomerHandler< /handler-class>   
  4.  /handler>   

用以配置處理soap消息頭的類.

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

  1. package handler;   
  2. import javax.xml.namespace.QName;   
  3. import javax.xml.rpc.Call;   
  4. import javax.xml.rpc.ParameterMode;   
  5. import javax.xml.rpc.Service;   
  6. import org.jboss.ws.Constants;   
  7. import org.jboss.ws.jaxrpc.CallImpl;   
  8. import javax.xml.rpc.ServiceFactory;   
  9. import java.util.*;   
  10. public class HandlerClient {   
  11.     public HandlerClient() {   
  12.     }   
  13.     public static void main(String[] args) throws Exception{   
  14.         HandlerClient handlerclient = new HandlerClient();   
  15.         handlerclient.testUnboundInOutHeader();   
  16.     }   
  17.     public void testUnboundInOutHeader() throws Exception{   
  18.         Service service = ServiceFactory.newInstance().createService(new QName("TestService"));   
  19.         CallImpl call = (CallImpl)service.createCall();   
  20.         call.setOperationName(new QName("http://handler""testInOutHeader"));   
  21.         call.addParameter("String_1", Constants.TYPE_LITERAL_STRING, ParameterMode.IN);   
  22.         call.addParameter("String_2", Constants.TYPE_LITERAL_STRING, ParameterMode.IN);   
  23.         call.setTargetEndpointAddress("http://hechang:8082/customer-handler/services/HandlerServiceInterface1");   
  24.         QName xmlName = new QName("http://handler""headerMsg");   
  25.         // xmlName = new QName("http://otherns", "HeaderValue");   
  26.  
  27.         call.addUnboundHeader(xmlName, Constants.TYPE_LITERAL_STRING, String.class, ParameterMode.IN);   
  28.         call.setUnboundHeaderValue(xmlName, " IN header message");   
  29. // 設置消息頭 可以設定多組   
  30.         Object retObj = call.invoke(new Object[]{"Hello world!""IN header message"});   
  31.         String unboundRet = (String)call.getUnboundHeaderValue(xmlName);   
  32.        // 處理返回的消息頭的值   
  33.         System.out.println(" unboundReturn: "+unboundRet);   
  34. }   
  35. }  

以上,J2EE Web Service開發(fā)中的soap報頭與處理也完成了。

【編輯推薦】

  1. j2ee web service開發(fā)(三)SAAJ帶附件的soap消息
  2. j2ee web service開發(fā)(二)動態(tài)代理與動態(tài)調用
  3. j2ee web service開發(fā)(一) 映射數(shù)組復雜類型
  4. J2ee學習經(jīng)驗和流程
  5. 快速開發(fā)EJB和J2EE Web Applic
責任編輯:book05 來源: csdn
相關推薦

2009-06-22 10:04:00

J2EE web se

2009-06-22 09:56:00

J2EE web se

2009-06-22 10:59:00

J2EE web se

2009-06-22 10:14:00

J2EE web se

2009-06-22 09:48:00

J2EE web se

2009-06-22 11:50:00

J2EE Web應用快速開發(fā)

2009-06-23 16:48:26

J2EE常見問題J2EE平臺

2009-06-18 16:13:14

J2EE開發(fā)

2009-06-10 13:30:32

J2EE四層模型客戶層Web層

2009-06-23 08:06:46

J2EE體系架構J2EE模型J2EE設計模式

2009-06-10 14:10:23

J2EE學習J2EE是什么

2009-06-11 17:06:11

J2EE歷史Java EE概述

2009-06-10 13:37:06

J2EE可伸縮性J2EE靈活性J2EE維護

2009-06-22 17:09:00

J2EE項目開發(fā)流程

2009-06-10 13:19:21

J2EE核心APIJ2EE核心組件

2009-06-18 15:54:57

J2EE下使用JNDI

2009-06-23 08:12:48

J2EE調用存儲過程

2009-06-22 17:34:40

J2EE架構

2009-06-22 17:05:41

Java EEJava企業(yè)應用

2009-06-16 11:14:00

Hibernate+SJ2EE應用開發(fā)
點贊
收藏

51CTO技術棧公眾號