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

首选是

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

1、AXIS ,我是大致按照这个教程学习的:

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

idear 从wsdl 生成 java 代码 idea生成wsdl客户端代码_webservice

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

创建服务端代码:

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文件: 

idear 从wsdl 生成 java 代码 idea生成wsdl客户端代码_cxf_02

idear 从wsdl 生成 java 代码 idea生成wsdl客户端代码_Spring_03

idear 从wsdl 生成 java 代码 idea生成wsdl客户端代码_Spring_04

<?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文件生成客户端代码:

idear 从wsdl 生成 java 代码 idea生成wsdl客户端代码_maven_05

idear 从wsdl 生成 java 代码 idea生成wsdl客户端代码_maven_06

或者网址路径方式:

idear 从wsdl 生成 java 代码 idea生成wsdl客户端代码_cxf_07

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

idear 从wsdl 生成 java 代码 idea生成wsdl客户端代码_idea_08

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

 

idear 从wsdl 生成 java 代码 idea生成wsdl客户端代码_cxf_09

配置Tomcat并部署war包:

idear 从wsdl 生成 java 代码 idea生成wsdl客户端代码_idea_10

启动成功:

idear 从wsdl 生成 java 代码 idea生成wsdl客户端代码_Spring_11

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

idear 从wsdl 生成 java 代码 idea生成wsdl客户端代码_webservice_12

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

idear 从wsdl 生成 java 代码 idea生成wsdl客户端代码_webservice_13


 

打开后的网页显示:

idear 从wsdl 生成 java 代码 idea生成wsdl客户端代码_cxf_14

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

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;

        }
    }

运行后的结果:

服务器控制台:

idear 从wsdl 生成 java 代码 idea生成wsdl客户端代码_Spring_15

客户端控制台:

idear 从wsdl 生成 java 代码 idea生成wsdl客户端代码_webservice_16

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

idear 从wsdl 生成 java 代码 idea生成wsdl客户端代码_cxf_17

2、JAX-WS

idear 从wsdl 生成 java 代码 idea生成wsdl客户端代码_webservice_18

 

创建服务器端代码:

@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不一样:

idear 从wsdl 生成 java 代码 idea生成wsdl客户端代码_webservice_19

idear 从wsdl 生成 java 代码 idea生成wsdl客户端代码_maven_20

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

idear 从wsdl 生成 java 代码 idea生成wsdl客户端代码_webservice_21

上面这一步的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:我是按照这个网址学习的:

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

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

具体创建方法

idear 从wsdl 生成 java 代码 idea生成wsdl客户端代码_maven_22

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

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

工程名

idear 从wsdl 生成 java 代码 idea生成wsdl客户端代码_idea_23

war包名

idear 从wsdl 生成 java 代码 idea生成wsdl客户端代码_idea_24

 上面的教程分享是在工程内部@TEST测试,在外部调用的方式:。

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

 

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

1、Tomcat

部署位置:

idear 从wsdl 生成 java 代码 idea生成wsdl客户端代码_maven_25

启动服务: 

idear 从wsdl 生成 java 代码 idea生成wsdl客户端代码_webservice_26

idear 从wsdl 生成 java 代码 idea生成wsdl客户端代码_idea_27

 测试结果:

idear 从wsdl 生成 java 代码 idea生成wsdl客户端代码_maven_28

  

中间遇到了Tomcat控制台乱码的问题,解决方法:。 

2、JBoss

 查看默认端口: 

 

idear 从wsdl 生成 java 代码 idea生成wsdl客户端代码_idea_29

 

部署:

idear 从wsdl 生成 java 代码 idea生成wsdl客户端代码_maven_30

启动: 

idear 从wsdl 生成 java 代码 idea生成wsdl客户端代码_webservice_31

 

idear 从wsdl 生成 java 代码 idea生成wsdl客户端代码_maven_32

测试:

idear 从wsdl 生成 java 代码 idea生成wsdl客户端代码_maven_33

3、weblogic

weblogic暂时用不到。

 

这是我第一次写博客。

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