J2EE web service开发(四)soap报头与处理

开发 后端
本文叙述了J2EE web service开发中的soap报头与处理。SOAPHeaderElement 对象中的属性决定了接收者怎样处理消息,可以认为header属性提供了扩展消息的方法,给出了像身份认证,支付,转发消息这样的相关的事情。

SOAPHeaderElement 对象中的属性决定了接收者怎样处理消息,可以认为header属性提供了扩展消息的方法,给出了像身份认证,支付,转发消息这样的相关的事情。JAX-RPC客户API(占位程序,动态代理,DII)均没有提供对SOAP文件头的支持,SAAJ API提供了支持。所有消息处理程序都必须实现javax.xml.rpc.handler.Handler接口,该接口有一系列的方法用以处理soap消息。javax.xml.rpc.handler.GenericHandler是一个缺省适配器类,创建我们自己的消息处理程序的时候从该类继承覆写我们自己感兴趣的方法就可以了。但每一个handler必须实现 getHeader()方法跟 handleRequest()方法.具体实现:

服务类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
责任编辑: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应用快速开发

2009-06-18 16:13:14

J2EE开发

2009-06-10 13:30:32

J2EE四层模型客户层Web层

2009-06-23 16:48:26

J2EE常见问题J2EE平台

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项目开发流程

2009-06-10 13:19:21

J2EE核心APIJ2EE核心组件

2009-06-22 17:05:41

Java EEJava企业应用

2009-06-22 16:21:02

J2EE线程

2009-06-22 17:34:40

J2EE架构

2009-06-18 15:54:57

J2EE下使用JNDI

2009-06-23 08:12:48

J2EE调用存储过程
点赞
收藏

51CTO技术栈公众号