本人第一次用idea学习Idea创建webservice服务和客户端调用以及如何部署:
首选是
创建webservice的方式和IDE中的部署发布测试:
1、AXIS ,我是大致按照这个教程学习的:
首先选择要创建的工程类型:
然后依次按照条件下一步创建好工程。
创建服务端代码:
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:我是按照这个网址学习的:
使用这种方式创建项目,创建过程中我主要遇到了一下几个问题:
项目工程结构不全,比如缺少resources文件夹,test文件夹等。
具体创建方法
另外还有报错,发现是pom中缺少依赖包的原因。
最后还是最重要的一点,项目工程的名字一定要和打出来的包的名字一样哦,不然war丢到Tomcat的webapps中会无法部署的:
工程名
war包名
上面的教程分享是在工程内部@TEST测试,在外部调用的方式:。
上面三种方式,各有千秋,建议比如供应商之间的小的接口调用使用AXIS方式;如果接口比较多,需要维护的话使用maven+cxf+Spring的方式。我把学习后整理的源码都保存了,想要的可以发我邮箱: jared_zhao@outlook.com,大家一起学习。
war包外部部署发布的方式:
1、Tomcat
部署位置:
启动服务:
测试结果:
中间遇到了Tomcat控制台乱码的问题,解决方法:。
2、JBoss
查看默认端口:
部署:
启动:
测试:
3、weblogic
weblogic暂时用不到。
这是我第一次写博客。
上网自学的过程,就是在互联网上把海量的技术分享信息找出那些离散的适合自己的,而且还要批判代码逻辑还是对的信息,然后组装成符合自己业务的程序,这个过程虽然痛苦,但是能学到很多东西,刺激发散思维能力,加强学习的能力。接下来我会学习webservice的源码和原理,希望到时候和大家分享。