2015年的JAVA SOAP for RPC 的环境配置和简单实例

最近老师让我们用SOAP来试试分布式运算. 于是去网上找了一些教程.
教程说明清晰,步骤明确, 但是编译和调试就是出各种错.....
所以总结了一下出现的错误, 原因和解决方法.

总的而已, 错误是因为程序版本的更新, 用法不太一样了.

首先, 下载4个程序

一共要下载四个软件包,它们都是开源免费的。其中,前两个是Apache的,后两个是SUN网站,如下所示:

l           SOAPhttp://apache.freelamp.com/ws/soap/version-2.3.1/

l           Xerceshttp://xml.apache.org/dist/xerces-j/ 

l           JavaMailhttp://java.sun.com/products/javamail/downloads/index.html 

l           JAFhttp://java.sun.com/products/javabeans/glasgow/jaf.html 


然后...这几个链接都不要用了, 已经过期或者找不到了, 自己百度谷歌吧
我自己的是soap-bin-2.3, javamail1_4_7, Xerces-J-bin.2.11.0, jaf-1_1_1.
当然还有Tomcat的apache-tomcat-8.0.20-windows-x64,不过Tomcat后面再说.

其次, 搭建环境
我自己的环境是Win 8.1 + JDK 8 + Tomcat 8.0.2 +上面那一堆

JDK的环境就不多说了.说说Tomcat
网上说只要点下一步就可以...但是为什么我解压出来的是一个文件夹...
因为..下载错文件啦~!
如果是下第一个zip的话, 解压出来就是一个文件夹, 那个还得配置一下
所以推荐下载最后一个, win上可以直接安装, 下一步就可以了
好吧, 无所谓, 文件夹也可以用, 随便放到一个地方就可以了,文件夹里面有
运行的文件Tomcat在bin, 源代码放在webapps里面的文件夹中的文件夹的文件夹.....
而刚才下载的那4个包呢, 就要放在lib里面.

现在开始放包
解压刚才4个压缩包, 网上教程说里面有xerces.jarsoap.jarmail.jaractivation.jar  但是 xerces 版本更新了,有点不一样.
xerces:
这么多jar复制哪一个呢, 别管了,全部复制吧, 我就因为只复制了xercesImpl.jar出错的.
网上说复制到Tomcat的“Tomcat 5.0/common/lib”目录,但我这里没有common这个文件夹, 所以我直接放进Tomcat的lib文件夹.

接着,把JDK的tool.jar也复制到Tomcat的lib里, tool.jar的位置在...我的是在这里C:\Program Files\Java\jdk1.8.0_05\lib

soap解压目录的webapps目录下的soap.war文件,复制到Tomcat的“Tomcat 5.0/webapps”目录下,这个目录是TomcatWEB应用所在目录

重启Tomcat就可以了. 对了, 怎么启动呢? 我老年痴呆犯了, 所以昨天刚弄的,今天就忘记了..总之,配置好之后,在Tomcat目录的Bin里的startup.bat启动就可以了, 但是记住..要先配置好Tomcat, 配置部分,,,找百度吧.

然后,配置程序在Eclipse里的环境
如果你已经知道Eclipse怎么在项目里加jar包, 把刚才那些放进Tomact的jar包都加进去就可以了(记住xerces是有几个jar包的, 全部加进去吧)
如果你没加过jar包,就接着看吧.
右键项目,






然后加进刚才那几个jar包就可以了(tool.jar不用加),  上面的步骤有一些可以简化的, 熟练就懂了...

然后,开始写程序吧
这里我就不放我的程序啦, 我复制那个教程贴的啦:

创建一个新的java项目mysoap,在项目里创建一个包“cn.com.chengang.soap.hello”,然后在包中创建两个Java文件,如下图所示:

1HelloWorldService.java是服务器端的程序,其代码如下。这个程序中只有一个方法,和其他Java程序没有什么差别,该方法也也很简单就是返回一个HelloWorld字符串

package cn.com.chengang.soap.hello;

public class HelloWorldService {

