WebService服务demo
demo环境
操作系统:windows 10 x64
JDK:jdk1.8.0_172
开发工具:intellij idea 2018.3.3 x64
项目容器:Tomcat 7.0.90
服务端
这里分别提供两种服务发布方式
1:普通java工程
2:Web工程
普通java工程
新建测试接口
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
package pojoService;
import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebResult;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;
/**
* @Filename: HelloWorldService
* @Author: Zhang Wei
* @Date: 2019/2/12 14:16
* @Description: 服务接口
* @History:
*/
@WebService
@SOAPBinding(style = SOAPBinding.Style.RPC)
public interface HelloWorldService {
@WebMethod
@WebResult(name = "resultStr")
String sayHelloWorldFrom(@WebParam(name = "from") String from);
}
编写实现类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package pojoService;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;
/**
* @Filename: HelloWorldImpl
* @Author: Zhang Wei
* @Date: 2019/2/12 10:11
* @Description: 服务实现类
*/
@WebService(endpointInterface = "pojoService.HelloWorldService")
@SOAPBinding(style = SOAPBinding.Style.RPC)
public class HelloWorldImpl implements HelloWorldService {
@Override
public String sayHelloWorldFrom(String from) {
String result = "Hello, world, from " + from;
System.out.println(result);
return result;
}
}
发布WebService服务
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package pojoService;
import javax.xml.ws.Endpoint;
/**
* @Filename: HelloWorldServer
* @Author: Zhang Wei
* @Date: 2019/2/12 14:22
* @Description: 普通java工程发布服务(启动后不能停止,否则服务一起停止)
* @History:
*/
public class HelloWorldServer {
public static void main(String[] args) {
//发布服务
Endpoint.publish("http://localhost:8086/services/HelloWorld?wsdl", new HelloWorldImpl());
}
}
Web工程
新建WebService工程
打开idea工具,在顶部导航栏中找到“File” —> “New” —>“Project”,在打开的窗口左侧工程类型里选择Spring,在右侧的 详细工程栏里选择“Java EE”下的WebServices工程,选择完成后再下方勾选“Generate sample server code”,Version一栏里选择“Apache Axis”,点击“next”,在“Project name”栏中输入工程名,点击“finish”创建完成。
因为我们勾选了“Generate sample server code”,所以生成的工程会自带一个demo
1
2
3
4
5
6
7
public class HelloWorld {
public String sayHelloWorldFrom(String from) {
String result = "Hello, world, from " + from;
System.out.println(result);
return result;
}
}
可以在工程目录“web”—>“WEB_INF”下看到两个文件
server-config.wsdd:WebService服务配置文件
web.xml:web工程配置文件
打开“server-config.wsdd”文件里面有这样的一份配置信息
1
2
3
4
5
6
<service name="HelloWorld" provider="java:RPC" style="document" use="literal">
<parameter name="className" value="example.HelloWorld"/>
<parameter name="allowedMethods" value="*"/>
<parameter name="scope" value="Application"/>
<namespace>http://example</namespace>
</service>
这里就是对外发布的服务配置信息
启动工程(发布服务)
把新建的WebService工程打包放入Tomcat容器中启动
访问地址查看是否生成了wsdl
默认地址:http://localhost:8080/WebServiceSampleDemo_war_exploded/services/HelloWorldTo?wsdl
80端口和services之间的“WebServiceSampleDemo_war_exploded”是自动生成的名称,可以手动在idea的tomcat配置里更改,下面是删掉这部分内容的地址
http://localhost:8080/services/HelloWorldTo?wsdl
打开浏览器输入以上地址查看是否能显示wsdl文件内容
如果正常显示以下内容则表示WebService服务已经发布成功
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
<wsdl:definitions xmlns:apachesoap="http://xml.apache.org/xml-soap" xmlns:impl="http://example"
xmlns:intf="http://example" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://example">
<!--
WSDL created by Apache Axis version: 1.4
Built on Apr 22, 2006 (06:55:48 PDT)
-->
<wsdl:types>
<schema xmlns="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" targetNamespace="http://example">
<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="HelloWorldTo">
<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="HelloWorldToSoapBinding" type="impl:HelloWorldTo">
<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="HelloWorldToService">
<wsdl:port binding="impl:HelloWorldToSoapBinding" name="HelloWorldTo">
<wsdlsoap:address location="http://localhost:8080/WebServiceSampleDemo_war_exploded/services/HelloWorldTo"/>
</wsdl:port>
</wsdl:service>
</wsdl:definitions>
客户端
1.使用jdk自带的工具wsimport生成客户端
使用浏览器打开wsdl地址,选择另存为把wsdl文件下载下来,这里以下载到桌面为例
然后打开cmd命令提示符窗口进入桌面目录,输入以下命令
C:\Users\Zhang Wei\Desktop>wsimport HelloWorld.xml -p com.jidd.ws -s D:\WebServiceTest\ -d D:\WebServiceTest\src\
-p:指定目标程序包
-s:指定生成的源文件位置
-d:指定生成的class文件位置
HelloWorld.xml:下载好的wsdl文件
注意:-s、-d指定的文件位置需手动创建好,命令不会自动创建目录
使用wsimport读取本地wsdl文件生成的源文件中,wsdl文件的指向地址也是本地路径,可手动更改为URL地址
修改HelloWorldService.java文件
修改头部注解
1
2
3
4
5
/**
* 读取本地路径修改为网络路径
*/
//@WebServiceClient(name = "HelloWorldService", targetNamespace = "http://example", wsdlLocation = "file:/C:/Users/Zhang%20Wei/Desktop/HelloWorld.xml")
@WebServiceClient(name = "HelloWorldService", targetNamespace = "http://example", wsdlLocation = "http://localhost:8080/services/HelloWorld?wsdl")
修改静态块
1
2
3
4
5
6
7
8
9
10
11
12
13
static {
URL url = null;
WebServiceException e = null;
try {
//读取本地路径修改为网络路径
//url = new URL("file:/C:/Users/Zhang%20Wei/Desktop/HelloWorld.xml");
url = new URL("http://localhost:8080/services/HelloWorld?wsdl");
} catch (MalformedURLException ex) {
e = new WebServiceException(ex);
}
HELLOWORLDSERVICE_WSDL_LOCATION = url;
HELLOWORLDSERVICE_EXCEPTION = e;
}
出现如下过程则解析完毕
C:\Users\Zhang Wei\Desktop>wsimport HelloWorld.xml -p com.jidd.ws -s D:\WebServiceTest\ -d D:\WebServiceTest\src\
正在解析 WSDL...
正在生成代码...
正在编译代码...
C:\Users\Zhang Wei\Desktop>
2.使用开发工具提供的快捷方式生成
在需要生成文件的文件夹上右键选择“WebServices”—> “Generate Java Code From Wsdl”
在弹出的窗口“Web service esdl url”栏中填入服务端的wsdl地址,然后确定会生成一系列文件
我在service中选择生成文件,目录如下
- service
HelloWorld.wsdl HelloWorld_PortType HelloWorldService HelloWorldServiceLocator HelloWorldSoapBindingStub
测试类
普通java工程
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import service.HelloWorldImplServiceLocator;
import service.HelloWorldService;
public class HelloWorldClient {
public static void main(String[] argv) {
helloMain();
}
public static void helloMain() {
try {
HelloWorldImplServiceLocator locator = new HelloWorldImplServiceLocator();
HelloWorldService service = locator.getHelloWorldImplPort();
//调用服务
String result = service.sayHelloWorldFrom("csssss");
//打印返回结果
System.out.println(result);
} catch (javax.xml.rpc.ServiceException ex) {
ex.printStackTrace();
} catch (java.rmi.RemoteException ex) {
ex.printStackTrace();
}
}
}
Web工程
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import service.HelloWorldServiceLocator;
import service.HelloWorld_PortType;
public class HelloWorldClient {
public static void main(String[] argv) {
helloMain();
}
public static void helloMain() {
try {
HelloWorldServiceLocator locator = new HelloWorldServiceLocator();
HelloWorld_PortType service = locator.getHelloWorld();
//调用服务
String result = service.sayHelloWorldFrom("csssss");
//打印返回结果
System.out.println(result);
} catch (javax.xml.rpc.ServiceException ex) {
ex.printStackTrace();
} catch (java.rmi.RemoteException ex) {
ex.printStackTrace();
}
}
}
使用“wsimport”命令编译的web工程测试类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import service.HelloWorld;
import service.HelloWorldService;
/**
* @Filename: HelloWorldClient
* @Author: Zhang Wei
* @Date: 2019/2/12 14:00
* @Description:
* @History:
*/
public class HelloWorldClient {
public static void main(String[] argv) {
helloMain();
}
public static void helloMain() {
HelloWorldService helloWorldService = new HelloWorldService();
HelloWorld helloWorld = helloWorldService.getHelloWorld();
String str = helloWorld.sayHelloWorldFrom("测试");
System.out.println(str);
}
}