相关文章推荐
慈祥的课本  ·  智慧环境项目·  6 月前    · 
正直的洋葱  ·  联系我们·  11 月前    · 
SOAPBody body = envelope.getBody(); // 根据QName创建相应的节点(QName就是一个带有命名空间的节点: ) QName qname = new QName("http://webservice.xilen.com", "add", "ns"); //通过soapBody传入QName添加body元素 SOAPBodyElement bodyElement = body.addBodyElement(qname); // 对body添加子元素 (或者直接对body元素设置值:bodyElement.setValue("5"); ) SOAPElement childElement = bodyElement.addChildElement("a"); // 对body子元素设置值 childElement.setValue("7"); // 继续添加第二个子元素 (或者继续对子元素添加子元素:childElement.addChildElement("acn").setValue("acv");) bodyElement.addChildElement("b").setValue("5"); // 打印最终得到的Soap消息 message.writeTo(System.out); 得到的Soap消息如下:
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
	<SOAP-ENV:Header/>
	<SOAP-ENV:Body>
		<ns:add xmlns:ns="http://webservice.xilen.com">
			<a>7</a>
			<b>5</b>
		</ns:add>
	</SOAP-ENV:Body>
</SOAP-ENV:Envelope>

二、发送Soap消息

1、基于MESSAGE的方式

