思路:
1.开启webserver的服务【调用add的function】
2.在test方法开始写对应的消息体内容,然后再用请求对应的服务,来解析返回的消息内容
1.开启webserver的服务【调用add的function】:
@WebService(endpointInterface="com.samlai.service.MyService")
public class MyServiceImp implements MyService{
@Override
public int add(int a, int b) {
int c=a+b;
System.out.println(a+"+"+b+"="+c);
return c;
}
}
package com.samlai.service;
import javax.xml.ws.Endpoint;
public class MyServiceOpen {
public static void main(String[] args) {
String address="http://localhost:8588/samlai";
Endpoint.publish(address, new MyServiceImp());
}
}
2.在test方法开始写对应的消息体内容,然后再用请求对应的服务,来解析返回的消息内容
//将消息进行组合进行请求到对应的wsdl的上进行获取对应的返回的内容值
@org.junit.Test
public void sendMessage(){
String wsdUrl="http://localhost:8588/samlai?wsdl";
String ns="http://service.samlai.com/";
try {
//1.创建服务(Service)
URL url=new URL(wsdUrl);
QName qName=new QName(ns, "MyServiceImpService");
Service service=Service.create(url, qName);
service.addPort(new QName("MyServiceImpPort"), SOAPBinding.SOAP11HTTP_BINDING, wsdUrl);
//创建dispatch
Dispatch<SOAPMessage> dispatch=service.createDispatch(new QName("MyServiceImpPort"),
SOAPMessage.class, Service.Mode.MESSAGE);
//创建SOAPMessage
SOAPMessage msg=MessageFactory.newInstance().createMessage();
SOAPEnvelope envelope=msg.getSOAPPart().getEnvelope();
SOAPBody body=envelope.getBody();
//4.创建QName来指定消息中传递数据
QName ename=new QName(ns,"add","mp");//<xmsx:add xmlns="xx"/>
SOAPBodyElement ele=body.addBodyElement(ename);
ele.addChildElement("arg0").setValue("1234");
ele.addChildElement("arg1").setValue("778");
msg.writeTo(System.out);
System.err.println("开始传输数据了...");
//通过Dispatch传递信息
SOAPMessage response=dispatch.invoke(msg);
//打印到控制台上
response.writeTo(System.out);
// <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
// <SOAP-ENV:Header/><SOAP-ENV:Body>
// <mp:add xmlns:mp="http://service.samlai.com/">
// <arg0>1234</arg0><arg1>778</arg1>
// </mp:add>
// </SOAP-ENV:Body>
// </SOAP-ENV:Envelope>
//传递与接收数据
//<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"><SOAP-ENV:Header/><SOAP-ENV:Body><mp:add xmlns:mp="http://service.samlai.com/"><arg0>1234</arg0><arg1>778</arg1></mp:add></SOAP-ENV:Body></SOAP-ENV:Envelope>开始传输数据了...
//<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"><S:Header/><S:Body><ns2:addResponse xmlns:ns2="http://service.samlai.com/"><return>2012</return></ns2:addResponse></S:Body></S:Envelope>
} catch (Exception e) {
e.printStackTrace();
}
}
3.如果是传的User对象内容值,服务接口方法:
3.1构建user的java bean
package com.samlai.dao;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement
public class User {
private Long id;
private String name;
private int 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 int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "User [id=" + id + ", name=" + name + ", age=" + age + "]";
}
}
3.1调用实体的方法:
@Override
public User getOneUser(String userName,int userAge) {
User user=new User();
user.setId(1L);
user.setAge(25);
user.setName("SamLai");
System.err.println(user.toString());
return user;
}
@Override
public User getOneUserInfo(User user) {
System.out.println(user.toString());
User newData=new User();
newData.setAge(234);
newData.setId(111L);
newData.setName("新的对象类型-->User");
System.out.println("新的对象------------------->"+newData.toString());
return newData;
}
4.请求体拼接再去请求对应的接口内容处理返回的内容信息:
//将实体对象转为对应的xml内容然后发送到webservice
@org.junit.Test
public void testpayLoad(){
String wsdUrl="http://localhost:8588/samlai?wsdl";
String ns="http://service.samlai.com/";
//1.创建服务(Service)
URL url;
try {
url = new URL(wsdUrl);
QName qName=new QName(ns, "MyServiceImpService");
Service service=Service.create(url, qName);
service.addPort(new QName("MyServiceImpPort"), SOAPBinding.SOAP11HTTP_BINDING, wsdUrl);
//创建dispatch
Dispatch<Source> dispatch=service.createDispatch(new QName(ns,"MyServiceImpPort"),
Source.class,Service.Mode.PAYLOAD);
//根据用户对象创建相应的xml
User user=new User();
user.setAge(8);
user.setName("old Name...");
user.setId(88L);
JAXBContext ctx=JAXBContext.newInstance(User.class);
Marshaller mat=ctx.createMarshaller();
StringWriter writer=new StringWriter();
//去掉JAXBContext生成的xml的头部
mat.setProperty(Marshaller.JAXB_FRAGMENT, true);
//封装的user值内容:<?xml version="1.0" encoding="UTF-8" standalone="yes"?><user><age>8</age><id>88</id><name>old Name...</name></user>
mat.marshal(user, writer);
System.out.println("封装的user值内容:"+writer.toString());
//通过dispath传递payload
String payLoad="<nn:getOneUserInfo xmlns:nn=\""+ns+"\">" +
writer.toString()+"</nn:getOneUserInfo>";
StreamSource rs=new StreamSource(new StringReader(payLoad));
Source response=dispatch.invoke(rs);
//将source转化为DOM进行操作,使用TransForm对象转换
// Transformer tran=TransformerFactory.newInstance().newTransformer();
// DOMResult result=new DOMResult();
// tran.transform(response, result);
//
// //处理相应信息(通过xpath处理)
// XPath xPath=XPathFactory.newInstance().newXPath();
// NodeList nl=(NodeList)xPath.evaluate("//user", result.getNode(),XPathConstants.NODESET);
// System.out.println(nl.item(0).getNodeName());
} catch (Exception e) {
e.printStackTrace();
}
}