MyEclipse 搭建webservice (axis1.4)

0 引言 

以前都是做javaweb的 最近因工作需要 接触了webservice

关于什么事webservice,与web的区别,soap,跟http的区别,asix1和asix2的区别,为什么不用json 等等等等 这里就不细谈了。等以后有机会会好好探讨下 要不会在心里留下阴影。

这里主要讲的是如何用myeclipse搭建axis1.4版本的webservice  并进行测试 。

网上看了很多 但版本过多没找到合适的 所以在这里把自己弄得小demo拿了出来

好 闲话不说了 上代码

 

1 搭建项目

在MyEclipse中 新建 Web项目 项目名 wbsDemo

1.0 最终结构

 

1.1导入jar包

MyEclipse 搭建webservice (axis1.4)_第1张图片

 

1.2jar包说明

axis.jar               SOAP引擎包
commons-discovery-0.2.jar    用来发现、查找和实现可插入式接口,提供一些一般类实例化、单件的生命周期管理的常用方法
commons-logging-1.1.1.jar    日志包
jaxrpc.jar             Axis运行所需要的组件包
wsdl4j-1.6.2.jar           用来解析服务的WSDl文件

 

1.3修改web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" 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_3_0.xsd">
<
servlet> <display-name>Apache-Axis Servlet</display-name> <servlet-name>AxisServlet</servlet-name> <servlet-class>org.apache.axis.transport.http.AxisServlet</servlet-class> </servlet> <servlet> <display-name>Axis Admin Servlet</display-name> <servlet-name>AdminServlet</servlet-name> <servlet-class>org.apache.axis.transport.http.AdminServlet</servlet-class> <load-on-startup>100</load-on-startup> </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>
</web-app>

 

1.4在lib下添加server-config.wsdd (webservice配置)文件

<deployment xmlns="http://xml.apache.org/axis/wsdd/" xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">

    <!-- 处理器 -->
    <handler name="URLMapper" type="java:org.apache.axis.handlers.http.URLMapper" />
    
  <!-- 待添加的服务 -->
<!-- 指定处理器 --> <transport name="http"> <requestFlow> <handler type="URLMapper"/> </requestFlow> </transport> </deployment>

好 这样就搭建成功了

然后开始上代码

 

2 服务端与客户端的数据传输

2.0这里我们分4中情况来实践

  情况1 传值:String         返回值: String

  情况2 传值:User(自定义对象)    返回值: String

  情况3 传值:String         返回值: User(自定义对象)

  情况4 传值:User(自定义对象)    返回值: UserInfo(自定义对象)

 

2.1 情况1 (传值:String 返回值: String)

2.1.1

新建一个实现类 UserService.java   并新建接收方法 showName

package lqb.manage;
public class UserService {
    
    public String showName(String name){
        System.out.println("UserService --- showName "+name);
        return String.format("name:%s",name);
    }
 
}

2.1.2

然后 在server-config.wsdd文件中添加服务

<!-- provider="java:RPC"  webservice是以javabean的形式提供的-->
    <service name="userService" provider="java:RPC">
        <!-- 指定类名 -->
        <parameter name="className" value="lqb.manage.UserService" />

    </service>

ok 这样就可以了

2.1.3

然后写客户端我们也再新建个类  Cline.java

并写一个跟这个服务通讯的测试方法 getNameWBSC()

