JAX-WS - Soap详解

本文详细介绍了如何使用JAX-WS创建SOAP服务,包括SOAP消息的发送方法,以及针对列表响应的处理。通过实例代码展示了基于MESSAGE方式发送SOAP请求,并提供了WSDL概览和服务端代码示例。
摘要由CSDN通过智能技术生成

一、创建Soap

    代码示例如下:

	@Test
	public void createSoap() throws Exception{
		
		// 创建消息工厂
		MessageFactory factory = MessageFactory.newInstance();
		
		// 通过工厂创建Soap的消息
		SOAPMessage message = factory.createMessage();
		
		// 获取SoapPart
		SOAPPart part = message.getSOAPPart();
		
		// 获取Soap信封Envelope
		SOAPEnvelope envelope = part.getEnvelope();
		
		// 通过Soap信封获取body和header的信息
		SOAPBody body = envelope.getBody();
		
		// 根据QName创建相应的节点(QName就是一个带有命名空间的节点:<ns:add xmls="http://www.xilen.com/webservice"/> )
		QName qname = new QName("http://webservice.xilen.com", "add", "ns");
		
		//通过soapBody传入QName添加body元素
		SOAPBodyElement bodyElement = body.addBodyElement(qname);
		
		// 对body添加子元素 (或者直接对body元素设置值:bodyElement.setValue("5"); )
		SOAPElement childElement = bodyElement.addChildElement("a");
		
		// 对body子元素设置值
		childElement.setValue("7");
		
		// 继续添加第二个子元素 (或者继续对子元素添加子元素:childElement.addChildElement("acn").setValue("acv");)
		bodyElement.addChildElement("b").setValue("5");
		
		// 打印最终得到的Soap消息
		message.writeTo(System.out);
		
	}
    得到的Soap消息如下:

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
	<SOAP-ENV:Header/>
	<SOAP-ENV:Body>
		<ns:add xmlns:ns="http://webservice.xilen.com">
			<a>7</a>
			<b>5</b>
		</ns:add>
	</SOAP-ENV:Body>
</SOAP-ENV:Envelope>

二、发送Soap消息

    1、基于MESSAGE的方式

        代码示例如下:

	@Test
	public void sendSoapByMessage() throws Exception{
		
		/**
		 *  定义相关变量(wsdl文档的路径、接口的命名空间、实现的命名空间)
		 */
		String wsdlUrl = "http://localhost:8888/user?wsdl";
		String implNS = "http://impl.soap.xilen.com/";
		String inteNS = "http://soap.xilen.com/";
		
		
		/**
		 *  创建服务
		 */
		URL url = new URL(wsdlUrl);
		// 通过wsdl实现部分的命名空间创建服务的QNane,因为Service的描述在实现部分的命名空间中(详见 六、附录 中的截图)
		QName serviceQname = new QName(implNS, "UserServiceImplService");
		Service service = Service.create(url, serviceQname);
		
		
		/**
		 *  创建Dispatch (通过SOAPMessage传递) 
		 */
		Dispatch<SOAPMessage> dispatch =
				// portName:wsdl文件中Service节点中的prot的name属性值的QName; type:消息类型; mode:消息传递的类型(message|payLoad)
				service.createDispatch(new QName(implNS, "UserServiceImplPort"), SOAPMessage.class, Service.Mode.MESSAGE);
		
		
		/**
		 *  创建SoapMessage
		 */
		SOAPMessage message = MessageFactory.newInstance().createMessage();
		SOAPEnvelope envelope =  message.getSOAPPart().getEnvelope();
		SOAPBody body = envelope.getBody();
		// 通过wsdl接口部分的命名空间创建消息的QNane,因为Message的描述在接口部分的命名空间中<span style="font-family: Arial, Helvetica, sans-serif;">(详见 六、附录 中的截图)</span>
		QName soapQname = new QName(inteNS, "login", "ns");
		SOAPBodyElement bodyElement = body.addBodyElement(soapQname);
		bodyElement.addChildElement("name").setValue("admin");
		bodyElement.addChildElement("pass").setValue("12345");
		
		
		/**
		 *  输出即将发
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值