创建服务器端
1.创建一个接口
IMyService.java
package com.test.service;
import java.util.List;
import javax.jws.WebParam;
import javax.jws.WebResult;
import javax.jws.WebService;
@WebService(targetNamespace = "http://www.webservice.com")
public interface IMyService {
@WebResult(name = "addResult")
public int add(@WebParam(name = "a") int a, @WebParam(name = "b") int b);
}
2.创建实现接口的类
MyServiceImpl.java
package com.test.service;
import java.util.ArrayList;
import java.util.List;
import javax.jws.WebService;
@WebService(endpointInterface = "com.test.service.IMyService", targetNamespace = "http://www.webservice.com")
public class MyServiceImpl implements IMyService {
@Override
public int add(int a, int b) {
return a + b;
}
}
3.开启服务
MyServer.java
package com.test.service;
import javax.xml.ws.Endpoint;
public class MyServer {
public static void main(String[] args) {
String address = "http://localhost:9999/server";
// 发布服务的实现类
Endpoint.publish(address, new MyServiceImpl());
}
}
4.测试类TestSoap.java
(1)SOAP消息的创建
// 通过QName创建SOAP的body消息
@Test
public void test01() {
try {
// 创建消息工厂
MessageFactory factory = MessageFactory.newInstance();
// 根据消息工厂创建SOAPMessage
SOAPMessage message = factory.createMessage();
// 创建SOAPPart
SOAPPart part = message.getSOAPPart();
// 获取SOAPEnvelope
SOAPEnvelope envelope = part.getEnvelope();
// 通过 SOAPEnvelope获取相应的body和header信息
SOAPBody body = envelope.getBody();
// 根据QName创建相应的节点
QName qname = new QName("http://www.webservice.com", "add", "ns");
SOAPBodyElement element = body.addBodyElement(qname);
element.addChildElement("a").setValue("12");
element.addChildElement("b").setValue("13");
// 打印消息信息
message.writeTo(System.out);
} catch (SOAPException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
运行结果:
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"><SOAP-ENV:Header/><SOAP-ENV:Body><ns:add xmlns:ns="http://www.webservice.com"><a>12</a><b>13</b></ns:add></SOAP-ENV:Body></SOAP-ENV:Envelope>
(2)SOAP消息的创建(基于MESSAGE的方式)
// 基于MESSAGE的方式传递消息
@Test
public void test02() {
try {
// 创建服务
URL url = new URL("http://localhost:9999/server");
QName qname = new QName("http://www.webservice.com", "MyServiceImplService");
Service service = Service.create(url, qname);
// 创建Dispatch
Dispatch<SOAPMessage> dispatch = service.createDispatch(new QName("http://www.webservice.com", "MyServiceImplPort"), SOAPMessage.class, Service.Mode.MESSAGE);
// 创建SOAP的body消息
SOAPMessage message = MessageFactory.newInstance().createMessage();
SOAPBody body = message.getSOAPPart().getEnvelope().getBody();
// 根据QName创建相应的节点
QName ename = new QName("http://www.webservice.com", "add", "ns");
SOAPBodyElement element = body.addBodyElement(ename);
element.addChildElement("a").setValue("12");
element.addChildElement("b").setValue("13");
message.writeTo(System.out);
System.out.println("\n invoking...");
// 通过dispatch传递消息,返回响应消息
SOAPMessage response = dispatch.invoke(message);
response.writeTo(System.out);
System.out.println();
// 将响应的消息转换为dom对象
Document doc = response.getSOAPPart().getEnvelope().getBody().extractContentAsDocument();
System.out.println(doc.getElementsByTagName("addResult").item(0).getTextContent());
} catch (SOAPException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
运行结果:
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"><SOAP-ENV:Header/><SOAP-ENV:Body><ns:add xmlns:ns="http://www.webservice.com"><a>12</a><b>13</b></ns:add></SOAP-ENV:Body></SOAP-ENV:Envelope>
invoking...
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"><S:Header/><S:Body><ns2:addResponse xmlns:ns2="http://www.webservice.com"><addResult>25</addResult></ns2:addResponse></S:Body></S:Envelope>
25
(3)SOAP消息的创建(基于PAYLOAD的方式)
修改服务器端
第一步,添加实体类:User.java
package com.test.service;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement
public class User {
private int id;
private String username;
private String nickname;
private String password;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getNickname() {
return nickname;
}
public void setNickname(String nickname) {
this.nickname = nickname;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public User(int id, String username, String nickname, String password) {
super();
this.id = id;
this.username = username;
this.nickname = nickname;
this.password = password;
}
public User() {
super();
}
}
第二步,接口中添加addUser方法
IMyService.java
@WebResult(name = "user")
public User addUser(@WebParam(name = "user") User user);
MyServiceImpl.java
private static List<User> users = new ArrayList<User>();
public MyServiceImpl() {
users.add(new User(1, "admin", "管理员", "111111"));
}
@Override
public User addUser(User user) {
users.add(user);
return user;
}
测试类
// 基于PAYLOAD的方式传递消息
@Test
public void test03() {
try {
// 创建服务
URL url = new URL("http://localhost:9999/server");
QName qname = new QName("http://www.webservice.com", "MyServiceImplService");
Service service = Service.create(url, qname);
// 创建Dispatch(通过源数据的方式传递)
Dispatch<Source> dispatch = service.createDispatch(new QName("http://www.webservice.com", "MyServiceImplPort"), Source.class, Service.Mode.PAYLOAD);
// 根据用户对象创建响应的xml
User user = new User(1, "张三", "zs", "123");
JAXBContext ctx = JAXBContext.newInstance(User.class);
Marshaller marshaller = ctx.createMarshaller();
// 设置去掉xml的头信息
marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true);
StringWriter writer = new StringWriter();
marshaller.marshal(user, writer);
// 封装相应的part(addUser)
String payload = "<ns:addUser xmlns:ns='http://www.webservice.com'>" + writer.toString() + "</ns:addUser>";
StreamSource ss = new StreamSource(new StringReader(payload));
// 通过dispatch传递payload
Source response = dispatch.invoke(ss);
// 使用Transformer对象,将Source转化为DOM进行操作
Transformer transformer = TransformerFactory.newInstance().newTransformer();
DOMResult result = new DOMResult();
transformer.transform(response, result);
// 通过xpath模型处理响应信息
XPath xpath = XPathFactory.newInstance().newXPath();
NodeList list = (NodeList) xpath.evaluate("//user", result.getNode(), XPathConstants.NODESET);
User user2 = (User) ctx.createUnmarshaller().unmarshal(list.item(0));
System.out.println(user2.getUsername());
} catch (IOException 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();
}
}
运行结果:
张三