一、背景
WebService基本概念
Web Service也叫XML Web Service,WebService是一种可以接收从Internet或者Internet上的其它系统中传递过来的请求,轻量级的独立的通讯技术。是:通过SOAP在Web上提供的软件服务,使用WSDL文件进行说明,并通过UDDI进行注册。
XML:(Extensible Markup Language)扩展型可标记语言。面向短期的临时数据处理、面向万维网络,是Soap的基础。
Soap:(Simple Object Access Protocol)简单对象存取协议。是XML Web Service 的通信协议。当用户通过UDDI找到你的WSDL描述文档后,他通过可以SOAP调用你建立的Web服务中的一个或多个操作。SOAP是XML文档形式的调用方法的规范,它可以支持不同的底层接口,像HTTP(S)或者SMTP。
WSDL:(Web Services Description Language) WSDL 文件是一个 XML 文档,用于说明一组 SOAP 消息以及如何交换这些消息。大多数情况下由软件自动生成和使用。
UDDI (Universal Description, Discovery, and Integration) 是一个主要针对Web服务供应商和使用者的新项目。在用户能够调用Web服务之前,必须确定这个服务内包含哪些商务方法,找到被调用的接口定义,还要在服务端来编制软件,UDDI是一种根据描述文档来引导系统查找相应服务的机制。UDDI利用SOAP消息机制(标准的XML/HTTP)来发布,编辑,浏览以及查找注册信息。它采用XML格式来封装各种不同类型的数据,并且发送到注册中心或者由注册中心来返回需要的数据。
自己按照网上参考搭建了一遍CXF环境。过程中也有遇到的问题,也做了简单的整理。
对于CXF是干什么用的,我不想多说,大家都知道这是我们在Java编程中webService技术的一种实现工具。我们说说为什么用CXF来实现webService:
Java的webService实现本身就是一个很耗性能的实现方案(xml与java对象之间在服务端以及客户端的互转比较消耗性能)
目前java主流的webService应用以CXF、AXIS2为主;
通过网络渠道的了解,目前CXF的效率要比AXIS2高出至少50%;
另外有一个webService的工具metro的效率比CXF高出10%;
CXF的实现资料网上可以随便找出一大堆,metro的资料相对少一些;
CXF在java应用实现中已经很成熟,企业更倾向于用这样一个成熟的解决方案;
基于以上原因,我选择CXF来实现webService。
二、 以annotation注解方式实现发布webService应用
首先先建好Web Service工程如下:
1.png 点击finish创建完成下图是我配置完成后的整个工程目录,这是我们接下来的目标:
工程目录1、 基础环境
新建java web工程cxf之后,下载cxf工具包。解压CXF之后,把cxf工具包lib下的jar包全部放到工程的lib下。
此处用到的cxf工具包版本为:apache-cxf-3.1.12(我选择的是3.1.12的,大家可以参考,我选择的是最高版本的)
下载地址:http://cxf.apache.org/download.html
2、 编写服务接口
见文件HelloWorld.java
package com.cetc50.server;
import java.util.List;
import javax.jws.WebParam;
import javax.jws.WebService;
import com.cetc50.user.User;
@WebService
public interface HelloWorld {
String sayHi(@WebParam(name="text")String text);
String sayHiToUser(User user);
String[] SayHiToUserList(List<User> userList);
}
3、 服务接口实现
见文件HelloWorldImpl.java
package com.cetc50.server;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import javax.jws.WebParam;
import javax.jws.WebService;
import com.cetc50.user.User;
@WebService(endpointInterface="com.cetc50.server.HelloWorld",serviceName="HelloWorld")
public class HelloWorldImpl implements HelloWorld {
Map<Integer, User> users = new LinkedHashMap<Integer, User>();
public String sayHi(@WebParam(name = "text") String text) {
return "Hello,"+text;
}
public String sayHiToUser(User user) {
users.put(users.size()+1, user);
return "Hello,"+user.getName();
}
public String[] SayHiToUserList(List<User> userList) {
String[] result = new String[userList.size()];
int i = 0;
for(User u:userList){
result[i] = "Hello " + u.getName();
i++;
}
return result;
}
}
4、 发布服务app
见文件webServiceApp.java
package com.cetc50.server;
import javax.xml.ws.Endpoint;
public class webServiceApp {
public static void main(String[] args) {
System.out.println("web service start");
HelloWorldImpl implementor= new HelloWorldImpl();
String address="http://localhost:8080/helloWorld";
Endpoint.publish(address, implementor);
System.out.println("web service started");
}
}
选中webServiceApp.java,右键 Run As 选择Java Application发布服务;然后在浏览器输入地址:http://localhost:8080/helloWorld?wsdl
出现下图说明webService服务发布成功。
问题来了:
刚开始按照网上参考步骤做了,结果在发布时出现如下很长一串英文错误:DefaultValidationEventHandler: [ERROR]: prefix wsdp is not bound to a namespace
Location: node: [wsd:Types: null]
解决办法:经过在网上查阅是因为我在引入CXF的jar包时,全加进去了,在lib中找到如下四个jar包,删除即可。
再次选中webServiceApp.java,右键 Run As 选择Java Application发布服务;然后在浏览器输入地址:http://localhost:8080/helloWorld?wsdl , 就会露出喜悦的表情,嘿嘿嘿!!!
5、 客户端访问服务
见文件HelloWorldClient.java
package com.cetc50.client;
import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
import com.cetc50.server.HelloWorld;
import com.cetc50.user.User;
public class HelloWorldClient {
public static void main(String[] args) {
//首先右键run as 运行com.cetc50.server.webServiceApp类,然后再运行这段客户端代码
JaxWsProxyFactoryBean jwpfb = new JaxWsProxyFactoryBean();
jwpfb.setServiceClass(HelloWorld.class);
jwpfb.setAddress("http://localhost:8080/helloWorld");
HelloWorld hw = (HelloWorld) jwpfb.create();
User user = new User();
user.setName("马克思");
user.setDescription("怀念马克思");
System.out.println(hw.sayHiToUser(user));
}
}
选中HelloWorldClient.java,右键 Run As 选择Java Application运行,控制台会打印如下图:
客户端访问也成功啦6、 不能忘记了User.java文件
package com.cetc50.user;
import java.io.Serializable;
@SuppressWarnings("serial")
public class User implements Serializable {
private String id;
private String name;
private String age;
private String description;
public User() {
super();
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
}
此篇实现了webService服务的发布以及在本工程下的客户端调用服务的示例并不是很直观,欢迎学习和指导。
本文参照了:CXF实现webService服务(一)
网友评论