/**
     * 
     * @param:  String   
     * @return: String  
     */
    public static void getNameWBSC(){
        
        Service service = new Service();  
        String url="http://127.0.0.1:8080/wbsDemo/services/userService";
        String methodName="showName";
        String name="李";
        System.out.println("Cline -- getNameWBSC");
        System.out.println("para String "+name);
        try {  
            Call call=(Call)service.createCall();
            call.setTargetEndpointAddress(new URL(url));  
            call.setOperationName(new QName("", methodName));
            //设置要传入参数,如果没有要传入的参数,则不要写这个  
            call.addParameter("name", XMLType.XSD_STRING, ParameterMode.IN); 
            //设置返回的类型  
            call.setReturnType(org.apache.axis.Constants.XSD_STRING);  
              
            //执行,调用webservice  
            String result = (String) call.invoke(new Object[]{name});  
            System.out.println("返回的结果是:"+result);  
              
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
    }

 

2.1.4

然后运行

客户端显示                                                             服务端显示

                        

ok 测试通过

 

 

2.2然后我们来看情况2

2.2.1

为了测试 我们新建一个自定义类 User.Class

package lqb.bean;

public class User {
    
    private String name;
    private int age;
    /*省略get set 构造函数*/
}

 

2.2.2

然后在UserService.java中添加 方法

public User showUser(String name){
     System.out.println("UserService --- showUser "+name);
     User u=new User(name,10);
     return u;
}

2.2.3

接着 在配置文件server-config.wsdd中添加服务

<!-- 一个服务 -->
    <!-- provider="java:RPC"  webservice是以javabean的形式提供的-->
    <service name="userService" provider="java:RPC">
        <!-- 指定类名 -->
        <parameter name="className" value="lqb.manage.UserService" />
        <!-- 参数返回值的bean -->
        <beanMapping languageSpecificType="java:lqb.bean.User" qname="ns1:User" xmlns:ns1="BeanService"/>
    </service>

与情况一不同 这里需要传输bean 所以需要添加一个beanMapping 

 

2.2.4

好 写测试方法 我们还是在Cline.java 中添加 getUserWBSC()

/**
     * 需要在wsdd文件中写Mapping
     * @param:  String   
     * @return:    User  
     */
    public static void getUserWBSC(){
        
        Service service = new Service();  
        String url="http://127.0.0.1:8080/wbsDemo/services/userService";
        String methodName="showUser";
        String qnv="User";
        String name="王";
        
        System.out.println("Cline -- getUserWBSC");
        System.out.println("para String "+name);
        try {  
            Call call=(Call)service.createCall();
            call.setTargetEndpointAddress(new URL(url));  
            call.setOperationName(new QName("", methodName));
            QName qn = new QName(qnv, methodName);
            call.registerTypeMapping(User.class, qn, new BeanSerializerFactory(User.class, qn), new BeanDeserializerFactory(User.class, qn));  
            
            //设置要传入参数,如果没有要传入的参数,则不要写这个  
            call.addParameter("name", XMLType.XSD_STRING, ParameterMode.IN); 
            //设置返回的类型  
            call.setReturnClass(User.class);  
              
            //执行,调用webservice  
            User u = (User) call.invoke(new Object[]{name});  
            System.out.println("返回的结果是:"+u.getName()+"-"+u.getAge());  
              
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
    }

好 然后运行测试 ...(这里就不再呈现了 和情况1类似 大家脑补下)

 

2.3然后我们来看情况3

2.3.1

bean还是使用刚才的User

2.3.2

然后在UserService中添加方法 showAge

 

public String showAge(User u){
        System.out.println("UserService --- showAge "+u.getAge());
    return String.format("age:%d",u.getAge());
}

 

2.3.3

swdd文件同第二种情况 (略)

2.3.4

然后是测试方法  还是在Cline.java中添加

/**
     * 
     * @param:  User   
     * @return:    String  
     */
    public static void getAgeWBSC(){
        
        Service service = new Service();  
        String url="http://127.0.0.1:8080/wbsDemo/services/userService";
        String methodName="showAge";
        User u=new User("张",10);
        System.out.println("Cline -- getAgeWBSC");
        System.out.println("para User:"+u.getName()+" - "+u.getAge());
        try {  
            Call call=(Call)service.createCall();
            call.setTargetEndpointAddress(new URL(url));  
            call.setOperationName(new QName("", methodName));
            //设置要传入参数,如果没有要传入的参数,则不要写这个  
//            QName qn = new QName("urn:BeanService", methodName);  
            QName qn = new QName("User", methodName);  
            call.registerTypeMapping(User.class, qn, new BeanSerializerFactory(User.class, qn), new BeanDeserializerFactory(User.class, qn));  
                        
            call.addParameter("name", qn, ParameterMode.IN); 
            //设置返回的类型  
            call.setReturnType(Constants.XSD_STRING);  
              
            //执行,调用webservice  
            String result = (String) call.invoke(new Object[]{u});  
            System.out.println("返回的结果是:"+result);  
              
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
    }

 

好 测试通过 (继续脑补)

 

2.4最后是第四种情况

2.4.1 

为不混淆参数和返回值 我们再new一个自定义的bean UserInfo.Class

package lqb.bean;

public class UserInfo{

    private String name;
    private String desc;

    /*省略get set 构造函数*/
}

2.4.2 

然后是服务端 在UserService中添加 方法showUserInfo

public UserInfo showUserInfo(User u){
        System.out.println("UserService --- showUserInfo "+u.getName());
        UserInfo ui=new UserInfo(u.getName(),"1234");
        return ui;
    }

2.4.3

这次 对应的配置文件觉有不同 需要再添加一个 beanMapping

<!-- 一个服务 -->
    <!-- provider="java:RPC"  webservice是以javabean的形式提供的-->
    <service name="userService" provider="java:RPC">
        <!-- 指定类名 -->
        <parameter name="className" value="lqb.manage.UserService" />
        <!-- 参数返回值的bean -->
        <beanMapping languageSpecificType="java:lqb.bean.User" qname="ns1:User" xmlns:ns1="BeanService"/>
        <beanMapping languageSpecificType="java:lqb.bean.UserInfo" qname="ns1:UserInfo" xmlns:ns1="BeanService"/>
    </service>

2.4.4 

最后还是Cline的测试方法getUserInfoWBSC

/**
     * 
     * @param:  User   
     * @return:    UserInfo  
     */
    public static void getUserInfoWBSC(){
        
        Service service = new Service();  
        String url="http://127.0.0.1:8080/wbsDemo/services/userService";
        String methodName="showUserInfo";
        User u=new User("赵",10);
        System.out.println("Cline -- getUserInfoWBSC");
        System.out.println("para User:"+u.getName()+" - "+u.getAge());
        try {  
            Call call=(Call)service.createCall();
            call.setTargetEndpointAddress(new URL(url));  
            call.setOperationName(new QName("", methodName));
            //设置要传入参数,如果没有要传入的参数,则不要写这个  
            QName qn = new QName("User", methodName);  
            call.registerTypeMapping(User.class, qn, new BeanSerializerFactory(User.class, qn), new BeanDeserializerFactory(User.class, qn));  
            
            
            QName qn1 = new QName("UserInfo", methodName);
            call.registerTypeMapping(UserInfo.class, qn1, new BeanSerializerFactory(UserInfo.class, qn1), new BeanDeserializerFactory(UserInfo.class, qn1));  
            
            
            call.addParameter("name", qn, ParameterMode.IN); 
            //设置返回的类型  
            call.setReturnClass(UserInfo.class);  
              
            //执行,调用webservice  
            UserInfo ui = (UserInfo) call.invoke(new Object[]{u});  
            System.out.println("返回的结果是:"+ui.getName()+" - "+ui.getDesc());  
              
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
    }

好 ....通过 继续脑补

 

 

2.5 至于其他情况(无传值 或者 无返回值)这里就不多说了 根据上面的例子 大家应该可以写出来

 

 

3 demo下载

百度云链接  密码:ybnx

 

你可能感兴趣的:(MyEclipse 搭建webservice (axis1.4))