`
smartzxy
  • 浏览: 199917 次
  • 性别: 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客户端及服务

    JAXM提供了一个基于事件的模型,用于发送和接收XML消息,包括SOAP消息。它支持基于推送和拉取的通信模式。与SAAJ相比,JAXM更注重于消息传递的抽象,而不是消息的细节。以下是JAXM的关键组件: 1. **Source**: 用于...

    jaxm-1_1_2.zip

    Java API for XML Messaging (JAXM) 是Java平台上的一个标准接口,用于处理SOAP(Simple Object Access Protocol)消息。在给定的“jaxm-1_1_2.zip”压缩包中,包含的是JAXM的1.1.2版本,这是一个针对早期Java版本的...

    Java SOAP协议

    以下是一个简单的例子,展示如何使用SAAJ创建并发送一个SOAP请求消息: ```java /** * Sender.java * Copyright 2005-2-10 */ import javax.xml.soap.*; import java.net.URL; public class Sender { public ...

    基于JAXM构建Web服务及应用

    JAXM,全称为Java API for XML Messaging,是一个专门针对XML消息交换的Java规范,基于SOAP 1.1规范,并支持带有Attachments的SOAP通信。JAXM为Java开发者提供了一种标准方式,通过Internet发送和接收XML文档,促进...

    WebService的几种不同实现方式

    SOA的理想状态是实现传输协议的透明化,而SOAP作为一个特有协议,并未完全达到这一点。 在Java中,主要存在三种WebService实现规范: 1. JAX-WS(Java API for XML-Web Services):JAX-WS是目前常用的Java Web...

    基于SoftEngine开发 WebService应用

    - **createSOAPMessage**:创建一个新的SOAP消息实例。 - **addTextValue**:向SOAP消息中添加文本值。 - **extractValue**:从SOAP消息中提取特定的值。 - **extractElement**:提取SOAP消息中的XML元素。 - **...

    简述JAXM构建Web服务及应用

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

    Webservice-CXF实用手册学习大全

    - Apache CXF是一个开源服务框架,由ObjectWeb Celtix和Codehaus XFire合并而成,提供了一种简单的方式来构建和开发WebService。 - CXF的核心组件是Bus,它类似于Spring的ApplicationContext,用于管理WebService...

    通信与网络中的简述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流处理信息的

    java实现soa技术

    Apache CXF是JAX-WS和JAX-RS的一个流行实现,它是一个开源的服务框架,用于构建和开发服务总线以及Web服务。 了解了这些基础知识后,实现SOA架构的关键在于如何运用这些规范和工具来设计和构建服务。例如,可以使用...

    J2EE企业级项目开发-3期(KC007) 4.1 大规模Java平台简介考试.doc

    在J2EE企业级项目开发中...例如,Web服务用于实现不同系统间的集成,JNDI用于管理和查找资源,而JAXP和JAXM则在处理XML数据和SOAP通信中起到关键作用。理解并熟练运用这些技术,是成为一名成功的J2EE开发者的关键步骤。

    JAVA的WebService支持CXF与SAAJ第三版

    - **SAAJ**:SOAP with Attachments API for Java,提供了构建和解析SOAP消息的能力,特别支持附件传输。 - **特点**: - 更多地暴露了SOAP消息的底层细节,适合需要更多控制权的场景。 - 相比之下,实现更为复杂...

    WebService完整教程.pdf

    WS-Metadata是JAX-WS的一个依赖规范,用于配置公开的Web服务的相关信息和SOAP消息的配置。 JAXM&SAAJ是Java中基于SOAP的Web服务技术。JAXM(Java API for XML Messaging)定义了发送和接收消息所需的API,主要应用...

    开发所需用的到资源包

    这个压缩包中的“saaj与jaxm开发所需jar包”很可能包含了实现SAAJ和JAXM功能所需的库文件,如javax.xml.soap.*包下的类和接口,以及可能的第三方实现,如Metro或Apache CXF等。开发者可以将这些.jar文件添加到项目的...

    java webservice 详细开发示例介绍

    4. **WS-MetaData**:这是一个与JAX-WS紧密相关的规范,其API位于`javax.jws.*`包下,主要用于通过注解配置Web服务的相关信息和配置SOAP消息的信息。 #### 四、JAXM&SAAJ概述 除了JAX-WS之外,Java中还有另外两个...

Global site tag (gtag.js) - Google Analytics