之前因为一时没找到实现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
分享到:
相关推荐
JAXM提供了一个基于事件的模型,用于发送和接收XML消息,包括SOAP消息。它支持基于推送和拉取的通信模式。与SAAJ相比,JAXM更注重于消息传递的抽象,而不是消息的细节。以下是JAXM的关键组件: 1. **Source**: 用于...
Java API for XML Messaging (JAXM) 是Java平台上的一个标准接口,用于处理SOAP(Simple Object Access Protocol)消息。在给定的“jaxm-1_1_2.zip”压缩包中,包含的是JAXM的1.1.2版本,这是一个针对早期Java版本的...
以下是一个简单的例子,展示如何使用SAAJ创建并发送一个SOAP请求消息: ```java /** * Sender.java * Copyright 2005-2-10 */ import javax.xml.soap.*; import java.net.URL; public class Sender { public ...
JAXM,全称为Java API for XML Messaging,是一个专门针对XML消息交换的Java规范,基于SOAP 1.1规范,并支持带有Attachments的SOAP通信。JAXM为Java开发者提供了一种标准方式,通过Internet发送和接收XML文档,促进...
SOA的理想状态是实现传输协议的透明化,而SOAP作为一个特有协议,并未完全达到这一点。 在Java中,主要存在三种WebService实现规范: 1. JAX-WS(Java API for XML-Web Services):JAX-WS是目前常用的Java Web...
- **createSOAPMessage**:创建一个新的SOAP消息实例。 - **addTextValue**:向SOAP消息中添加文本值。 - **extractValue**:从SOAP消息中提取特定的值。 - **extractElement**:提取SOAP消息中的XML元素。 - **...
JAXM(Java API for XML Messaging简称JAXM)是为Java平台上的应用程序定义... 完整的JAXM API存在于javax.xml.soap和javax.xml.messaging二个包中。javax.xml.soap是用于接发SOAP消息的基本包,主要包含了发送带有附
- Apache CXF是一个开源服务框架,由ObjectWeb Celtix和Codehaus XFire合并而成,提供了一种简单的方式来构建和开发WebService。 - CXF的核心组件是Bus,它类似于Spring的ApplicationContext,用于管理WebService...
JAXM(Java API for XML Messaging简称JAXM)是为Java平台上的应用程序定义... 完整的JAXM API存在于javax.xml.soap和javax.xml.messaging二个包中。javax.xml.soap是用于接发SOAP消息的基本包,主要包含了发送带有附
这个包很难找啊,没什么资源,用于XML流处理信息的
Apache CXF是JAX-WS和JAX-RS的一个流行实现,它是一个开源的服务框架,用于构建和开发服务总线以及Web服务。 了解了这些基础知识后,实现SOA架构的关键在于如何运用这些规范和工具来设计和构建服务。例如,可以使用...
在J2EE企业级项目开发中...例如,Web服务用于实现不同系统间的集成,JNDI用于管理和查找资源,而JAXP和JAXM则在处理XML数据和SOAP通信中起到关键作用。理解并熟练运用这些技术,是成为一名成功的J2EE开发者的关键步骤。
- **SAAJ**:SOAP with Attachments API for Java,提供了构建和解析SOAP消息的能力,特别支持附件传输。 - **特点**: - 更多地暴露了SOAP消息的底层细节,适合需要更多控制权的场景。 - 相比之下,实现更为复杂...
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文件添加到项目的...
4. **WS-MetaData**:这是一个与JAX-WS紧密相关的规范,其API位于`javax.jws.*`包下,主要用于通过注解配置Web服务的相关信息和配置SOAP消息的信息。 #### 四、JAXM&SAAJ概述 除了JAX-WS之外,Java中还有另外两个...