`
smartzxy
  • 浏览: 196358 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

一个JAXM小实验:实现SOAP信息的收发

    博客分类:
  • java
阅读更多

       之前因为一时没找到实现JAXM服务端的教程,只能放下了对它的学习,转向了JAX-WS。但现在又必须要用到了,于是下狠心一定要从谷歌的“资料库”里找到个解决办法来。还好,谷歌没让我失望:原来实现一个服务端很简单,写个servlet即可。

       这里罗列两个给我提供最大帮助的链接: Working with SOAP Messages 《深入探索SOAP1.1--使用SAAJ1.2.1》

       我的开发环境是JDK1.6U7、JEE5(主要用到了它的jaxm-api包)、eclipse3.4 jee版、Tomcat6。

       首先建立服务器端的servlet。在eclipse里新建一个dynamic web project(可能其它类型的也可以),再新建一个servlet,我取名ReceiveServlet,继承javax.xml.messaging.JAXMServlet,实现接口javax.xml.messaging.ReqRespListener,具体代码如下:

import java.io.File;
import java.io.FileOutputStream;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.xml.messaging.JAXMServlet;
import javax.xml.messaging.ReqRespListener;
import javax.xml.soap.MessageFactory;
import javax.xml.soap.SOAPEnvelope;
import javax.xml.soap.SOAPMessage;

/**
 * Servlet implementation class ReceiveServlet
 */
public class ReceiveServlet extends JAXMServlet implements ReqRespListener {
	private static final long serialVersionUID = 1L;
	static MessageFactory mf = null;
	// create a messagefactory
	static {
		try {
			mf = MessageFactory.newInstance();
		} catch (Exception e) {
			e.printStackTrace();
		}
	};

	/**
	 * @see JAXMServlet#JAXMServlet()
	 */
	public ReceiveServlet() {
		super();

	}

	/**
	 * @see ReqRespListener#onMessage(SOAPMessage)
	 */
	public SOAPMessage onMessage(SOAPMessage msg) {
		SOAPMessage resp = null;
		try {
			System.out.println("Received message:");
			msg.writeTo(new FileOutputStream(new File(
					"../webapps/soapmessage.xml")));// I use tomcat so set this
													// directory

			// create a response message
			resp = mf.createMessage();
			SOAPEnvelope se = resp.getSOAPPart().getEnvelope();
			se.getBody().addChildElement(se.createName("ResponseMessage"))
					.addTextNode("Received Message,Thanks");

			return resp;
		} catch (Exception e) {
			e.printStackTrace();
		}

		return resp;
	}

	/**
	 * @see Servlet#init(ServletConfig)
	 */
	public void init(ServletConfig config) throws ServletException {

		super.init(config);
	}

}

  右击工程名,export->war,即完成了servlet的打包,我还将jaxm-api包塞到了war文件的lib目录里,也不知有没有用,没试过。发布这个war文件。这时在浏览器的地址栏里输入调用这个servlet的url会报错:

HTTP Status 405 - HTTP method GET is not supported by this URL

这就说明部署成功了,因为这个servlet用的不是HTTP协议,无法那样调用。

        现在建立客户端,也就是SOAP发送方。随便找个工程(刚才的也行),新建一个含main方法的类,具体代码如下:

import java.io.IOException;
import java.net.URL;

import javax.xml.messaging.URLEndpoint;
import javax.xml.soap.*;

public class SOAPSender {

	/**
	 * @param args
	 * @throws SOAPException
	 * @throws IOException
	 */
	public static void main(String[] args) throws IOException, SOAPException {
		SOAPSender sender = new SOAPSender();
		SOAPMessage message = sender.getMessage();
		sender.send(message);

	}

	public void send(SOAPMessage message) throws IOException, SOAPException {
		// Create SOAP connection
		SOAPConnectionFactory scf = SOAPConnectionFactory.newInstance();
		SOAPConnection sc = scf.createConnection();

		// Most article use this sentence which list below to specify the
		// endpoint, but I got error when I ran it.
		// URLEndpoint urlEndpoint = new URLEndpoint(
		// "http://localhost:8080/SOAP/ReceiveServlet");

		// Specify the endpoint
		URL url = new URL("http://localhost:8080/SOAP/ReceiveServlet");

		// Send the SOAP message
		SOAPMessage response = sc.call(message, url);

		if (response != null) {
			// Print the message to console
			System.out.println("Receive SOAP message from localhost:");
			response.writeTo(System.out);
		} else {
			System.err.println("No response received from partner!");
		}

		sc.close();

	}

	public SOAPMessage getMessage() throws SOAPException {

		// Create a message factory
		MessageFactory mf = MessageFactory.newInstance();
		// Create a SOAP message
		SOAPMessage message = mf.createMessage();

		SOAPEnvelope envelope = message.getSOAPPart().getEnvelope();
		// Add a namespace declaration to envelope element
		envelope.addNamespaceDeclaration("cwmp", "some uri");

		// Create header element
		SOAPHeader header = envelope.getHeader();

		// Create body element
		SOAPBody body = envelope.getBody();
		SOAPBodyElement bodyElement = body.addBodyElement(envelope.createName(
				"Test", "cwmp", "uri"));
		// add content to Test element
		bodyElement.addTextNode("Just a test! ");

		try {
			// Print the message we have created above to console
			message.writeTo(System.out);
		} catch (IOException e) {

			e.printStackTrace();
		}
		return message;
	}

}

        现在可以执行这个客户端,console会先显示我们准备发送的message,然后会显示我们从服务器接收到的回复message;在Tomcat的安装目录下的webapps目录下,会找到我们发送给服务器的message。至此,我的这个JAXM小实验就完成了!

  • SOAP.war (23.5 KB)
  • 描述: 我生成的war文件
  • 下载次数: 178
5
2
分享到:
评论
4 楼 jelver 2009-12-09  
非常感谢你的资料,有空交流
3 楼 keevinliang 2009-03-02  
smartzxy 写道

keevinliang 写道
请问一下为什么执行客户端client是返回:Exception in thread "main" javax.xml.soap.SOAPException: (500)Internal Server Errorat org.apache.axis.soap.SOAPConnectionImpl.call(SOAPConnectionImpl.java:95)at com.SOAPSender.send(SOAPSender.java:37)at com.SOAPSender.main(SOAPSender.java:19)Caused by: (500)Internal Server Errorat org.apache.axis.transport.http.HTTPSender.readFromSocket(HTTPSender.java:663)at org.apache.axis.transport.http.HTTPSender.invoke(HTTPSender.java:94)at org.apache.axis.strategies.InvocationStrategy.visit(InvocationStrategy.java:32)at org.apache.axis.SimpleChain.doVisiting(SimpleChain.java:118)at org.apache.axis.SimpleChain.invoke(SimpleChain.java:83)at org.apache.axis.client.AxisClient.invoke(AxisClient.java:147)at org.apache.axis.client.Call.invokeEngine(Call.java:2719)at org.apache.axis.client.Call.invoke(Call.java:2702)at org.apache.axis.client.Call.invoke(Call.java:1816)at org.apache.axis.soap.SOAPConnectionImpl.call(SOAPConnectionImpl.java:90)... 2 more没遇到过哦,记得我当时还没用到Axis框架啊~但是看到异常里提示“服务器内部错误”,建议查看下服务器和服务的部署是否有问题。

能不能把你的工程打包发给我看看。我到邮箱:keevinliang@sina.com,谢谢!
2 楼 smartzxy 2009-02-28  
keevinliang 写道

请问一下为什么执行客户端client是返回:
Exception in thread "main" javax.xml.soap.SOAPException: (500)Internal Server Error
at org.apache.axis.soap.SOAPConnectionImpl.call(SOAPConnectionImpl.java:95)
at com.SOAPSender.send(SOAPSender.java:37)
at com.SOAPSender.main(SOAPSender.java:19)
Caused by: (500)Internal Server Error
at org.apache.axis.transport.http.HTTPSender.readFromSocket(HTTPSender.java:663)
at org.apache.axis.transport.http.HTTPSender.invoke(HTTPSender.java:94)
at org.apache.axis.strategies.InvocationStrategy.visit(InvocationStrategy.java:32)
at org.apache.axis.SimpleChain.doVisiting(SimpleChain.java:118)
at org.apache.axis.SimpleChain.invoke(SimpleChain.java:83)
at org.apache.axis.client.AxisClient.invoke(AxisClient.java:147)
at org.apache.axis.client.Call.invokeEngine(Call.java:2719)
at org.apache.axis.client.Call.invoke(Call.java:2702)
at org.apache.axis.client.Call.invoke(Call.java:1816)
at org.apache.axis.soap.SOAPConnectionImpl.call(SOAPConnectionImpl.java:90)
... 2 more


没遇到过哦,记得我当时还没用到Axis框架啊~
但是看到异常里提示“服务器内部错误”,建议查看下服务器和服务的部署是否有问题。
1 楼 keevinliang 2009-02-24  
请问一下为什么执行客户端client是返回:
Exception in thread "main" javax.xml.soap.SOAPException: (500)Internal Server Error
at org.apache.axis.soap.SOAPConnectionImpl.call(SOAPConnectionImpl.java:95)
at com.SOAPSender.send(SOAPSender.java:37)
at com.SOAPSender.main(SOAPSender.java:19)
Caused by: (500)Internal Server Error
at org.apache.axis.transport.http.HTTPSender.readFromSocket(HTTPSender.java:663)
at org.apache.axis.transport.http.HTTPSender.invoke(HTTPSender.java:94)
at org.apache.axis.strategies.InvocationStrategy.visit(InvocationStrategy.java:32)
at org.apache.axis.SimpleChain.doVisiting(SimpleChain.java:118)
at org.apache.axis.SimpleChain.invoke(SimpleChain.java:83)
at org.apache.axis.client.AxisClient.invoke(AxisClient.java:147)
at org.apache.axis.client.Call.invokeEngine(Call.java:2719)
at org.apache.axis.client.Call.invoke(Call.java:2702)
at org.apache.axis.client.Call.invoke(Call.java:1816)
at org.apache.axis.soap.SOAPConnectionImpl.call(SOAPConnectionImpl.java:90)
... 2 more

相关推荐

    使用SAAJ 和JAXM的 SOAP客户端及服务

    使用SAAJ 和JAXM的 SOAP客户端及服务--学习文档

    Java SOAP协议

    本文主要是探讨SAAJ(SOAP with Attachment API for Java),JAXM(Java API for XML Messaging),了解SOAP在j2ee开发中的作用与其接口。JAXM和SAAJ均支持针对B2B和Web服务应用程序、基于XML的消息交换,支持诸多行业...

    jaxm-1_1_2.zip

    jaxm-1_1_2.zip是java的IAP,但是我们安装的JDK版本的API里面查不到这个包,提供给需要的同学!

    简述JAXM构建Web服务及应用

    JAXM(Java API for XML Messaging简称JAXM)是为Java平台上的应用程序定义... 完整的JAXM API存在于javax.xml.soap和javax.xml.messaging二个包中。javax.xml.soap是用于接发SOAP消息的基本包,主要包含了发送带有附

    通信与网络中的简述JAXM构建Web服务及应用

    JAXM(Java API for XML Messaging简称JAXM)是为Java平台上的应用程序定义... 完整的JAXM API存在于javax.xml.soap和javax.xml.messaging二个包中。javax.xml.soap是用于接发SOAP消息的基本包,主要包含了发送带有附

    jaxm-api.jar

    这个包很难找啊,没什么资源,用于XML流处理信息的

    基于JAXM构建Web服务及应用

    介绍了JAXM结构,并利用其特点构建了不使用消息接发提供者的Web服务应用,分析了基于JAXM设计的体系结构和设计模式。

    超级有影响力霸气的Java面试题大全文档

     对于客户机,EntityBean是一种持久性对象,它代表一个存储在持久性存储器中的实体的对象视图,或是一个由现有企业应用程序实现的实体。  Session Bean 还可以再细分为 Stateful Session Bean 与 Stateless ...

    J2EE笔试题

    1.MVC的各个部分都有那些技术来实现?如何实现? 2.J2EE是什么? 3.J2EE是技术还是平台还是框架? 4.STRUTS的应用(如STRUTS架构) 5.WEB SERVICE名词解释。JSWDL开发包的介绍。JAXP、JAXM的解释。SOAP、UDDI,WSDL...

    java 面试题 总结

    对于客户机,EntityBean是一种持久性对象,它代表一个存储在持久性存储器中的实体的对象视图,或是一个由现有企业应用程序实现的实体。 Session Bean 还可以再细分为 Stateful Session Bean 与 Stateless Session ...

    千方百计笔试题大全

    215、写一个方法,实现字符串的反转,如:输入abc,输出cba 53 216、数据类型之间的转换 53 217、如何取得年月日,小时分秒 53 218、如何取得从1970年到现在的毫秒数 53 219、如何格式化日期 53 220、文件和目录(I/...

    Java面试宝典2010版

    10、在weblogic管理制台中对一个应用域(或者说是一个网站,Domain)进行jms及ejb或连接池等相关信息进行配置后,实际保存在什么文件中? 11、说说weblogic中一个Domain的缺省目录结构?比如要将一个简单的helloWorld.jsp...

    最新Java面试宝典pdf版

    46、java中有几种方法可以实现一个线程?用什么关键字修饰同步方法? stop()和suspend()方法为何不推荐使用? 29 47、sleep() 和 wait() 有什么区别? 30 48、同步和异步有何异同,在什么情况下分别使用他们?举例说明...

    java面试题

    常见java面试题 MVC的各个部分都有那些技术来实现?如何实现? WEB SERVICE名词解释。JSWDL开发包的介绍。JAXP、JAXM的解释。SOAP、UDDI,WSDL解释。 什么是JNDI

    java面试宝典

    215、写一个方法,实现字符串的反转,如:输入abc,输出cba 53 216、数据类型之间的转换 53 217、如何取得年月日,小时分秒 53 218、如何取得从1970年到现在的毫秒数 53 219、如何格式化日期 53 220、文件和目录(I/...

    Java面试笔试资料大全

    46、java中有几种方法可以实现一个线程?用什么关键字修饰同步方法? stop()和suspend()方法为何不推荐使用? 29 47、sleep() 和 wait() 有什么区别? 30 48、同步和异步有何异同,在什么情况下分别使用他们?举例说明...

    Hibernate包作用详解

     ODMG是一个ORM的规范,Hibernate实现了ODMG规范,这是一个核心的库,必须使用的jar包。  commons-collections.jar:  Apache Commons包中的一个,包含了一些Apache开发的集合类,功能比java.util.*强大。必须...

    java基础题 很全面

    16. 在weblogic管理制台中对一个应用域(或者说是一个网站,Domain)进行jms及ejb或连接池等相关信息进行配置后,实际保存在什么文件中? 22 17. 说说weblogic中一个Domain的缺省目录结构?比如要将一个简单的helloWorld....

Global site tag (gtag.js) - Google Analytics