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();
		}

	}
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值