User.class
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) {
this.id = id;
this.username = username;
this.nickname = nickname;
this.password = password;
}
public User() {
}
}
IMyService.class
import java.util.List;
import javax.jws.WebParam;
import javax.jws.WebResult;
import javax.jws.WebService;
@WebService
public interface IMyService {
@WebResult(name="addResult")
public int add(@WebParam(name="a")int a, @WebParam(name="b")int b);
@WebResult(name="user")
public User addUser(@WebParam(name="user")User user);
@WebResult(name="user")
public User login(@WebParam(name="username")String username, @WebParam(name="password")String password);
@WebResult(name="user")
public List<User> list(@WebParam(header=true,name="authInfo")String authInfo);
}
MyServiceImpl.class
import java.util.ArrayList;
import java.util.List;
import javax.jws.WebService;
@WebService(endpointInter)
public class MyServiceImpl implements IMyService {
private static List<User> users = new ArrayList<User>();
public MyServiceImpl() {
users.add(new User(1,"admin","管理者","111111"));
}
@Override
public int add(int a, int b) {
System.out.println("a + b = "+(a+b));
return a+b;
}
@Override
public User addUser(User user) {
users.add(user);
return user;
}
@Override
public User login(String username, String password) {
for(User user : users){
if(username.equals(user.getUsername()) && password.equals(user.getPassword())){
return user;
}
}
return null;
}
@Override
public List<User> list(String authInfo) {
System.out.println(authInfo);
return users;
}
}
MyService.class 啟動服務
import javax.xml.ws.Endpoint;
public class MyService {
public static void main(String[] args) {
Endpoint.publish("http://localhost:8989/ms", new MyServiceImpl());
}
}
soap消息的格式
TestSOAP.class soap建立與測試
package com.lzb.test;
import java.io.IOException;
import java.io.StringReader;
import java.io.StringWriter;
import java.net.MalformedURLException;
import java.net.URL;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
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.SOAPHeader;
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.soap.service.User;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
public class TestSOAP {
private String ns = "http://service.soap.org/";
private String wsdlUrl = "http://localhost:8989/ms?wsdl";
// soap消息的分析和消息的建立
@Test
public void test01() {
try {
// 1.建立消息工廠
MessageFactory messageFactory = MessageFactory.newInstance();
// 2.根據消息工廠穿件SoapMessage
SOAPMessage message = messageFactory.createMessage();
// 3.建立SoapPart
SOAPPart soapPart = message.getSOAPPart();
// 4.擷取SOAPEnvelope
SOAPEnvelope soapEnvelope = soapPart.getEnvelope();
// 5.可以通過SOAPEnvelope有效擷取相應的Body和Header等資訊
SOAPBody soapBody = soapEnvelope.getBody();
// 6.根據Qname建立相應的節點(QName就是一個帶有命名空間的節點)-》最後轉化的結果是<ns:add
// xmlns="http://java.lzb.bbb.cn/webservice" />
QName qname = new QName(ns, "add", "ns");
// soapBody.addBodyElement(qname).setValue("565656");
// 如果用以下方進行設定,會将<>轉換成<和>
// soapBody.addBodyElement(qname).setValue("<a>1</a><b>2</b>");
SOAPBodyElement element = soapBody.addBodyElement(qname);
element.addChildElement("a").setValue("33");
element.addChildElement("b").setValue("77");
// 列印消息、
message.writeTo(System.out);
} catch (SOAPException | IOException e) {
e.printStackTrace();
}
}
// soap消息傳遞和處理
@Test
public void test02() {
try {
// 1.建立服務(Service)
URL url = new URL(wsdlUrl);
QName qname = new QName(ns, "MyServiceImplService");
Service service = Service.create(url, qname);
// 2.建立Dispatch
Dispatch<SOAPMessage> dispatch = service.createDispatch(new QName(
ns, "MyServiceImplPort"), SOAPMessage.class,
Service.Mode.MESSAGE);
// 3.建立SOAPMessage
SOAPMessage message = MessageFactory.newInstance().createMessage();
SOAPEnvelope envelope = message.getSOAPPart().getEnvelope();
SOAPBody body = envelope.getBody();
// 4.建立QName來指定消息中傳遞資料
QName ename = new QName(ns, "add", "nn"); // <nn:add xmlns="xx">
SOAPBodyElement element = body.addBodyElement(ename);
element.addChildElement("a").setValue("23");
element.addChildElement("b").setValue("27");
message.writeTo(System.out);
System.out.println("\n invoking ...");
// 5.通過Dispatch傳遞消息
SOAPMessage response = dispatch.invoke(message);
response.writeTo(System.out);
// 将相應消息轉為Dom對象
Document document = response.getSOAPPart().getEnvelope().getBody()
.extractContentAsDocument();
System.out.println(document.getElementsByTagName("addResult")
.item(0).getTextContent());
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (SOAPException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
// 消息傳遞和處理(基于Payload的方式)
@Test
public void test03() {
try {
// 1.建立服務(Service)
URL url = new URL(wsdlUrl);
QName qname = new QName(ns, "MyServiceImplService");
Service service = Service.create(url, qname);
// 2.建立Dispatch(通過中繼資料的方式傳遞)
Dispatch<Source> dispatch = service.createDispatch(new QName(ns,
"MyServiceImplPort"), Source.class, Service.Mode.PAYLOAD);
// 3.根據使用者對象建立相應的XML
User user = new User(3, "abner", "請叫我斌哥", "222222");
JAXBContext ctx = JAXBContext.newInstance(User.class);
Marshaller mar = ctx.createMarshaller();
mar.setProperty(Marshaller.JAXB_FRAGMENT, true);
StringWriter stringWriter = new StringWriter();
mar.marshal(user, stringWriter);
// 4.封裝相應的part addUser
String payload = "<nn:addUser xmlns:nn=\"" + ns + "\">"
+ stringWriter.toString() + "/</nn:addUser>";
System.out.println(payload);
StreamSource streamSource = new StreamSource(new StringReader(
payload));
// 5.通過dispatch傳遞payload
Source response = (Source) dispatch.invoke(streamSource);
// 6.将Source轉化為DOM進行操作,使用tranformer對象轉換
Transformer transformer = TransformerFactory.newInstance()
.newTransformer();
DOMResult domResult = new DOMResult();
transformer.transform(response, domResult);
// 7.處理相應資訊
XPath xPath = XPathFactory.newInstance().newXPath();
NodeList nl = (NodeList) xPath.evaluate("//user",
domResult.getNode(), XPathConstants.NODESET);
User user1 = (User) ctx.createUnmarshaller().unmarshal(nl.item(0));
System.out.println(user1.getNickname());
} 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();
}
}
// SOAP顯示的建立和處理SOAPHeader的資訊
@Test
public void test04() {
try {
// 1.建立服務(Service)
URL url = new URL(wsdlUrl);
QName qname = new QName(ns, "MyServiceImplService");
Service service = Service.create(url, qname);
// 2.建立Dispatch
Dispatch<SOAPMessage> dispatch = service.createDispatch(new QName(
ns, "MyServiceImplPort"), SOAPMessage.class,
Service.Mode.MESSAGE);
// 3.建立SOAPMessage
SOAPMessage message = MessageFactory.newInstance().createMessage();
SOAPEnvelope envelope = message.getSOAPPart().getEnvelope();
SOAPBody body = envelope.getBody();
//3.2 處理header資訊
SOAPHeader header = envelope.getHeader();
if(header == null){
header = envelope.addHeader();
}
QName hqname = new QName(ns, "authInfo", "nn");
header.addChildElement(hqname).setValue("aaaaaa");;
// 4.建立QName來指定消息中傳遞資料
QName ename = new QName(ns, "list", "nn"); // <nn:add xmlns="xx">
body.addBodyElement(ename);
message.writeTo(System.out);
System.out.println("\n invoking ...");
// 5.通過Dispatch傳遞消息
SOAPMessage response = dispatch.invoke(message);
response.writeTo(System.out);
// 将相應消息轉為Dom對象
Document document = response.getSOAPBody().extractContentAsDocument();
NodeList nl = document.getElementsByTagName("user");
JAXBContext ctx = JAXBContext.newInstance(User.class);
for(int i = 0; i < nl.getLength(); i++){
Node n = nl.item(i);
User u = (User)ctx.createUnmarshaller().unmarshal(n);
System.out.println(u.getNickname());
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (SOAPException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (JAXBException e) {
e.printStackTrace();
}
}
}