“Web Services:简单的Java示例”的版本间差异
跳到导航
跳到搜索
(建立内容为“category:Web Services == 关于 == 一个完整的Web服务包括以下步骤: # Web服务提供者设计实现Web服务,并将调试正确后的Web服…”的新页面) |
(→关于) |
||
第3行: | 第3行: | ||
== 关于 == | == 关于 == | ||
一个完整的Web服务包括以下步骤: | 一个完整的Web服务包括以下步骤: | ||
# | # “Web 服务提供者”设计实现 Web 服务,并将调试正确后的 Web 服务通过“Web 服务中介者”发布,并在 '''UDDI''' 注册中心注册; (发布) | ||
# | # “Web 服务请求者”向“Web 服务中介者”请求特定的服务,中介者根据请求查询 UDDI 注册中心,为请求者寻找满足请求的服务; (发现) | ||
# | # “Web 服务中介者”向“Web 服务请求者”返回满足条件的 Web 服务描述信息,该描述信息用 '''WSDL''' 写成,各种支持 Web 服务的机器都能阅读;(发现) | ||
# | # 利用从 Web 服务中介者返回的描述信息生成相应的 '''SOAP''' 消息,发送给“Web 服务提供者”,以实现 Web 服务的调用;(绑定) | ||
# | # Web 服务提供者按 SOAP 消息执行相应的 Web 服务,并将服务结果返回给“Web 服务请求者”。(绑定) | ||
2021年6月4日 (五) 01:22的版本
关于
一个完整的Web服务包括以下步骤:
- “Web 服务提供者”设计实现 Web 服务,并将调试正确后的 Web 服务通过“Web 服务中介者”发布,并在 UDDI 注册中心注册; (发布)
- “Web 服务请求者”向“Web 服务中介者”请求特定的服务,中介者根据请求查询 UDDI 注册中心,为请求者寻找满足请求的服务; (发现)
- “Web 服务中介者”向“Web 服务请求者”返回满足条件的 Web 服务描述信息,该描述信息用 WSDL 写成,各种支持 Web 服务的机器都能阅读;(发现)
- 利用从 Web 服务中介者返回的描述信息生成相应的 SOAP 消息,发送给“Web 服务提供者”,以实现 Web 服务的调用;(绑定)
- Web 服务提供者按 SOAP 消息执行相应的 Web 服务,并将服务结果返回给“Web 服务请求者”。(绑定)
创建服务端/客户端项目,项目可以是 Java Web 项目,也可以是普通的 Java 项目:
服务端
- 通过 javax.jws.WebService 注解提供服务;
- 通过 javax.xml.ws.Endpoint 类的 publish 方法来发布服务,并提供发布的地址以及发布的服务类;
代码:
package com.eijux.wsServer;
import javax.jws.WebService;
import javax.xml.ws.Endpoint;
@WebService
public class Function {
// 可以显示指定服务的“operationName”(client中调用)
@WebMethod(operationName="sayHello1")
public String sayHello(String userName)
{
return "Hello,"+userName+"!";
}
@WebMethod(operationName="sayHello2")
public String sayHello(){
return "Hello World!";
}
// 如果不指定“operationName”,则与方法名相同
@WebMethod
public String transWords(String words){
String res = "";
for(char ch : words.toCharArray()){
res += ch+",";
}
return res;
}
public static void main(String[] args) {
// 使用Endpoint(终端)类发布webservice
Endpoint.publish("http://localhost:8089/service/function", new Function());
System.out.println("Publish Success");
}
}
服务发布成功后,访问发布的地址:
点击链接,打开 WSDL 配置:
客户端
通过工具生成客户端代码:
- 命令行工具:
wsimport -d .class文件的输出目录 -s .java文件的输出目录 -p “生成类所在包名” -keep “wsdl发布地址”
- 示例:
wsimport -s D:\Workspaces\JAVA\TheClient\src -p com.eijux.wsClient -keep http://localhost:9095/service/function?wsdl
- Eclipse工具:
代码:
package com.eijux.wsClientTest;
import javax.rmi.RemoteException;
import javax.xml.rpc.ServiceExceptipn;
// 如果 Client 与生成的代码不在同一目录,需要引入对应的包
// 需要引入的包在生成代码中
import com.eijux.wsServer.Function;
import com.eijux.wsServer.FunctionService;
import com.eijux.wsServer.FunctionServiceLocator;
public class TestWs {
public static void main(String[] args){
try{
//Function f = new FunctionService().getFunctionPort();
Function f = new FunctionServiceLocator().getFunctionPort();
System.out.println(f.sayHello1("eijux"));
System.out.println(f.sayHello2(""));
System.out.println(f.getValue("zl"));
}
catch(ServiceExceptipn e){
e.printStackTrace();
}
catch(RemoteException e){
e.printStackTrace();
}
}
}
FAQ
可能的异常:
- 服务端:
runtime modeler error: Wrapper class com.eijux.wsServer.jaxws.GetValue is not found. Have you run APT to generate them?
- JDK 版本过低(低于1.6.0_17):调整该服务端项目所引用的 JDK 版本。
- 生成命令:
directory not found: D:\Workspaces\JAVA\The Client\src
- 路径有空格。
- 生成命令:
[ERROR] failed.noservice=Could not find wsdl:service in the provided WSDL(s):
- 生成命令的“wsdl发布地址”末尾缺少“?wsdl”。