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",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,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(); } } }
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。