soap学习
来源:互联网 发布:js地图效果 点击省份 编辑:程序博客网 时间:2024/05/17 01:21
SOAP简单对象访问协议是一种轻量的、简单的、基于 XML 的协议,它被设计成在WEB上交换结构化的和固化的信息
这里演示的例子服务端和客户端都是java
首先从网站http://xml.apache.org/soap/index.html下载soap,解压得到soap.war
把soap.war放到Tomcat\webapps\目录下
(1)、新建一个Web项目(服务端)名为SoapService
(2)、编写服务端代码HelloWorldService.java
- package HelloWorld;
- /**
- * <p>Title: HelloWorldService</p>
- * <p>Description: 服务端</p>
- */
- public class HelloWorldService {
- public String getMessage(){
- return "Hello World!!!";
- }
- public String getMessage(String str1, String str2) {
- return "Hello World! " + str1 + "&" + str2;
- }
- }
编写完成后,将HelloWorldService发布jar到Tomcat\lib\目录中
(3)、SOAP服务的发布
启动Tomcat自动将soap.war解压,访问http://localhost:8080/soap/admin/,会出现soap的管理页面
注意:这里会出现错误是因为在Tomcat\lib\目录下缺少sun的mail.jar
进入Deploy,填写如下信息:
ID: hello
Scope: Request
Methods getMessage
Provider Type: Java
Java Provider Provider Class: HelloWorld.HelloWorldService
Java Provider Static: NO
确认发布,可以点List查看已发布服务!
(4)、再建一个Web项目(客户端)名为SoapClient
为工程增加4个jar文件:xerces、soap、activation、mail
(5)、在这个Web项目里面新建一个Servlet作为测试的Servlet,名称为HelloWorldClientServlet.java
在web.xml里面配置好这个Servlet后,就可以在Servlet里面写webService调用的代码了
- package HelloWorld;
- import java.io.IOException;
- import java.net.URL;
- import java.util.Vector;
- import javax.servlet.ServletException;
- import javax.servlet.http.HttpServlet;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- import org.apache.soap.Constants;
- import org.apache.soap.Fault;
- import org.apache.soap.SOAPException;
- import org.apache.soap.rpc.Call;
- import org.apache.soap.rpc.Parameter;
- import org.apache.soap.rpc.Response;
- /**
- * <p>Title: HelloWorldClientServlet</p>
- * <p>Description: 测试Servlet</p>
- */
- public class HelloWorldClientServlet extends HttpServlet {
- private static final long serialVersionUID = 1L;
- public void doGet(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
- request.setCharacterEncoding("UTF-8");
- String endPoint = "http://localhost:8080/soap/servlet/rpcrouter"; //url是固定的,带参数绑定
- Call call = new Call(); //创建一个RPC Call
- call.setTargetObjectURI("hello"); //远程的服务名
- call.setMethodName("getMessage"); //访问方法
- call.setEncodingStyleURI(Constants.NS_URI_SOAP_ENC); //设置编码风格
- //发布带参数的服务
- Vector params = new Vector();
- Parameter p1 = new Parameter("name", String.class, "关羽", null);
- Parameter p2 = new Parameter("name2", String.class, "张飞", null);
- params.addElement(p1);
- params.addElement(p2);
- call.setParams(params);
- URL url = new URL(endPoint); //SOAP服务的网址,开始发送RPC请求,并返回服务端的应答
- Response resp = null;
- try { //检查应答报中文是否有错(有错就打印出错信息,没错就打印返回信息)
- resp = call.invoke(url, "");
- } catch (SOAPException e) {
- e.printStackTrace();
- }
- if(resp.generatedFault()){
- Fault fault = resp.getFault();
- System.out.println("The Following Error Occured:");
- System.out.println("Fault Code=" + fault.getFaultCode());
- System.out.println("Fault String=" + fault.getFaultString());
- } else {
- Parameter result = resp.getReturnValue();
- System.out.println(result.getValue());
- request.setAttribute("str", result.getValue());
- }
- request.getRequestDispatcher("/result.jsp").forward(request, response);
- }
- public void doPost(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
- doGet(request,response);
- }
- }
客户端的web.xml如下所示:
- <?xml version="1.0" encoding="UTF-8"?>
- <web-app version="2.5"
- xmlns="http://java.sun.com/xml/ns/javaee"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
- http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
- <servlet>
- <servlet-name>HelloWorldClientServlet</servlet-name>
- <servlet-class>HelloWorld.HelloWorldClientServlet</servlet-class>
- </servlet>
- <servlet-mapping>
- <servlet-name>HelloWorldClientServlet</servlet-name>
- <url-pattern>/HelloWorldClientServlet.do</url-pattern>
- </servlet-mapping>
- <welcome-file-list>
- <welcome-file>HelloWorldClientServlet.do</welcome-file>
- </welcome-file-list>
- </web-app>
(6)、Servlet返回的结果页面:result.jsp
- <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
- <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
- <%@ page isELIgnored="false"%>
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
- <html>
- <head>
- <title>SOAP测试客户端</title>
- </head>
- <body>
- SOAP测试客户端!!!<br>
- String:${str} <br>
- </body>
- </html>
(7)、运行客户端,测试是否通过
同时启动SoapService和SoapClient这两个应用,访问http://localhost:8080/SoapClient/
应该可以看到返回的内容,则证明配置和测试成功,以后就可以发布自己的SOAP服务了!
————————————————————————————————————————————
问题1:严重: Servlet.service() for servlet rpcrouter threw exception
java.lang.NoClassDefFoundError: com/sun/mail/util/LineInputStream
主要原因是
javax.mail和javax.activation这两个包已经在javaEE5当中属于基础包了,就是JDK中自带了已经,但是里面的方法与现在外面的mail.jar和activation.jar有一些出入,所以初学者在直接copy别人代码的时候往往会出现上面的错误。
废话不多说下面是解决方法
进到
X:/Program Files/MyEclipse 6.5/myeclipse/eclipse/plugins/com.genuitec.eclipse.j2eedt.core_6.5.0.zmyeclipse650200806/data/libraryset/EE_5
这个路径里,可以看到javaee.jar,用rar把这个文件打开,然后进到javax文件夹里,删除mail.jar和activation.jar(我的javaee.jar里,这两个东西是文件夹,总之删掉就OK,不过要注意备份一下)
删掉之后运行下面的代码,经行简单的修改以后就可以实现接收邮件的功能了!我已经测试过完全可行。
——————————————————————————————————————————————————问题2:StandardWrapper.Throwable
将mail.jar和activation.jar拷贝到tomcat/common/lib中解决
————————————————————————————————————————————————————————
问题3:Fault Code=SOAP-ENV:Server.BadTargetObjectURI
工程发布jar到Tomcat\lib\目录中
这个错误简直笑死了,竟然把方法在配置时多了个空格!!!!
- SOAP学习
- SOAP学习
- SOAP学习
- soap学习
- SOAP学习
- soap学习
- SOAP学习(一):SOAP Envelope 元素
- SOAP学习(二):SOAP Header 元素
- SOAP学习笔记(1)
- SOAP学习随笔
- 初步学习SOAP
- SOAP学习笔记
- SOAP 学习笔记
- soap学习篇
- soap 协议学习
- onvif学习 SOAP WSDL
- Web Service学习之【SOAP】
- 为什么要学习SOAP/WebService?
- MPMoviePlayerViewController和MPMoviePlayerController的使用
- 三只眼监控软件
- 一大波Java来袭(三)Java常用类
- ORACLE WITH AS 用法
- RadioButton在低版本中文字居中显示的问题
- soap学习
- OCP 1Z0 052 61
- 数组的指针特性
- 网络监控软件
- Android跨进程通信-AIDL详解示例(client+server)
- Android.mk文件规范
- 经典面试题(一)附答案 算法+数据结构+代码 微软Microsoft、谷歌Google、百度、腾讯
- Objective-C传递数据小技巧
- Eclipse中java生成注释文档