Idea创建webservice服务和客户端调用的几种方式,打包测试方式

本人第一次用idea学习Idea创建webservice服务和客户端调用以及如何部署:

首选是

创建webservice的方式和IDE中的部署发布测试:

1、AXIS ,我是大致按照这个教程学习的:https://blog.csdn.net/qq_35489188/article/details/52997014

首先选择要创建的工程类型:

然后依次按照条件下一步创建好工程。

创建服务端代码:

package crud;

import javax.jws.WebMethod;
import javax.jws.WebService;
import java.sql.*;

@WebService
public class HelloWorld {
  @WebMethod
  public String sayHelloWorldFrom(String from) {



    //声明Connection对象
    Connection con;
    //驱动程序名
    String driver = "com.mysql.jdbc.Driver";
    //URL指向要访问的数据库名mydata
    String url = "jdbc:mysql://localhost:3306/mysql";
    //MySQL配置时的用户名
    String user = "root";
    //MySQL配置时的密码
    String password = "123456";
    //遍历查询结果集
    try {
      //加载驱动程序
      Class.forName(driver);
      //1.getConnection()方法,连接MySQL数据库!!
      con = DriverManager.getConnection(url,user,password);
      if(!con.isClosed())
        System.out.println("Succeeded connecting to the Database!");
      //2.创建statement类对象,用来执行SQL语句!!
      Statement statement = con.createStatement();
      //要执行的SQL语句
      String sql = "select * from TEST";
      //3.ResultSet类,用来存放获取的结果集!!
      ResultSet rs = statement.executeQuery(sql);
      System.out.println("-----------------");
      System.out.println("执行结果如下所示:");
      System.out.println("-----------------");
      System.out.println("姓名");
      System.out.println("-----------------");

      String name = null;
      while(rs.next()){
        //获取stuname这列数据
        name = rs.getString("TEMPNAME");

        //输出结果
        System.out.println(name );
      }
      rs.close();
      con.close();
    } catch(ClassNotFoundException e) {
      //数据库驱动类异常处理
      System.out.println("Sorry,can`t find the Driver!");
      e.printStackTrace();
    } catch(SQLException e) {
      //数据库连接失败异常处理
      e.printStackTrace();
    }catch (Exception e) {
      // TODO: handle exception
      e.printStackTrace();
    }finally{
      System.out.println("数据库数据成功获取!!");
    }



    String result = "Hello, world, from " + from;
    System.out.println(result);
    return result;
  }
}

生成WSDL文件: 

<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions targetNamespace="http://crud" xmlns:apachesoap="http://xml.apache.org/xml-soap" xmlns:impl="http://crud" xmlns:intf="http://crud" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<!--WSDL created by Apache Axis version: 1.4
Built on Apr 22, 2006 (06:55:48 PDT)-->
 <wsdl:types>
  <schema elementFormDefault="qualified" targetNamespace="http://crud" xmlns="http://www.w3.org/2001/XMLSchema">
   <element name="from" type="xsd:string"/>
   <element name="sayHelloWorldFromReturn" type="xsd:string"/>
  </schema>
 </wsdl:types>

   <wsdl:message name="sayHelloWorldFromResponse">

      <wsdl:part element="impl:sayHelloWorldFromReturn" name="sayHelloWorldFromReturn"/>

   </wsdl:message>

   <wsdl:message name="sayHelloWorldFromRequest">

      <wsdl:part element="impl:from" name="from"/>

   </wsdl:message>

   <wsdl:portType name="HelloWorld">

      <wsdl:operation name="sayHelloWorldFrom" parameterOrder="from">

         <wsdl:input message="impl:sayHelloWorldFromRequest" name="sayHelloWorldFromRequest"/>

         <wsdl:output message="impl:sayHelloWorldFromResponse" name="sayHelloWorldFromResponse"/>

      </wsdl:operation>

   </wsdl:portType>

   <wsdl:binding name="HelloWorldSoapBinding" type="impl:HelloWorld">

      <wsdlsoap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>

      <wsdl:operation name="sayHelloWorldFrom">

         <wsdlsoap:operation soapAction=""/>

         <wsdl:input name="sayHelloWorldFromRequest">

            <wsdlsoap:body use="literal"/>

         </wsdl:input>

         <wsdl:output name="sayHelloWorldFromResponse">

            <wsdlsoap:body use="literal"/>

         </wsdl:output>

      </wsdl:operation>

   </wsdl:binding>

   <wsdl:service name="HelloWorldService">

      <wsdl:port binding="impl:HelloWorldSoapBinding" name="HelloWorld">

         <wsdlsoap:address location="http://192.168.6.107:8080//WSServer/services/HelloWorld"/>

      </wsdl:port>

   </wsdl:service>

