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()方法.具体实现:

创新互联建站从2013年成立,先为宿豫等服务建站,宿豫等地企业,进行企业商务咨询服务。为宿豫企业网站制作PC+手机+微官网三网同步一站式服务解决您的所有建站问题。

服务类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开发(三)   
  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开发(一).

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

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

用以配置处理soap消息头的类.

客户端代码:利用j2ee web serive开发(三)介绍的api不难写出saaj客户端代码就不再重复劳动了。这里只介绍JBOss ws利用DII实现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开发中的soap报头与处理也完成了。

【编辑推荐】

  1. j2ee web service开发(三)SAAJ带附件的soap消息
  2. j2ee web service开发(二)动态代理与动态调用
  3. j2ee web service开发(一) 映射数组复杂类型
  4. J2ee学习经验和流程
  5. 快速开发EJB和J2EE Web Applic

新闻标题:J2EE web service开发(四)soap报头与处理
文章路径:http://www.shufengxianlan.com/qtweb/news2/502052.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联