    public String getMessage() {

        return "Hello World!";

    }

}

 

2HelloWorldClient.java是客户端的访问程序,其代码如下:

package cn.com.chengang.soap.hello;

import java.net.URL;

 

import org.apache.soap.Constants;

import org.apache.soap.Fault;

import org.apache.soap.rpc.Call;

import org.apache.soap.rpc.Parameter;

import org.apache.soap.rpc.Response;

 

public class HelloWorldClient {

 

    public static void main(String args[]) throws Exception {

 

        String endPoint = "http://localhost:8080/soap/servlet/rpcrouter";//这里的路径基本上可以认为是固定的,.../soap/...是指在Tomcat里面的webApps里的soap文件夹, 是soap.war自动生成的,所以直接复制这个路径就可以了.

 

        Call call = new Call();//创建一个RPC Call

        call.setTargetObjectURI("urn:HelloWorldService");//远程的服务名

        call.setMethodName("getMessage");//访问方法

        call.setEncodingStyleURI(Constants.NS_URI_SOAP_ENC); //设置编码风格

   

        URL url = new URL(endPoint); //SOAP服务的网址

         //开始发送RPC请求,并返回服务器端的应答

        Response resp = call.invoke(url, "");

 

        //检查应答报文中是否有错

//有错就打印出错信息,没错就打印到正确的返回值HelloWorld

        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());

        }

    }

}


这个程序的用到了很多 SOAP 的类。注意:如果是两台电脑的话,那么 HelloWorldService.java HelloWorldClient.java 是分别独立安装在两台电脑上的, HelloWorldClient 中的程序代码就是通过 SOAP 服务来调用 HelloWorldService 中的 getMessage 方法。

好的, 复制完教程贴啦, 我继续写啦.
然后去项目的bin文件夹里复制HelloWorldService.class.class文件, 对啦, 没有编译没有debug怎么弄一个.class文件出来呀?
刷新一下项目就可以,也就是在Eclipse里面按一下F5, 或者右键项目->刷新

复制好了把 HelloWorldService.class . class 放在Tomcat的webApps文件夹里, 原帖说是放在Tomcat的classes文件夹里, 但是新版本里面没有classes文件夹, 另外的教程说放在WEB-INF里, 但是webApps里面也没有WEB-INF.
事实上, 前面提到过放在webApps的soap.war文件,就是用来生成classes文件夹的.
在运行Tomcat的时候, 如果webApps里有soap.war文件夹, 他会生成一个soap的文件夹, 里面有WEB-INF, 进去有classes, 然后把HelloWorldService.class. class, 按包名放进去就可以了, 就这个例子来说, 包名是 package cn.com.chengang.soap.hello; 然后就得在classes文件夹里,建立 cn/com/chengang/soap/hello 文件夹, 然后把 HelloWorldService.class . class 放进去.
最后完整路径是:Tomcat里面\webapps\soap\WEB-INF\classes\cn\com\chengang\soap\hello\HelloWorldService.class.class

注:还有一种方法是比较普遍使用的,就是将所有服务器端的 class 文件打成一个 JAR 包,然后将这个 JAR 包放在“ Tomcat/lib ”目录下。(引用自教程贴)

注册SOAP服务
之后我就都引用教程贴啦,后面还挺顺利的.

有多种方法可让HelloWorldService这个程序注册到SOAP服务中,本文介绍的是编写XML文件来注册SOAP服务的方法

1HelleWorld.xml文件。此文件可以放置到任何地方,它和HelloWorldService.java的位置没有必然的关系。

<?xml version="1.0"?>

<isd:service xmlns:isd="http://xml.apache.org/xml-soap/deployment" id="urn:HelloWorldService">

    <isd:provider type="java" scope="Request" methods="getMessage">

        <isd:java class="cn.com.chengang.soap.hello.HelloWorldService" static="false"/>

    </isd:provider>

</isd:service>

代码说明:

l           urn:HelloWorldService是服务名,它要求系统唯一。这里是取成和类名相同,你也可以取其他名称。

