cheng029 发表于 2017-1-1 11:34:29

Apache Axis2 环境搭配详解

  配置Eclipse,Eclipse自带了开发WebService的工具。
  打开Eclipse-->点击菜单windows-->Preferences-->WebServices-->Axis2Preferences-->设置Axis2 runtime location为Axis2下载后并解压的核心包的位置:

  选择后Eclipse会自动检测包是否正确。如果successfully提示表示设置正确。
  2.在Eclipse创建一个WebProject时,点击Configuration的Modify会出现下图界面:

  勾选Axis2 Web Services按OK。回到新建WebProject界面,完成项目创建。
  创建成功后会发现在WEB-INF文件夹下会多出一个axis2-web的文件夹,这个是Axis2的项目文件夹。
  现在启动服务器会抛出异常,这是因为Eclipse在自动加载生成该项目时有几个问题需要手动修复,下面分别列出:
  问题一:会抛出异常:java.lang.ClassNotFoundException: org.apache.axis2.transport.http.AxisAdminServlet
  是因为生动生成的web.xml文件中所指定的AxisAdminServlet包路径有错。
  自动生成的源码如下:
  <servlet>
    <display-name>Apache-Axis Servlet</display-name>
    <servlet-name>AxisServlet</servlet-name>
    <servlet-class>org.apache.axis2.transport.http.AxisServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>AxisServlet</servlet-name>
    <url-pattern>/servlet/AxisServlet</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>AxisServlet</servlet-name>
    <url-pattern>*.jws</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>AxisServlet</servlet-name>
    <url-pattern>/services/*</url-pattern>
  </servlet-mapping>
  <servlet>
    <display-name>Apache-Axis Admin Servlet Web Admin</display-name>
    <servlet-name>AxisAdminServlet</servlet-name>
    <servlet-class>org.apache.axis2.transport.http.AxisAdminServlet</servlet-class>
    <load-on-startup>100</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>AxisAdminServlet</servlet-name>
    <url-pattern>/axis2-admin/*</url-pattern>
  </servlet-mapping>
  注意红色字体部分,我们可以去看一下所下载的Axis2的源包。AxisAdminServlet类所在的包路径并不在下列这个路径中org.apache.axis2.transport.http,该类是属于包org.apache.axis2.webapp下。(如果还报错,则反编译org.apache.axis2.webapp.AxisAdminServlet类放到工程里)
  问题二:会抛出异常:java.lang.ClassNotFoundException: org.apache.http.HttpResponseFactory,是因为少JAR包。将开始下好的HttpCore4.1-alpha1包解压后主文件夹下的lib文件夹下有httpcore-4.1-alpha1.jar包。将其拷贝到WEB-INF下的lib文件夹中。
  重启服务器,正常启动成功,在浏览器地址栏输入:http://localhost:9000/WebServiceProject/axis2-web/
  进入主页,如下图:表示Axis2部署成功:

  点击Validate进入验证Axis2环境界面:
  这个页面会加册Axis2运行必备的一些库是否已具备,如果看到下列图中的绿色字体表示环境已搭建成功:

  再次返回主页,点击Service,可以看到当前可用的Service列表。默认有一个名为“Version”的WebService。

  再次返回主页,点击Adminnistation,进入管理控制台的登录界面:

  输入username(用户名)和password(密码)。默认用户名为:admin,密码为:axis2。
  点击登录进入Axis2管理控制平台:

  可点击左边的Available Service产看当前可用的Service列表。
  3.开发实例
  在src下新建一个名为HelloApp的类:
  package service;
  public class HelloApp {
  public HelloApp() {
  
 }
 /**
  * 对外公开的服务方法
  */
 public String sayHello(String name) {
    return "Hello," + name;
 }
}
  在Eclipse中将鼠标放在刚才建立的HelloApp.java上点击右键,弹出菜单选择Web Service再选择Create Web Service,会弹出下图的界面:

  上下分别有个滑块,把上面的滑块滑至最上端(为Test service)。把下方滑块滑至第二格(Develop client)表示生成当前服务的客户端代码(完成后会在Eclipse中会自动生成一个名字为:[当前工程名+Client]的工程),同时选中publish the Web Service(公开这个Web Service)。点击下一步直至完成。步骤如图:
 
  保持默认设置,点击下一步。

  继续保持默认设置,点击下一步。

  当前设置Port Name(端口名)选择:当前工程名+SOAP11HttpSoap11Endpoint。并勾选下面的Generate a JUnit test case to the service。其它选项保持默认点击完成。
  完成后可以看到Web Service Explorer中可以看到我们刚刚对外公开的HelloApp服务,如下图:

  选中左边窗口中的HelloApp服务,找到并点击右边窗口中的Type(类型)为SOAP的服务绑定Name。
  进入下图界面:

  当前列出了当前公开服务可用的方法,当前服务只有一个sayHello方法。点击Operations下Name为sayHello的方法,进入下图的界面:

  当前列出了当前公开服务的方法及参数。当前的唯一方法sayHello有一个String类型的名为name的参数。
  点击Add,转到下图:

  为当前公开服务的sayHello方法传入一个String类型的name参数“EugeneHeen”,点击Go按钮。此时下面的Status(状态窗口)中会显示调用该方法后的结果。点击Source可以浏览到已经被SOAP分装好该服务的XML文件。
  4.Eclipse生成的Client工程
  在Eclipse中找到自动生成的客户端工程。在src下有一个当前公开服务的测试类。这是一个JUnit测试用例。
  切记和服务端一样,这里需要将我们开始下好的HttpCore4.1-alpha1包解压后主文件夹下的lib文件夹下有httpcore-4.1-alpha1.jar包。不然会抛出异常:java.lang.ClassNotFoundException: org.apache.http.HttpResponseFactory
  如图:

  打开HelloAppTest.java,找到testSayHello(String name)方法。里面有这样一行注释 // TODO : Fill in the sayHello4 here,它提示我们在此设置调用方法的参数。
  Sub是存根。是有Axis2帮我们生成的客户端存根代码。可以这样理解,Sub封装了查找服务、编码、发送、接收、解码请求等一系列动作的帮助类。有了它我们不用去关心WebService底层调用的技术细节,而是直接调用WebService提供的方法。
  service.HelloAppStub stub = new service.HelloAppStub();这是方法中的第一行代码,实例化了一个存根。
  方法中的第二行代码:
  service.HelloAppStub.SayHello sayHello4 = (service.HelloAppStub.SayHello)getTestObject(service.HelloAppStub.SayHello.class);
  调用了方法
  public org.apache.axis2.databinding.ADBBean getTestObject(java.lang.Class type) throws java.lang.Exception{
           return (org.apache.axis2.databinding.ADBBean) type.newInstance();
        }
  返回一个org.apache.axis2.databinding.ADBBean类型的对象。利用他来为要调用的方法设值。
  为参数设值:sayHello4.setName("EugeneHeen");
  最后自己编写一行打印调用当前公开服务的sayHello方法的语句:
  System.out.println(stub.sayHello(sayHello4).local_return);
  利用存根调用当前公开服务的sayHello(String name)方法,一定要调用local_return才能正确返回字符串。
  运行该JUnit得到的结果与我们用Web Service Explorer为方法设值是一样的。这就是客户端编码调用。
页: [1]
查看完整版本: Apache Axis2 环境搭配详解