之前因为一时没找到实现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
分享到:
相关推荐
使用SAAJ 和JAXM的 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是java的IAP,但是我们安装的JDK版本的API里面查不到这个包,提供给需要的同学!
JAXM(Java API for XML Messaging简称JAXM)是为Java平台上的应用程序定义... 完整的JAXM API存在于javax.xml.soap和javax.xml.messaging二个包中。javax.xml.soap是用于接发SOAP消息的基本包,主要包含了发送带有附
JAXM(Java API for XML Messaging简称JAXM)是为Java平台上的应用程序定义... 完整的JAXM API存在于javax.xml.soap和javax.xml.messaging二个包中。javax.xml.soap是用于接发SOAP消息的基本包,主要包含了发送带有附
这个包很难找啊,没什么资源,用于XML流处理信息的
介绍了JAXM结构,并利用其特点构建了不使用消息接发提供者的Web服务应用,分析了基于JAXM设计的体系结构和设计模式。
对于客户机,EntityBean是一种持久性对象,它代表一个存储在持久性存储器中的实体的对象视图,或是一个由现有企业应用程序实现的实体。 Session Bean 还可以再细分为 Stateful Session Bean 与 Stateless ...
1.MVC的各个部分都有那些技术来实现?如何实现? 2.J2EE是什么? 3.J2EE是技术还是平台还是框架? 4.STRUTS的应用(如STRUTS架构) 5.WEB SERVICE名词解释。JSWDL开发包的介绍。JAXP、JAXM的解释。SOAP、UDDI,WSDL...
对于客户机,EntityBean是一种持久性对象,它代表一个存储在持久性存储器中的实体的对象视图,或是一个由现有企业应用程序实现的实体。 Session Bean 还可以再细分为 Stateful Session Bean 与 Stateless Session ...
215、写一个方法,实现字符串的反转,如:输入abc,输出cba 53 216、数据类型之间的转换 53 217、如何取得年月日,小时分秒 53 218、如何取得从1970年到现在的毫秒数 53 219、如何格式化日期 53 220、文件和目录(I/...
10、在weblogic管理制台中对一个应用域(或者说是一个网站,Domain)进行jms及ejb或连接池等相关信息进行配置后,实际保存在什么文件中? 11、说说weblogic中一个Domain的缺省目录结构?比如要将一个简单的helloWorld.jsp...
46、java中有几种方法可以实现一个线程?用什么关键字修饰同步方法? stop()和suspend()方法为何不推荐使用? 29 47、sleep() 和 wait() 有什么区别? 30 48、同步和异步有何异同,在什么情况下分别使用他们?举例说明...
常见java面试题 MVC的各个部分都有那些技术来实现?如何实现? WEB SERVICE名词解释。JSWDL开发包的介绍。JAXP、JAXM的解释。SOAP、UDDI,WSDL解释。 什么是JNDI
215、写一个方法,实现字符串的反转,如:输入abc,输出cba 53 216、数据类型之间的转换 53 217、如何取得年月日,小时分秒 53 218、如何取得从1970年到现在的毫秒数 53 219、如何格式化日期 53 220、文件和目录(I/...
46、java中有几种方法可以实现一个线程?用什么关键字修饰同步方法? stop()和suspend()方法为何不推荐使用? 29 47、sleep() 和 wait() 有什么区别? 30 48、同步和异步有何异同,在什么情况下分别使用他们?举例说明...
ODMG是一个ORM的规范,Hibernate实现了ODMG规范,这是一个核心的库,必须使用的jar包。 commons-collections.jar: Apache Commons包中的一个,包含了一些Apache开发的集合类,功能比java.util.*强大。必须...
16. 在weblogic管理制台中对一个应用域(或者说是一个网站,Domain)进行jms及ejb或连接池等相关信息进行配置后,实际保存在什么文件中? 22 17. 说说weblogic中一个Domain的缺省目录结构?比如要将一个简单的helloWorld....