l           getMessage是提供的服务方法,也就是类HelloWorldService的方法名

l           <isd:java class=要求填入全类名(包名+类名)

2)设置两个环境变量。之所以要设置这两个变量是因为接下来的发布命令的需要。

TOMCAT_HOME    E:/Program Files/Apache Software Foundation/Tomcat 5.0

classpath    %TOMCAT_HOME%/common/lib/soap.jar;%TOMCAT_HOME%/common/lib
/mail.jar;%TOMCAT_HOME%/common/lib/activation.jar;%TOMCAT_HOME%/common/lib/xerces.jar

3)进入DOS窗口,并定位到HelloWorld.xml所在的目录,然后运行如下命令(一行)。如果执行正确,则应该没有任何显示;如果命令错误则会输出错误信息。

java  org.apache.soap.server.ServiceManagerClient http://127.0.0.1:8080/soap/servlet/rpcrouter  deploy  HelloWorld.xml

另外,再介绍其他两个常用的命令:

显示已经注册的SOAP服务:

java org.apache.soap.server.ServiceManagerClient http://127.0.0.1:8080/soap/servlet/rpcrouter list

 

取消发布:

java org.apache.soap.server.ServiceManagerClient http://127.0.0.1:8080/soap/servlet/rpcrouter undelpoy "urn:HelloWorldService"

 

 命令的执行过程如下:(我把xml文件放在e:/soaptest目录下,该目录就这一个文件)

 

你也可以进入SOAP网站的去看看是否注册成功了。

1.4.4  运行客户端

Eclipse中,将HelloWorldClient.java象一个普通Java应用程序那样运行,得到如下结果:

可见客户端程序HelloWorldClient通过SOAP服务调用了HelloWorldServicegetMessage方法,并得到了一个返回结果。

在这里我们并没有编写传输的XML文件(前面的XML是注册服务用的,不是一回事),这是因为SOAP包已经为我们自动完成了生成XML并传输到服务器的过程。

1.5  带参数的方法调用(CVSV0002版)

上面的HelloWorld的实例中,getMessage方法是没有参数的,这一节我们来加一个参数。

1)将HelloWorldService.java修改如下:

package cn.com.chengang.soap.hello;

 

public class HelloWorldService {

    public String getMessage() {

        return "Hello World!";

    }

 

    public String getMessage(String str) {

        return "Hello World! " + str;

    }

 

    public String getMessage(String str1, String str2) {

        return "Hello World! " + str1 + "&" + str2;

    }

}

 

2)将HelloWorldService.class复制到Tomcat的“Tomcat 5.0/common/classes/cn/com/chengang/soap/hello”目录下,覆盖原来的HelloWorldService.class

3)重启Tomcat服务。

4)修改HelloWorldClient程序如下(红字部份是新加的):

package cn.com.chengang.soap.hello;

 

import java.net.URL;

import java.util.Vector;

 

import org.apache.soap.Constants;

import org.apache.soap.Fault;

import org.apache.soap.rpc.Call;

import org.apache.soap.rpc.Parameter;

import org.apache.soap.rpc.Response;

 

public class HelloWorldClient {

 

    public static void main(String args[]) throws Exception {

 

        String endPoint = "http://localhost:8080/soap/servlet/rpcrouter";

 

        Call call = new Call();//创建一个RPC Call

        call.setTargetObjectURI("urn:HelloWorldService");//远程的服务名

        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 = call.invoke(url, "");

 

        //检查应答报文中是否有错

        //有错就打印出错信息,没错就打印到正确的返回值HelloWorld

        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());

        }

    }

}


6 )在 Eclipse 中运行 HelloWorldClient ,得到如下效果


OK啦~!如果到这里你顺利做完说明你人品还是很不错的. 那个原来的帖子的链接我是想直接贴的, 但是因为曾经因为帖子里含有链接, 被封号了Orz..所以现在还不是很清楚CSDN是怎么发别人的网页的,所以我试试吧blog.csdn.net/peter8015/article/details/5487067,感谢作者~!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值