</wsdl:definitions>

 根据生成WSDL文件生成客户端代码:

或者网址路径方式:

可以看出这个网址路径和wsdl文件中的路径是不一样的,是一开始生成wsdl文件的默认路径去掉命名空间那后的路径:

这里不做太多解释,记住就行了。但是把工程单独打包出来的时候,必须保持包名和工程名一样,这样在外部部署war包时就是wsdl文件中的那个路径了。

 

配置Tomcat并部署war包:

启动成功:

 在浏览器上打开网页:http://192.168.6.107:8080//services/HelloWorld?wsdl ,注意,不是wsdl文件中的这个地址:

因为我得服务器部署中的前缀是“/”,当然你要是想像wsdl中定义的地址一样自己加上前缀就行了。 


 

打开后的网页显示:

通过客户端程序调用代码:

public class WebSvrClient {



        public static void main(String[] args) {


            //第一种调用方式
            try {
                HelloWorldServiceLocator locator = new HelloWorldServiceLocator();
                HelloWorld_PortType service = locator.getHelloWorld();
                System.out.println(service.sayHelloWorldFrom("sdsa"));
            } catch (ServiceException e) {
                e.printStackTrace();
            } catch (RemoteException e) {
                e.printStackTrace();
            }

            /*String url = "http://192.168.6.107:8080/services/HelloWorld";
            String method = "sayHelloWorldFrom";
            String[] parms = new String[]{"abc"};
            WebSvrClient webClient = new WebSvrClient();

            String svrResult = webClient.CallMethod(url, method, parms);

            System.out.println(svrResult);*/

            //getOnline(url);

        }

        public String CallMethod(String url, String method, Object[] args) {
            String result = null;

            if(StringUtils.isEmpty(url))
            {
                return "url地址为空";
            }

            if(StringUtils.isEmpty(method))
            {
                return "method地址为空";
            }

            Call rpcCall = null;


            try {
                //实例websevice调用实例
                Service webService = new Service();
                rpcCall = (Call) webService.createCall();
                rpcCall.setTargetEndpointAddress(new java.net.URL(url));
                rpcCall.setOperationName(method);

                //执行webservice方法
                result = (String) rpcCall.invoke(args);

            } catch (Exception e) {
                e.printStackTrace();
            }
            return result;

        }
    }

运行后的结果:

服务器控制台:

客户端控制台:

注,有一点要注意,这种方式是静态生成的代码,如果服务端暴露服务的地址改变后,可以在这里面小改,不过大改还是重新生成客户端代码的好:

2、JAX-WS

 

创建服务器端代码:

@WebService()
public class Process {
  @WebMethod
  public String sayHelloWorldFrom(String from) {
    String result = "Hello, world, from " + from;
    System.out.println(result);
    return result;
  }
  public static void main(String[] argv) {
    Object implementor = new Process();
    String address = "http://localhost:9000/Process";
    Endpoint.publish(address, implementor);
  }
}

选择服务端类文件,生成WSDL文件,可看出这里和AXIS生成wsdl不一样:

根据wsdl文件生成客户端代码:

上面这一步的Web service wsdl url我只能选择绝对路径,不能像创建AXIS选择网址路径,我也不知道什么原因,因此建议使用AXIS创建webservice。

 

其他部署和上面一样,主要是客户端调用的方式和AXIS不一样:

public class Test {

