用axis2+tomcat+eclipse开发web service第一个程序

来源:互联网 发布:淘宝买dota2账号 编辑:程序博客网 时间:2024/04/29 20:24

最近要开发一个soap接口。对于我这个小白,一下子接触到很多崭新的东东:soap,web services,wsdl,axis2. 上周的成果就是搞出一个helloworld程序。对于原理的部分,我还是很多不明白。。。。

 

网上这方面的讲解还是比较多的,我每天都是从公司记录下报错信息,再回家google。对于要开发的接口,我还是心里没有底,时间紧迫啊。最近睡觉比较晚,困。希望我能顺利完成这个接口的代码工作。

 

以下是写SayHello的过程。图就不贴了,贴图太累人了,关键是贴上去以后再次看的时候就变成红叉叉。。。。

 


一、环境准备

1.1软件下载准备
Tomcat 5.5.28下载地址:
http://www.apache.org/dist/tomcat/tomcat-5/v5.5.28/bin/

Axis War (1.4.1) 包:
http://www.apache.org/dist/ws/axis2/1_4_1/

Axis Eclipse plug-in(代码生成工具和打包工具):
axis2-eclipse-codegen-wizard.zip和 axis2-eclipse-service-archiver-wizard.zip
http://www.apache.org/dist/ws/axis2/tools/1_4_1/

Eclipse IDE for Java EE Developers : eclipse-jee-galileo-SR1-win32.zip
http://www.eclipse.org/downloads/download.php?file=/technology/epp/downloads/release/galileo/SR1/eclipse-jee-galileo-SR1-win32.zip
(很推荐这个,用于web开发比较方便)

 

1.2安装 
1)首先搭建开发环境,将下载的 Eclipse 解压缩到一个目录:E:/eclipse-jee-galileo-SR1-win32/
2)将下载到的 Axis 的两个 plug-in解压缩到D:/ Axis-Plugin-Dir/eclipse/plugins目录下
3)在eclipse目录下创建D:/eclipse-SDK-3.2-win32/eclipse/links(原来eclipse目录下是没有这个目录的),新建文件名为:axis-eclipse-plugin.link
        内容为:
        path=D://Axis-Plugin-Dir
4)启动 Eclipse,选择“ File->New->Other”可以看到如下的两个界面 :
a. Axis2 plugins
 
b. Web Servieces plugins


5)下面开始搭建Web Services的部署环境:
将下载的tomcat5.5.28解压缩到一个目录D:/Tomcat5.5。
6)将axis2.war包拷贝到tomcat安装目录下的webapps目录。
7)启动Tomcat(monitor tomcat),打开浏览器输入并访问:http://127.0.0.1:8080/axis2 来查看,结果如下图,表示axis2已经工作正常。


二、快速开始
2.1创建webApps项目
      启动 Eclipse,新建立一个 WebApps( File->New->Project->Web->Dynamic Web project),给 Project Name 为 SayHello ,其他保持不改变,一路默认值。


2.2创建WSDL文件
1)选择File->New-Other菜单,进入后找到 Eclipse->Web Services并选择 WSDL.如下图:


2)点击下一步按钮,显示如下图:


3)选择“ src”目录作为“ Enter or select the parent folder”的值,“ File name”值给定为 SayHello.wsdl。
4)下一步,所有界面内容取默认值,Finish!
5)显示 WSDL设计器的界面如下:

修改图中标红色的部分:
修改图中的NewOperation为SayHello;
修改input中parameters为SayHelloRequest;
修改output中parameters为SayHelloResponse;
(图中蓝色部分为自动修改部分)

修改完后如下图:

红色框内为变化的内容,WSDL文件修改完毕。

 

2.3 从 WSDL生成 Java代码
1)选择菜单“ File->New->Other”,从对话框中选取“ Axis2 Wizards”下面的“ Axis2 Code Generator”.点击“ Next”
 
 
2)进入下一个页面,保持“ Generate java source code from WSDL file”被选中,点击“ Next”进入下一步。
3)点击“ Browse”来选取存放在 src目录下的 SayHello.wsdl文件,“ Next”进入下一步。(本例中存放在src目录下)
4)首先生成客户端代码和测试代码,设置如下:


5)下一步后,选择SayHello目录,如下图:

Finish !

 

*********************************************************
补充:在生成代码时,遇到Exception: java.lang.reflect.InvocationTargetException的解决方法
Axis2 Eclipse plugin: Code Generator 在Finish 时产生Exception: java.lang.reflect.InvocationTargetException
[版本]    Eclipse 3.2  +  Axis2 1.4

[问题原因]
主要的问题在于 Code Generator plugin 内缺少了 backport-util-concurrent-3.1.jar 包

[解决方案]
- 关闭 Eclipse
- copy %AXIS2_HOME%/lib/backport-util-concurrent-3.1.jar (或者Tomcat 5.5/webapps/axis2/WEB-INF/lib/backport-util-concurrent-3.1.jar )到下列 folder:
%ECLIPSE_HOME%/plugins/Axis2_Codegen_Wizard_1.3.0/lib

