`

webservice例程

 
阅读更多

1、服务端

(1)接口:

package ws1;

import java.util.List;

import javax.jws.WebService;

@WebService(name = "myService", portName = "myPort", serviceName = "myService", targetNamespace = "sun.com")
public interface IMyService {
	int add(int a, int b);

	User addUser(User user);

	List<User> list();

	boolean login(User user);
}
package ws1;

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
public class User {
	private Long id;
	private String name;
	private String sex;
	private Integer age;

	public Long getId() {
		return id;
	}

	public void setId(Long id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getSex() {
		return sex;
	}

	public void setSex(String sex) {
		this.sex = sex;
	}

	public Integer getAge() {
		return age;
	}

	public void setAge(Integer age) {
		this.age = age;
	}

	@Override
	public String toString() {
		return "User [id=" + id + ", name=" + name + ", sex=" + sex + ", age="
				+ age + "]";
	}

}


(2)实现类:

package ws1;

import java.util.ArrayList;
import java.util.List;

import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebResult;
import javax.jws.WebService;

@WebService(name = "myService", portName = "myPort", serviceName = "myService", targetNamespace = "sun.com")
public class MyServiceImpl implements IMyService {
	private List<User> users = new ArrayList<User>();

	@Override
	public @WebResult(name = "res")
	int add(@WebParam(name = "a") int a, @WebParam(name = "b") int b) {
		return a + b;
	}

	@WebMethod(exclude = false)
	@Override
	public @WebResult(name = "user")
	User addUser(@WebParam(name = "user") User user) {
		users.add(user);
		return user;
	}

	@WebMethod(exclude = false)
	@Override
	public @WebResult(name = "users")
	List<User> list() {
		return users;
	}

	@Override
	public @WebResult(name = "login")
	boolean login(@WebParam(name = "user") User user) {
		if (users.contains(user))
			return true;
		return false;
	}

}
(3)发布类
package ws1;

import javax.xml.ws.Endpoint;

public class Publish {
	public static void main(String[] args) {
		String address = "http://localhost:8888/ws";
		Object implementor = new MyServiceImpl();
		Endpoint.publish(address, implementor);
		System.out.println("发布成功。。。");
	}
}
2、客户端soap消息发送接收测试:

package ws1;

import java.io.IOException;
import java.io.StringReader;
import java.io.StringWriter;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Random;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
import javax.xml.namespace.QName;
import javax.xml.soap.MessageFactory;
import javax.xml.soap.SOAPBody;
import javax.xml.soap.SOAPBodyElement;
import javax.xml.soap.SOAPEnvelope;
import javax.xml.soap.SOAPException;
import javax.xml.soap.SOAPMessage;
import javax.xml.soap.SOAPPart;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.TransformerFactoryConfigurationError;
import javax.xml.transform.dom.DOMResult;
import javax.xml.transform.stream.StreamSource;
import javax.xml.ws.Dispatch;
import javax.xml.ws.Service;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;

import org.junit.Test;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

public class SOAPTest {
	private String ns = "sun.com";
	private String wsdlLocation = "http://localhost:8888/ws?wsdl";

	@Test
	public void testSOAPMsg() {
		try {
			// ***********************获取分发器***************************
			URL wsdlDocumentLocation = new URL(wsdlLocation);
			QName serviceName = new QName(ns, "myService");
			Service service = Service.create(wsdlDocumentLocation, serviceName);

			// MESSAGE 提供对整个协议消息的访问,而 PAYLOAD 只提供对协议消息负载的访问。
			QName portName = new QName(ns, "myPort");
			Dispatch<SOAPMessage> dispath = service.createDispatch(portName,
					SOAPMessage.class, Service.Mode.MESSAGE);

			// ***********************构建消息***************************
			// 获取SOAPMessage对象实例
			SOAPMessage message = MessageFactory.newInstance().createMessage();
			// 获取SOAPPart
			SOAPPart part = message.getSOAPPart();
			// 获取SOAPEnvelope
			SOAPEnvelope envelope = part.getEnvelope();
			// 获取header
			// SOAPHeader header = envelope.getHeader();
			// 获取body
			SOAPBody body = envelope.getBody();

			/*
			 * 手动构建消息 :
			 * 
			 * SOAP Request Envelope: <soapenv:Envelope
			 * xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
			 * xmlns:q0="targetNamespace->sun.com"
			 * xmlns:xsd="http://www.w3.org/2001/XMLSchema"
			 * xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> -
			 * <soapenv:Body> - <q0:addAB> <a>4</a> <b>6</b> </q0:addAB>
			 * </soapenv:Body> </soapenv:Envelope>
			 * 
			 * SOAP Response Envelope: - <S:Envelope
			 * xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"> - <S:Body> -
			 * <ns2:addABResponse xmlns:ns2="targetNamespace->sun.com">
			 * <res>10</res> </ns2:addABResponse> </S:Body> </S:Envelope>
			 */
			// QName格式:<sun:add xmlns:sun = "sun.com">
			QName qname = new QName(ns, "add", "sun");
			SOAPBodyElement sel = body.addBodyElement(qname);
			// body.addChildElement(qname);
			sel.addChildElement("a").setValue("4");
			sel.addChildElement("b").setValue("6");

			// 消息打印输出
			message.writeTo(System.out);

			// ***********************发送消息、获取响应***************************
			SOAPMessage respMsg = dispath.invoke(message);
			System.out.println();
			respMsg.writeTo(System.out);

			// ***********************解析消息,得到结果***************************
			Document dom = respMsg.getSOAPBody().extractContentAsDocument();
			String res = dom.getElementsByTagName("res").item(0)
					.getTextContent();
			System.out.println();
			System.out.println("a + b = " + res);
		} catch (SOAPException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	@Test
	public void testAddUser() {
		try {
			URL wsdlDocumentLocation = new URL(wsdlLocation);
			QName serviceName = new QName(ns, "myService");
			Service service = Service.create(wsdlDocumentLocation, serviceName);

			QName portName = new QName(ns, "myPort");
			Dispatch<Source> dispath = service.createDispatch(portName,
					Source.class, Service.Mode.PAYLOAD);

			/*
			 * 创建User并转换为xml格式 -
			 * 
			 * SOAP Request Envelope:
			 * 
			 * - <soapenv:Envelope
			 * xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
			 * xmlns:q0="sun.com" xmlns:xsd="http://www.w3.org/2001/XMLSchema"
			 * xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> -
			 * <soapenv:Body> - <q0:addUser> - <user> <age>1</age> <id>1</id>
			 * <name>张三</name> <sex>男</sex> </user> </q0:addUser>
			 * </soapenv:Body> </soapenv:Envelope>
			 */
			User user = new User();
			user.setAge(new Random().nextInt(50));
			user.setId(new Random().nextLong());
			user.setName("name" + Math.abs(new Random().nextInt(50)));
			user.setSex(new Random().nextBoolean() ? "男" : "女");

			JAXBContext jaxb = JAXBContext.newInstance(User.class);
			Marshaller marshaller = jaxb.createMarshaller();
			marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true);
			StringWriter writer = new StringWriter();
			marshaller.marshal(user, writer);
			System.out.println(writer.toString());

			// 拼装xml数据
			String payload = "<ss:addUser xmlns:ss='" + ns + "'>"
					+ writer.toString() + "</ss:addUser>";
			System.out.println(payload);
			StreamSource source = new StreamSource(new StringReader(payload));
			Source respSource = dispath.invoke(source);

			Transformer transformer = TransformerFactory.newInstance()
					.newTransformer();
			DOMResult dr = new DOMResult();
			transformer.transform(respSource, dr);

			XPath xPath = XPathFactory.newInstance().newXPath();
			NodeList nodeList = (NodeList) xPath.evaluate("//user",
					dr.getNode(), XPathConstants.NODESET);
			for (int i = 0; i < nodeList.getLength(); i++) {
				Node node = (Node) nodeList.item(i);
				Unmarshaller unmarshaller = jaxb.createUnmarshaller();
				User u = (User) unmarshaller.unmarshal(node);
				System.out.println(u);
			}
		} catch (MalformedURLException e) {
			e.printStackTrace();
		} catch (JAXBException e) {
			e.printStackTrace();
		} catch (TransformerConfigurationException e) {
			e.printStackTrace();
		} catch (TransformerFactoryConfigurationError e) {
			e.printStackTrace();
		} catch (TransformerException e) {
			e.printStackTrace();
		} catch (XPathExpressionException e) {
			e.printStackTrace();
		}

	}
}



分享到:
评论

相关推荐

    WEBSERVICE例程OK

    【WEBSERVICE例程OK】操作说明 在IT行业中,Web Service是一种基于互联网的、能够进行交互的应用程序接口。它允许不同的系统之间交换数据和服务,不受编程语言或操作系统限制,实现跨平台的数据共享。本例程主要...

    eclipse的axis插件 开发 webservice 例程

    在IT行业中,Web服务是一种基于互联网的标准协议,用于应用程序之间的通信。其中,SOAP(Simple Object Access Protocol)Web服务是常见的实现方式,而Axis是Apache软件基金会提供的一个开源工具,用于生成和部署...

    javawebservice例程

    它包括了诸如`@WebService`注解、`@SOAPBinding`、`@WebMethod`等,简化了服务端和客户端的编程模型。 3. **WSDL(Web Services Description Language)** - WSDL是XML格式的规范,用来描述Web服务及其接口。它...

    Android调用WebService详解例程

    本例程是android端如何去调用远程WebService,都说WebService是一种基于SOAP协议的远程调用标准, 对于这个协议理解不深,知道webservice可以将不同操作系统平台、不同语言、不同技术整合到一块, android SDK没有...

    pb11+webservice开发分布式三层应用 例程

    在本例程中,我们将深入探讨如何利用PB11结合Web服务(Webservice)技术来构建一个分布式三层应用。 **1. 分布式系统与三层架构** 分布式系统是多个独立计算机通过网络互相协作,共同完成一项任务。三层架构是一种...

    基于pb11.5自带webservice 客户端的接口测试例程

    总结,"基于pb11.5自带webservice 客户端的接口测试例程"是一个实用的教学资源,旨在帮助开发者了解如何在PB11.5环境中进行Web服务接口测试。通过学习这个例程,你可以掌握如何创建Web服务客户端,发起请求,处理...

    webservice接口调用天气预报例程

    在C#中,我们可以使用`System.Web.Services`命名空间中的`SoapHttpClientProtocol`类(或其派生类如`WebService`)来调用Web服务。首先,我们需要添加对Web服务的引用。这可以通过在解决方案资源管理器中右键点击...

    Linux 下 webservice c++ 服务器和客户端的实现demo

    Linux 下 webservice c++ 服务器和客户端的实现demo。先要部署webservice这是另外一回事,在我的博客里面有,这个demo,执行make就好了。如果不成功就把你安装soap(部署webservice要安装)时编译生成的soapcpp2拷贝...

    WebService

    在本例程中,我们将探讨如何使用C#来创建和使用WebService。 1. **XML**: XML是WebService的基础,用于数据的结构化表示。它是一种自描述的语言,使得不同系统之间的数据交换变得更加容易和通用。 2. **SOAP**: ...

    delphiXE5做的访问Webservice 安卓程序

    标题中的“delphiXE5做的访问Webservice 安卓程序”指的是使用Embarcadero Delphi XE5这个集成开发环境(IDE)创建的一个应用程序,该程序能够与Web服务进行交互,实现数据交换。Delphi XE5是面向对象的编程工具,...

    使用webservice实现客户端与服务器通信,

    Web服务(WebService)是一种基于网络的、分布式的模块化组件,允许不同系统之间的应用程序通过互联网进行交互。在本示例中,“使用webservice实现客户端与服务器通信”是一个典型的跨平台通信场景,它涉及到两个...

    VB.NET应用集锦例程

    《VB.NET应用集锦例程》是一份涵盖了多种VB.NET技术的应用程序集合,旨在帮助开发者深入理解和实践VB.NET编程。这个资源包包含了多个示例项目,涵盖了从基础到高级的各种主题,包括代码转换、网络通信、序列化、多...

    webService_vs2015.zip

    【标题】:“webService_vs2015.zip”是一个压缩包,主要包含了使用C++语言在Visual Studio 2015环境下实现的Web服务端的相关资料。Web服务是一种基于HTTP协议,提供数据交换和功能调用的标准方式,使得不同系统间...

    pb调用webservice

    在描述中提到的“pb调用webservice例子,简单的例程”,表明提供的压缩包文件包含了一个示例项目,旨在演示如何在PowerBuilder中实现对Web服务的调用。这样的示例通常包括创建和配置PB对象,设置必要的参数,以及...

    Android代码-ksoap2-webservice-demo

    ksoap2-webservice-demo demo内容包括android端与web服务端 &gt;在NetSetting.java文件中修改所需的方法参数,将其中的WEB_SERVICE_URL修改成为自己的url。之后对demo中的Request方法进行重写即可 博客地址:...

    syncOrderRelation.rar_misc_syncOrderRelation_webservice java dsm

    【描述】"移动misc平台订购例程" 指的是这个压缩包中的代码或文档是用于实现移动平台上的订单处理流程。这可能包括用户下单、订单状态跟踪、支付处理等一系列业务逻辑。在移动应用开发中,这样的功能是至关重要的,...

    ADS通讯例程.zip

    2. **TwinCAT ADS WebService通讯**:"TwinCAT ADS WebService通讯WES7下配置方法_俞文升.docx"可能详细阐述了如何在Windows Embedded Standard 7 (WES7)操作系统下,通过TwinCAT ADS服务与Web服务器集成,实现远程...

    WebService小栗子

    3. **计算器小例程**: 这部分可能是实现一个简单的数学计算服务,通过Web Service接口接收用户输入的算式,然后返回计算结果。这展示了如何将日常计算功能包装成Web服务,使得远程客户端可以调用执行计算任务。 4...

Global site tag (gtag.js) - Google Analytics