webservice编程基础——axis2

使用axis2进行webservice编程也是比较容易的,下面主要讲解一些axis2实现的过程,以及遇到的问题解决。
一,下载最新的axis2包axis2-1.6.2-bin.zip,和eclipse开发插件工具axis2-eclipse-codegen-wizard.zip,axis2-eclipse-service-archiver-wizard.zip,并解压,将解压后的文件axis2-eclipse-codegen-wizard和axis2-eclipse-service-archiver-wizard放入Myeclipse的安装目录dropins里面。启动Myeclipse。从名称可以看出axis2-eclipse-codegen-wizard是代码生成向导,axis2-eclipse-service-archiver-wizard是服务打包向导。
二,新建web project,并将axis2-1.6.2-bin.zip解压后的lib目录下的jar文件引入工程中,编写服务端代码,如下:

package axis.com.demo;
public class HelloServer {       
 public String sayHello(String name){  
        return "Hello kitty you are, " + name + "!";  
   }  
}        


打开Myeclipse,操作如下。
一,首先进行wsdl的生成和发布。进行File——》new ——》others——》Axis2 Winzards——》Axis2 Code  Generator。选择Generate a WSDL from a java source file.并设置classNmae和class目录,并点击test class loading.



点击下一步,直到进入如下页面,并设置生成wsdl的名称和目录如下:



正常的你会看到:



二,进行服务打包。File——》new ——》others——》Axis2 Winzards——》Axis2 Server Archiver,进入服务发布打包页面。

填写你的class地址。
下一步选择skip wsdl.在下一步选择依赖的jar包,如果没有,则继续下一步。默认自从生成XML文件。接下来填写服务名,和服务端的class文件所在目录。如下:


点击load,加载进来。设置要打的包的路径,这个路径一般设置在文件web-inf下面,且文件名应该和web.xml的设置保存一致。如下所示:

点击下一步就发布完成了。
在Myeclipse工程中正常的显示为:



再讲讲遇到的问题,可能在weblogic,遇到客户端访问报错的问题,其实也是服务端的jar包冲突,解决办法是优先使用web工程的jar包,可在WEB-INF下加上一个weblogic.xml文件,内容如下:
<?xml version="1.0" encoding="UTF-8"?>

<weblogic-web-app xmlns="http://www.bea.com/ns/weblogic/90"> 

<container-descriptor> 

<prefer-web-inf-classes> true</prefer-web-inf-classes> 

</container-descriptor>

</weblogic-web-app>
true表示是优先使用web工程的jar文件。

web.xml内容(没有建立的话需要新建)如下:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:j2ee="http://java.sun.com/xml/ns/j2ee">
<servlet>
        <servlet-name>AxisServlet</servlet-name>
        <servlet-class>org.apache.axis2.transport.http.AxisServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
        <servlet-name>AxisServlet</servlet-name>
        <url-pattern>/services/*</url-pattern> 
</servlet-mapping>
</web-app>


客户端调用代码如下:

package axis.com.demo;
import javax.xml.namespace.QName;

import org.apache.axiom.om.OMAbstractFactory;
import org.apache.axiom.om.OMElement;
import org.apache.axiom.om.OMFactory;
import org.apache.axiom.om.OMNamespace;
import org.apache.axis2.Constants;
import org.apache.axis2.addressing.EndpointReference;
import org.apache.axis2.client.Options;
import org.apache.axis2.rpc.client.RPCServiceClient;
public class HelloClient {

public static void main(String[] args) {
	try {  
        // 获得客户端  
        RPCServiceClient serviceClient = new RPCServiceClient();  
        // 可以在该对象中设置服务端的验证信息  
        Options options = serviceClient.getOptions();  
        EndpointReference targetEPR = new EndpointReference("http://127.0.0.1:7001/TestAxis2/services/HelloServer?wsdl");  
        options.setTo(targetEPR);  
        // 在创建QName对象时,QName类的构造方法的第一个参数表示WSDL文件的命名空间名,也就是<wsdl:definitions>元素的targetNamespace属性值  
        QName opAddEntry = new QName("http://demo.com.axis","sayHello");  
        // 参数,如果有多个,继续往后面增加即可,不用指定参数的名称  
        Object[] opAddEntryArgs = new Object[] {"ltf" };  
        // 返回参数类型,这个和axis1有点区别  
        // invokeBlocking方法有三个参数,其中第一个参数的类型是QName对象,表示要调用的方法名;  
        // 第二个参数表示要调用的WebService方法的参数值,参数类型为Object[];  
        // 第三个参数表示WebService方法的返回值类型的Class对象,参数类型为Class[]。  
        // 当方法没有参数时,invokeBllocking方法的第二个参数值不能是null,而要使用new Object[]{}  
        // 如果被调用的WebService方法没有返回值,应使用RPCServiceClient类的invokeRobust方法,  
        // 该方法只有两个参数,它们的含义与invokeBlocking方法的前两个参数的含义相同  
        Class[] classes = new Class[] { String.class };  
        System.out.println(serviceClient.invokeBlocking(opAddEntry,opAddEntryArgs, classes)[0]);   
    } catch (Exception e) {  
        e.printStackTrace();  
    }  
    }   
}


进入http://localhost:8080/TestAxis2/services/HelloServer?wsdl就可验证是否发布成功了。

猜你喜欢

转载自fenger-chui.iteye.com/blog/1683914