- 注册此 jar 包: 編輯 %ECLIPSE_HOME%/plugins/Axis2_Codegen_Wizard_1.3.0/plugin.xml , 在 <runtime> 內加入下面的字串
<library name="lib/backport-util-concurrent-3.1.jar">
<export name="*"/>
</library>

- 执行 Eclipse 即可

- 若问题仍存在, 尝试改变Eclipse 使用的 JRE, 换成 JAVA 6
- 使用 JRE 1.6 启动 Eclipse 后, 若仍有问题, 试着加入 -clean 参数启动 Eclipse, 清除 osig cache:
eclipse.exe -vm "c:/java/jre1.6.0_05/bin/java.exe" -clean -console -consoleLog -debug -vmargs -Xmx384M

- 关闭 Eclipse 后, 再以一般方式启动 Eclipse, 应可解决问题
*********************************************************

6)重复从1到3的步骤,然后再生成服务端代码,设置如下:
 

后面同5。
7)结束后,刷新项目,如图:
     
这是由于:
        a) 没有将Axis2的 jar包放入 class path 中
        解决方法:将tomcat目录下的webapps/axis2/WEB-INF/lib/的所有jar copy到Tomcat 5.5/common/lib/下
        b) 源代码的 package不为 org.example.www.sayhello引起的
        解决方法:只要在选择代码存在地方的时候选项目级目录就可以避免

 

2.4 编写业务代码

打开 SayHelloSKeleton.java文件其中的方法如下:

public  org.tonyzhangcn.ws.sayhello.SayHelloResponse SayHello(org.tonyzhangcn.ws.sayhello.SayHelloRequest param0)

{
                //  Todo fill this with the necessary business logic
                throw   new  java.lang.UnsupportedOperationException();
        }

 修改为:

public  org.tonyzhangcn.ws.sayhello.SayHelloResponse SayHello(org.tonyzhangcn.ws.sayhello.SayHelloRequest request)
{
      try     {
             SayHelloResponse response = new SayHelloResponse();
             response.setOut("Hi,"+request.getIn()+".How are you?");
             return response;
    }catch(UnsupportedOperationException e)
       {
           throw e;
   }
}

 

2.5打包

1)选择菜单“ File->New->Other”,从对话框中选取“ Axis2 Wizards”下面的“ Axis2 Services Archive”.点击“ Next”进入下一个页面 。

2)选择编译好的 class文件所在目录(本项目应该是 SayHello/build/classes),“ Next”进入下一步。


3)选择 WSDL文件所在目录,此处为 src目录下的 SayHello.wsdl文件。


4)不用添加,直接next


5)“ Next”,再“ Next”。选择 services.xml文件


6)点击“ Next”,将记入最后一个页面,此处有两个选项,一个是输出目录,一个是输出文件名称。这里的输出目录随便选择一个,输出文件名称给的是 SayHello。点击“ Finish”完成。

 

2.6部署
1)将打包好的文件 SayHello.jar拷贝到 Tomcat中已经部署的 Axis2应用的 WEB-INF/services目录下面。
2)重新启动 Tomcat。(其实不用重启tomcat,这里好像是“热启动")
3)打开浏览器,输入 http://127.0.0.1:8080/axis2 ,并点击其中的“serivices”链接可以看到 SayHello已经被部署。点击 SayHello提供的连接可以看到与之对应的 WSDL。

 

2.7 调用测试
1)修改 SayHelloTest.java文件中的方法 testSayHello 的内容为:

public void testSayHello() throws java.lang.Exception {
  String url=" http://localhost:8080/axis2/services/SayHello ";
  org.example.www.sayhello.SayHelloStub stub = new org.example.www.sayhello.SayHelloStub(url);
  org.example.www.sayhello.SayHelloStub.SayHello request = (org.example.www.sayhello.SayHelloStub.SayHello) getTestObject(org.example.www.sayhello.SayHelloStub.SayHello.class);
  request.setIn("Teamlet");
  System.out.println(stub.SayHello(request).getOut());
  assertNotNull(stub.SayHello(request));
 }
 
2)选中项目->属性->Java构建路径->库->添加外部jar,在eclipse的安装目录中找到eclipse/plugins/org.junit_3.8.1/junit.jar,添加上该jar包。
否则会报:找不到junit.framework.testcase

 3)从菜单中选择“ Run- >Run as->JUnit Test 完成测试! 运行结果

 

 
4)如果在run as JUnit时,遇到报错The input type of the launch configuration does not exist
解决方法:
If you are getting the above error message in Eclipse IDE, while running your test case, just make sure that you have the test class as a part of the “eclipse source folder” definition. Easiest way. Right click on the folder (右击test目录)–> Build Path –>Use as source folder Done.
点着你的包右击点 buildPath 点 Use as source folder Done.

 

2.8 用soapmonitor监测SOAP的发送消息和接收消息