    public static void main(String[] args){

        Process_Service process_service = new Process_Service();
        Process process = process_service.getProcess();
        process.sayHelloWorldFrom("enene");
    }
}

 测试结果就不贴了。

 

3、maven+spring+cxf:我是按照这个网址学习的:https://www.cnblogs.com/zhabayi/p/7404496.html

 使用这种方式创建项目,创建过程中我主要遇到了一下几个问题:

项目工程结构不全,比如缺少resources文件夹,test文件夹等。

具体创建方法

另外还有报错,发现是pom中缺少依赖包的原因。

最后还是最重要的一点,项目工程的名字一定要和打出来的包的名字一样哦,不然war丢到Tomcat的webapps中会无法部署的

工程名

war包名

 上面的教程分享是在工程内部@TEST测试,在外部调用的方式:https://www.cnblogs.com/zhanxiaoyun/p/7942902.html

上面三种方式,各有千秋,建议比如供应商之间的小的接口调用使用AXIS方式;如果接口比较多,需要维护的话使用maven+cxf+Spring的方式。我把学习后整理的源码都保存了,想要的可以发我邮箱: jared_zhao@outlook.com,大家一起学习。

 

war包外部部署发布的方式:

1、Tomcat

部署位置:

启动服务: 

 测试结果:

  

中间遇到了Tomcat控制台乱码的问题,解决方法:https://blog.csdn.net/qq_32239767/article/details/86707796。 

2、JBoss

 查看默认端口: 

 

 

部署:

启动: 

 

测试:

3、weblogic

weblogic暂时用不到。

 

这是我第一次写博客。

上网自学的过程,就是在互联网上把海量的技术分享信息找出那些离散的适合自己的,而且还要批判代码逻辑还是对的信息,然后组装成符合自己业务的程序,这个过程虽然痛苦,但是能学到很多东西,刺激发散思维能力,加强学习的能力。接下来我会学习webservice的源码和原理,希望到时候和大家分享。

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Web Service客户端调用方式主要有两种:基于代理类的调用和基于动态代理的调用。 1. 基于代理类的调用 在基于代理类的调用中,首先需要使用wsdl.exe命令或者Visual Studio自动生成代理类。然后,通过实例化代理类对象,调用其中的方法来实现与Web Service的交互。 具体实现步骤如下: (1)生成代理类 使用wsdl.exe命令或者Visual Studio自动生成代理类。wsdl.exe是Windows操作系统自带的工具,可以通过命令行调用生成代理类。具体命令如下: ``` wsdl /l:CS /n:MyCompany.MyProduct.MyService http://localhost/MyService/Service.asmx?wsdl ``` 其中,/l:CS表示生成C#代码,/n:MyCompany.MyProduct.MyService表示生成的命名空间,http://localhost/MyService/Service.asmx?wsdl表示Web Service的地址。 (2)实例化代理类对象 在客户端代码中,实例化代理类对象。代码示例如下: ``` MyServiceProxy proxy = new MyServiceProxy(); ``` (3)调用代理类中的方法 使用代理类对象调用其中的方法。代码示例如下: ``` string result = proxy.MyMethod(param1, param2); ``` 2. 基于动态代理的调用 基于动态代理的调用是通过反射机制动态生成代理类,然后再通过代理类实现与Web Service的交互。相比于基于代理类的调用,基于动态代理的调用更加灵活,可以动态地修改代理类的行为。 具体实现步骤如下: (1)使用ChannelFactory创建代理类 使用ChannelFactory创建代理类对象。代码示例如下: ``` ChannelFactory<IMyService> factory = new ChannelFactory<IMyService>(new BasicHttpBinding(), new EndpointAddress("http://localhost/MyService/Service.asmx")); IMyService proxy = factory.CreateChannel(); ``` 其中,IMyService是Web Service的接口,BasicHttpBinding是通信协议,EndpointAddress是Web Service的地址。 (2)调用代理类中的方法 使用代理类对象调用其中的方法。代码示例如下: ``` string result = proxy.MyMethod(param1, param2); ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值