代码示例如下:

	@Test
	public void sendSoapByMessage() throws Exception{
		 *  定义相关变量(wsdl文档的路径、接口的命名空间、实现的命名空间)
		String wsdlUrl = "http://localhost:8888/user?wsdl";
		String implNS = "http://impl.soap.xilen.com/";
		String inteNS = "http://soap.xilen.com/";
		 *  创建服务
		URL url = new URL(wsdlUrl);
		// 通过wsdl实现部分的命名空间创建服务的QNane,因为Service的描述在实现部分的命名空间中(详见 六、附录 中的截图)
		QName serviceQname = new QName(implNS, "UserServiceImplService");
		Service service = Service.create(url, serviceQname);
		 *  创建Dispatch (通过SOAPMessage传递) 
		Dispatch<SOAPMessage> dispatch =
				// portName:wsdl文件中Service节点中的prot的name属性值的QName; type:消息类型; mode:消息传递的类型(message|payLoad)
				service.createDispatch(new QName(implNS, "UserServiceImplPort"), SOAPMessage.class, Service.Mode.MESSAGE);
		 *  创建SoapMessage
		SOAPMessage message = MessageFactory.newInstance().createMessage();
		SOAPEnvelope envelope =  message.getSOAPPart().getEnvelope();
		SOAPBody body = envelope.getBody();
		// 通过wsdl接口部分的命名空间创建消息的QNane,因为Message的描述在接口部分的命名空间中<span style="font-family: Arial, Helvetica, sans-serif;">(详见 六、附录 中的截图)</span>
		QName soapQname = new QName(inteNS, "login", "ns");
		SOAPBodyElement bodyElement = body.addBodyElement(soapQname);
		bodyElement.addChildElement("name").setValue("admin");
		bodyElement.addChildElement("pass").setValue("12345");
		 *  输出即将发送的Soap消息
		message.writeTo(System.out);
		System.out.println("-------------------------- out 分隔线 in ----------------------------------");
		 * 通过dispatch传递消息
		SOAPMessage responseMessage = dispatch.invoke(message);
		 *  输出返回的Soap消息
		responseMessage.writeTo(System.out);
		 *  处理返回的Soap消息得到需要的信息
		String result = responseMessage.getSOAPBody().getElementsByTagName("loginResult").item(0).getTextContent();
		// 或者采用如下方式得到需要的信息
		    // String result = responseMessage.getSOAPPart().getEnvelope().getBody().extractContentAsDocument().
			//	  getElementsByTagName("addResult").item(0).getTextContent();
		 * 输出通过返回Soap消息得到的信息
		System.out.println("return-->" + result);
        Soap消息如下: 
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
	<SOAP-ENV:Header/>
	<SOAP-ENV:Body>
		<ns:login xmlns:ns="http://soap.xilen.com/">
			<name>admin</name>
			<pass>12345</pass>
		</ns:login>
	</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
<!-------------------------- out 分隔线 in ---------------------------------->
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
	<S:Header/>
	<S:Body>
		<ns2:loginResponse xmlns:ns2="http://soap.xilen.com/">
			<loginResult>admin, welcome!</loginResult>
		</ns2:loginResponse>
	</S:Body>
</S:Envelope>
    2、基于PAYLOAD的方式

        代码示例如下:

@Test
	public void sendSoapByPayload() throws Exception{
		 *  定义相关变量(wsdl文档的路径、接口的命名空间、实现的命名空间)
		String wsdlUrl = "http://localhost:8888/user?wsdl";
		String implNS = "http://impl.soap.xilen.com/";
		String inteNS = "http://soap.xilen.com/";
		 * 创建服务
		URL url = new URL(wsdlUrl);
		// 通过wsdl实现部分的命名空间创建服务的QNane,因为Service的描述在实现部分的命名空间中
		QName serviceQname = new QName(implNS, "UserServiceImplService");
		Service service = Service.create(url, serviceQname);
		 * 创建Dispatch (通过Source传递)                    
		Dispatch<Source> dispatch =
				// portName:wsdl文件中Service节点中的prot的name属性值的QName; type:消息类型; mode:消息传递的类型(message|payLoad)
				service.createDispatch(new QName(implNS, "UserServiceImplPort"), Source.class, Service.Mode.PAYLOAD);
		 * 根据对象通过JAXB创建XML
		User user = new User(1L, "TestName", "TestPass");
		JAXBContext context = JAXBContext.newInstance(User.class);
		Marshaller marshaller = context.createMarshaller();
		// 取消xml的文档头和尾
		marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true);  
		StringWriter writer = new StringWriter();
		marshaller.marshal(user, writer);
		 * 组建soap的xml
		String payload = "<ns:register xmlns:ns=\"" + inteNS + "\">" + writer.toString() + "</ns:register>";
		System.out.println(payload);
		 * 创建Source
		Source outSource = new StreamSource(new StringReader(payload));
		 * 通过dispatch传递负载(payLoad)
		Source inSource = dispatch.invoke(outSource);
		 * 将响应的Source转化为DOM进行操作获取需要的信息 (使用Transform对象转换)
		Transformer transformer = TransformerFactory.newInstance().newTransformer();
		DOMResult result = new DOMResult();
		transformer.transform(inSource, result);
		// 使用xpath查询
		XPath path = XPathFactory.newInstance().newXPath();
		NodeList nl = (NodeList) path.evaluate("//registerResult", result.getNode(), XPathConstants.NODESET);
		// 打印需要被获取的信息
		System.out.println(nl.item(0).getTextContent());
        组建的Soap内容如下: 
<ns:register xmlns:ns="http://soap.xilen.com/">
		<id>1</id>
		<name>TestName</name>
		<pass>TestPass</pass>
	</user>
</ns:register>

三、列表响应处理

	@Test
	public void returnList() throws Exception{
		 *  定义相关变量(wsdl文档的路径、接口的命名空间、实现的命名空间)
		String wsdlUrl = "http://localhost:8888/user?wsdl";
		String implNS = "http://impl.soap.xilen.com/";
		String inteNS = "http://soap.xilen.com/";
		 *  创建服务
		URL url = new URL(wsdlUrl);
		// 通过wsdl实现部分的命名空间创建服务的QNane,因为Service的描述在实现部分的命名空间中
		QName serviceQname = new QName(implNS, "UserServiceImplService");
		Service service = Service.create(url, serviceQname);
		 *  创建Dispatch 
		Dispatch<SOAPMessage> dispatch =
				//      portName:wsdl文件中Service节点中的prot的name属性值的QName   type:消息类型         mode:消息传递的类型(message | payLoad)
				service.createDispatch(new QName(implNS, "UserServiceImplPort"), SOAPMessage.class, Service.Mode.MESSAGE);
		 * 创建SoapMessage
		SOAPMessage message = MessageFactory.newInstance().createMessage();
		SOAPEnvelope envelope =  message.getSOAPPart().getEnvelope();
		SOAPBody body = envelope.getBody();
		QName soapQname = new QName(inteNS, "list", "ns");
		SOAPBodyElement bodyElement = body.addBodyElement(soapQname);
		 * 通过dispatch传递消息
		SOAPMessage responseMessage = dispatch.invoke(message);
		// 转换body为document
		NodeList nodeList =  responseMessage.getSOAPPart().getEnvelope().getBody().
				extractContentAsDocument().getElementsByTagName("user"); 
		JAXBContext ctx = JAXBContext.newInstance(User.class);
		// Jaxb转换Node为User
		for (int i = 0; i < nodeList.getLength(); i++) {
			User u = (User) ctx.createUnmarshaller().unmarshal(nodeList.item(i));
			System.out.println(u);
四、显示配置Header 

    示例代码如下:

	@Test
	public void sendSoapAddHeader() throws Exception{
		 *  定义相关变量(wsdl文档的路径、接口的命名空间、实现的命名空间)
		String wsdlUrl = "http://localhost:8888/user?wsdl";
		String implNS = "http://impl.soap.xilen.com/";
		String inteNS = "http://soap.xilen.com/";
		 *  创建服务
		URL url = new URL(wsdlUrl);
		QName serviceQname = new QName(implNS, "UserServiceImplService");
		Service service = Service.create(url, serviceQname);
		 *  创建Dispatch 
		Dispatch<SOAPMessage> dispatch =
				service.createDispatch(new QName(implNS, "UserServiceImplPort"), SOAPMessage.class, Service.Mode.MESSAGE);
		 * 创建SoapMessage
		SOAPMessage message = MessageFactory.newInstance().createMessage();
		SOAPEnvelope envelope =  message.getSOAPPart().getEnvelope();
		SOAPBody body = envelope.getBody();
		QName soapQname = new QName("http://soap.xilen.com/", "check", "ns");
		body.addBodyElement(soapQname);
		 * 添加Header
		SOAPHeader header = envelope.getHeader();
		// 判断是否有Header,没有则添加
		if(header == null){
			header = envelope.addHeader();
		// 添加Header的内容
		QName headerQName = new QName("http://soap.xilen.com/", "name", "nn");
		SOAPHeaderElement headerElement = header.addHeaderElement(headerQName);
		headerElement.setValue("admin");
		header.addHeaderElement(new QName("http://soap.xilen.com/", "pass", "nn")).setValue("12345");
		message.writeTo(System.out);
		 * 通过dispatch传递消息
		SOAPMessage responseMessage = dispatch.invoke(message);
		 * 处理响应
		NodeList nodeList =  responseMessage.getSOAPPart().getEnvelope().getBody().
				extractContentAsDocument().getElementsByTagName("user");
		JAXBContext ctx = JAXBContext.newInstance(User.class);
		System.out.println("\n" + (User) ctx.createUnmarshaller().unmarshal(nodeList.item(0)));
    发送的Soap如下: 
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
	<SOAP-ENV:Header>
		<nn:name xmlns:nn="http://soap.xilen.com/">admin</nn:name>
		<nn:pass xmlns:nn="http://soap.xilen.com/">12345</nn:pass>
	</SOAP-ENV:Header>
	<SOAP-ENV:Body>
		<ns:check xmlns:ns="http://soap.xilen.com/" />
	</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
五、服务端抛出异常
	@Test
	public void throwsException() throws Exception{
		 *  定义相关变量(wsdl文档的路径、接口的命名空间、实现的命名空间)
		String wsdlUrl = "http://localhost:8888/user?wsdl";
		String implNS = "http://impl.soap.xilen.com/";
		String inteNS = "http://soap.xilen.com/";
		 *  创建服务
		URL url = new URL(wsdlUrl);
		QName serviceQname = new QName(implNS, "UserServiceImplService");
		Service service = Service.create(url, serviceQname);
		 *  创建Dispatch 
		Dispatch<SOAPMessage> dispatch =
				service.createDispatch(new QName(implNS, "UserServiceImplPort"), SOAPMessage.class, Service.Mode.MESSAGE);
		 * 创建SoapMessage
		SOAPMessage message = MessageFactory.newInstance().createMessage();
		SOAPEnvelope envelope =  message.getSOAPPart().getEnvelope();
		SOAPBody body = envelope.getBody();
		QName soapQname = new QName(inteNS, "throwsException", "ns");
		body.addBodyElement(soapQname);
		 * try异常
		try {
			dispatch.invoke(message);
		} catch (Exception e) {
			System.out.println(e.getMessage());

    1、WSDL概略图:

    2、服务端代码如下:

import java.util.List;
import javax.jws.WebParam;
import javax.jws.WebResult;
import javax.jws.WebService;
import com.xilen.entity.User;
@WebService
public interface UserService {
	 * 通过注解@WebParam对入参设置别名
	 * 通过注解@WebResult对出参设置别名
	@WebResult(name="loginResult")
	public String login(@WebParam(name="name") String name, @WebParam(name="pass") String pass);
	@WebResult(name="registerResult")
	public String register(@WebParam(name="user") User user);
	@WebResult(name="user")
	public List<User> list(); 
	 * 通过注解@WebParam的header属性设置入参为显示的Header
	@WebResult(name="user")
	public User check(@WebParam(name="name",header=true) String name, @WebParam(name="pass",header=true) String pass);
	public void throwsException() throws Exception;
import java.util.ArrayList;
import java.util.List;
import javax.jws.WebService;
import com.xilen.entity.User;
import com.xilen.soap.UserService;
@WebService(endpointInterface = "com.xilen.soap.UserService", serviceName = "UserServiceImplService")
public class UserServiceImpl implements UserService {
	@Override
	public String login(String name, String pass) {
		System.out.println("login info : [name=" + name + ", pass=" + pass
				+ "]");
		return name + ", welcome!";
	@Override
	public String register(User user) {
		System.out.println(user);
		return user.getName() + ", registered!";
	@Override
	public List<User> list() {
		List<User> list = new ArrayList<User>();
		list.add(new User(1L, "admin", "12345"));
		list.add(new User(2L, "super", "54321"));
		return list;
	@Override
	public User check(String name, String pass) {
		System.out.println(name + "--->" + pass);
		return new User(1L, "admin", "12345");
	@Override
	public void throwsException() throws Exception {
		throw new Exception("用户不存在!");
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement
public class User {
	private Long id;
	private String name;
	private String pass;
	public User() {
	public User(Long id, String name, String pass) {
		super();
		this.id = id;
		this.name = name;
		this.pass = pass;
	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 getPass() {
		return pass;
	public void setPass(String pass) {
		this.pass = pass;
	@Override
	public String toString() {
		return "User [id=" + id + ", name=" + name + ", pass=" + pass + "]";
import javax.xml.ws.Endpoint;
import com.xilen.soap.impl.UserServiceImpl;
public class StartMain {
	public static void main(String[] args) {
		Endpoint.publish("http://localhost:8888/user", new UserServiceImpl());

    http://download.csdn.net/detail/u013379717/7453709 
 
 
 

一、创建Soap // 创建消息工厂 MessageFactory factory = MessageFactory.newInstance(); // 通过工厂创建Soap的消息 SOAPMessage message = factory.createMessage(); // 获取SoapPart SOAPPart part = message.getSO
JAX-WS规范是一组XML web services的JAVA API,在 JAX-WS中,一个远程调用可以转换为一个基于XML的协议例如SOAP,在使用JAX-WS过程中,开发者不需要编写任何生成和处理SOAP消息的代码。JAX-WS的运行时实现会将这些API的调用转换成为对应的SOAP消息。  JAX-WS 也提供了一组针对底层消息进行操作的API调用,你可以通过Dispatc
本文中显示的Web服务已在此处实时部署 。 有多种创建Web服务的方法。 在本文中,我们将使用JAX-WS创建基于SOAP的Web服务,该服务是XML Web Services的Java API,并将其部署在Tomcat下。 要记住的重要一点是,可以使用JAX-WS构建SOAP和REST样式的Web服务。 有一个常见的误解,即JAX-WS用于创建基于SOAP的Web服务,而JAX-R...
SOAP处理程序是SOAP消息拦截器,它能够拦截传入或传出的SOAP消息并操纵其值。 例如,在客户端附加一个SOAP处理程序,它将为客户端发送的每个传出SOAP消息将客户端的计算机MAC地址注入SOAP标头块。 在服务器端,附加另一个SOAP处理程序,以从每个传入的SOAP消息中检索回SOAP标头块中的客户端MAC地址。 这样服务器端就可以确定允许哪台计算机访问已发布的服务。 本文分为三个部...
Web服务的基础之一是互操作性。 这意味着Web服务以标准格式发送和接收消息。 通常,该格式是SOAP。 有很多发送SOAP消息的方法。 最基本的是对URL流执行println ,但这要求您对SOAP协议以及服务期望并发送的SOAP消息了解得太多。 没有简单的方法可以从服务中获取此信息,并且这种方法的可伸缩性不是很高。 加强使用SAAJ API(带有Java附件的SOAP)。 SAAJ...
每当在Spring中使用JAX-WS时,您可能都希望记录传入和传出的SOAP消息-如果仅用于开发过程中的调试。 因此,第一件事就是增加日志级别,对吗? 不幸的是,这将无效。 您将要做的是利用javax.xml.ws.handler.HandlerResolver接口。 那么我们该怎么做呢? 首先,您将要创建一个实现HandlerResolver接口的类。 这是一个非常基本的类,将用于控制...
@WebMethod(operationName = "Login", action = "urn:Login") @WebResult(targetNamespace = "http://axis2.anti.favite.com") @RequestWrapper(localName = "Login", targetNamespace = "http://axis2.a
如何将命名空间添加到soap Envelope中去,并在soap body中引用。 我用WSDL2jiava工具生成代码,发送的soap消息如下:<?xml version="1.0" encoding="UTF-8"?> <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="h
这是JAX-WS SOAP处理程序的第2部分。 在上一篇文章– JAX-WS:服务器端的SOAP处理程序中 ,您为每个传入的SOAP消息创建了一个Web服务并附加了一个处理程序以在标头块中检索客户端MAC地址。 客户端中的SOAP处理程序 在本文中,您将开发一个Web服务客户端,以访问上一篇文章中发布的服务,并为每个客户端发送的每个传出SOAP消息附加一个处理程序,以将客户端的MAC地址...
您可以按照以下步骤将JAX-WS接口替换为JAX-RS接口: 1. 创建JAX-RS接口:创建一个新的Java接口来定义您的JAX-RS服务。在接口上使用`@Path`注解指定资源的URL路径。 ```java import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.Produces; import javax.ws.rs.core.MediaType; @Path("/your-resource") public interface YourResource { @Produces(MediaType.APPLICATION_JSON) String getResource(); 2. 实现JAX-RS接口:创建一个类来实现您的JAX-RS接口,并实现接口中定义的方法。 ```java public class YourResourceImpl implements YourResource { @Override public String getResource() { // 实现您的业务逻辑 return "Hello JAX-RS!"; 3. 注册JAX-RS服务:将您的JAX-RS服务注册到应用程序中。这可以通过创建一个`javax.ws.rs.core.Application`子类并在其中注册资源类来完成。 ```java import javax.ws.rs.ApplicationPath; import javax.ws.rs.core.Application; import java.util.HashSet; import java.util.Set; @ApplicationPath("/api") public class YourApplication extends Application { @Override public Set<Class<?>> getClasses() { Set<Class<?>> classes = new HashSet<>(); classes.add(YourResourceImpl.class); return classes; 4. 配置JAX-RS:根据您使用的应用程序服务器,将JAX-RS的实现(如Jersey或RestEasy)添加到您的应用程序的构建配置文件中。您还需要确保在应用程序服务器上正确配置JAX-RS。 5. 测试JAX-RS接口:启动您的应用程序服务器,并使用JAX-RS客户端或浏览器等工具测试您的JAX-RS接口。 请注意,以上步骤是一般的指导,具体步骤可能因您使用的框架和工具而有所不同。
BEGIN --检索先前插入的 LOB 定位器 SELECT lob_content INTO lob_object FROM lob_demo WHERE lob_id =100; offset1 := 1; read_amount := 200; DBMS_LOB.READ(lob_object, read_amount, offset1, content_str); IF read_amount = 200 THEN ----如果实际读了200个字符,更新偏移量,继续尝试读取. DBMS_OUTPUT.PUT_LINE(content_str); offset1 := offset1 + read_amount; DBMS_LOB.READ(lob_object, read_amount, offset1, content_str); DBMS_OUTPUT.PUT_LINE(content_str); ELSE --如果实际没读够200个,则表示已经读取完了 DBMS_OUTPUT.PUT_LINE(content_str); END IF; [/code] Oracle - LOB(大对象数据类型) Jianbagengmu: 正确sql01 [code=sql] -- 创建 drop table lob_demo; create table lob_demo (lob_id int, lob_content clob); set SERVEROUTPUT ON select * from lob_demo; -- 写入 DECLARE lob_object CLOB; amount BINARY_INTEGER; offset INTEGER; content_str VARCHAR2(100); BEGIN --插入一行新的记录来创建一个新的 LOB 定位器(没有指向数据库实际存储位置的 LOB 不能被写入) INSERT INTO lob_demo (lob_id, lob_content) VALUES (100, EMPTY_CLOB()); --检索出上面创建的 LOB 的定位器(更新 LOB 必须要用 for update 锁定) SELECT lob_content INTO lob_object FROM lob_demo WHERE lob_id=100 for update; content_str := 'Follow I-75 across the Mackinac Bridge.'; amount := LENGTH(content_str); -- 要写入的字符数 offset := 1; -- LOB 中开始写入的位置 DBMS_LOB.OPEN(lob_object, DBMS_LOB.LOB_READWRITE); -- 打开 LOB(不是严格必须的) DBMS_LOB.WRITE(lob_object, amount, offset, content_str); -- 开始写入 DBMS_LOB.CLOSE(lob_object); -- 关闭 [/code] Win10 - 使用‘Alt+Tab’不能切换窗口及更改切换风格 Blake Hong: 我也找不到