要使用SOAPMonitor,前提是浏览器要安装Java plug-in1.3以上的版本,如果没有安装需要另外安装,并可以在浏览器中进行设置,在控制面板->java 中设置 “网络配置”,采用“使用浏览器”,如果SOAPMonitor能够正常使用,可以通过浏览器观察 http://localhost:8080/axis2/SOAPMonitor 8080 是应用服务所使用的端口。 soapmonitor-1.0.mar文件本身就存在于module目录下,只是axis2默认时出于安全考虑没有使用。如果要使用SOAPMonitor模块,需要改变的内容有:

1)编辑axis2.xml文件,在模块注释一下添加模块的引用
     <module ref="soapmonitor"/>
2)编辑axis2.xml文件,添加自定义的phase 
在axis2.xml文件中,在"inflow","outflow","INfaultflow","OutFaultFlow"部分有标志user can add his own phases to this area' 注册之后添加soapmonitorPhase 来定义soapmonitorPhase引用soapmonitor.mar文件中的module.xml文件。axis2.xml文件中添加soapmonitorPhase后如下所示:
<phaseOrder type="inflow">
        <!--System pre defined phases-->
        <phase name="TransportIn"/>
        <phase name="PreDispatch"/>
        <phase name="Dispatch" class="org.apache.axis2.engine.DispatchPhase">
            <handler name="AddressingBasedDispatcher"
                     class="org.apache.axis2.engine.AddressingBasedDispatcher">
                <order phase="Dispatch"/>
            </handler>
            <handler name="RequestURIBasedDispatcher"
                     class="org.apache.axis2.engine.RequestURIBasedDispatcher">
                <order phase="Dispatch"/>
            </handler>
            <handler name="SOAPActionBasedDispatcher"
                     class="org.apache.axis2.engine.SOAPActionBasedDispatcher">
                <order phase="Dispatch"/>
            </handler>
            <handler name="SOAPMessageBodyBasedDispatcher"
                     class="org.apache.axis2.engine.SOAPMessageBodyBasedDispatcher">
                <order phase="Dispatch"/>
            </handler>
            <handler name="InstanceDispatcher"
                     class="org.apache.axis2.engine.InstanceDispatcher">
                <order phase="PostDispatch"/>
            </handler>
        </phase>
        <!--System pre defined phases-->
        <!--After Postdispatch phase module author or or service author can add any phase he want-->
        <phase name="userphase1"/>
        <phase name="soapmonitorPhase"/>
    </phaseOrder>
    <phaseOrder type="outflow">
        <!--user can add his own phases to this area-->
        <phase name="userphase1"/>
        <phase name="soapmonitorPhase"/>
        <!--system predefined phase-->
        <!--these phase will run irrespective of the service-->
        <phase name="PolicyDetermination"/>
        <phase name="MessageOut"/>
    </phaseOrder>
    <phaseOrder type="INfaultflow">
        <!--user can add his own phases to this area-->
        <phase name="userphase1"/>
        <phase name="soapmonitorPhase"/>
    </phaseOrder>
    <phaseOrder type="Outfaultflow">
        <!--user can add his own phases to this area-->
        <phase name="userphase1"/>
        <phase name="soapmonitorPhase"/>
        <phase name="PolicyDetermination"/>
        <phase name="MessageOut"/>
    </phaseOrder>

——疑问:这个地方我不知道为什么要增加(主要还是不明白axis2.xml的意思),但是在没有修改axis2.xml中这部分的情况下,soapmonitor也可以运行

 

3)编辑web.xml文件
为了使得servlet能和applet进行交互,需要修改web.xml文件,在web.xml文件中添加如下的配置信息
  <servlet>
       <servlet-name>SOAPMonitorService</servlet-name>
       <display-name>SOAPMonitorService</display-name>
       <servlet-class>
         org.apache.axis2.soapmonitor.servlet.SOAPMonitorService
       </servlet-class>
       <init-param>
          <param-name>SOAPMonitorPort</param-name>
          <param-value>5001</param-value>
       </init-param>
       <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>SOAPMonitorService</servlet-name>
        <url-pattern>/SOAPMonitor</url-pattern>
    </servlet-mapping>

4)将axis2.war下的WEB-INF/lib目录下对axis2-soapmonitor-1.0.jar文件执行jar命令解压,获得SOAPMonitorApplet*.class文件,执行命令为: WEB-INF/lib>jar -xf axis2-soapmonitor-1.0.jar ,将获得的文件及目录复制到webapps/axis2目录下即可(否则applet找不到soapmonitor)

5)重新运行一下test case :testSayHello,则soapmonitor自动就捕捉到request的soap消息和response的soap消息。


[參考]
http://holdbelief.javaeye.com/blog/298282  ——强力推荐,我就是照着这个文章做的
http://holdbelief.javaeye.com/blog/309366
Error while using Axis2 Code Generator Plugin for Eclipse
http://www.nabble.com/Error-while-using-Axis2-Code-Generator-Plugin-for-Eclipse-td17147595.html
http://web-latte.blogspot.com/2008/05/axis2-eclipse-plugin-code-generator.html