webService是用于解决分布式系统通信的一种解决方案。Apachecxf是当前主流的webService开发框架,由Apache提供。
Apachecxf的webService开发,主要分为两种服务提供方式:Ws和Rs。JAX-WS传输数据使用的是xml格式,基于soap协议,而JAX-RS传输数据使用的是xml或者json,基于http协议。首先,来看一下JAX-WS的独立服务使用:
1.建立一个maven的java项目

2.在项目中导入cxf的jar包

使用maven的坐标
<!-- 使用jax-ws进行开发 --> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-frontend-jaxws</artifactId> <version>3.0.1</version> </dependency> <!-- 内置jetty服务器 --> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-transports-http-jetty</artifactId> <version>3.0.1</version> </dependency>
3.编写服务器端程序
编写实体类
package com.xx.cn.cxf_ws__helloworld.domain;
public class Car {
private Integer id;
private String carName;
private Double price;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getCarName() {
return carName;
}
public void setCarName(String carName) {
this.carName = carName;
}
public Double getPrice() {
return price;
}
public void setPrice(Double price) {
this.price = price;
}
@Override
public String toString() {
return "Car [id=" + id + ", carName=" + carName + ", price=" + price + "]";
}
}
package com.xx.cn.cxf_ws__helloworld.domain;
import java.util.ArrayList;
import java.util.List;
public class User {
private Integer id;
private String username;
private String city;
private List<Car> cars = new ArrayList<Car>();
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public List<Car> getCars() {
return cars;
}
public void setCars(List<Car> cars) {
this.cars = cars;
}
}
编写服务
package com.xx.cn.cxf_ws__helloworld.service;
import java.util.List;
import javax.jws.WebMethod;
import javax.jws.WebService;
import com.xx.cn.cxf_ws__helloworld.domain.Car;
import com.xx.cn.cxf_ws__helloworld.domain.User;
//编写webService服务器端接口
@WebService
public interface IUserService {
@WebMethod
public String sayHello(String name);
@WebMethod
public List<Car> findCarsByUser(User user);
}
package com.xx.cn.cxf_ws__helloworld.service;
import java.util.ArrayList;
import java.util.List;
import javax.jws.WebService;
import com.xx.cn.cxf_ws__helloworld.domain.Car;
import com.xx.cn.cxf_ws__helloworld.domain.User;
//编写webService接口实现类
@WebService(endpointInterface="com.xx.cn.cxf_ws__helloworld.service.IUserService",serviceName="userService")
public class IUserServiceImpl implements IUserService{
public String sayHello(String name) {
// 简单参数传递
return "Hello" + name;
}
public List<Car> findCarsByUser(User user) {
// 复杂参数传递
List<Car> cars = new ArrayList<Car>();
Car car = new Car();
car.setId(1);
car.setCarName("大众");
car.setPrice(200000d);
cars.add(car);
user.setCars(cars);
return cars;
}
}
发布服务
package com.xx.cn.cxf_ws__helloworld.server;
import javax.xml.ws.Endpoint;
import com.xx.cn.cxf_ws__helloworld.service.IUserService;
import com.xx.cn.cxf_ws__helloworld.service.IUserServiceImpl;
//发布jax_ws服务
public class CXFServer {
public static void main(String[] args) {
//服务实现对象
IUserService userService = new IUserServiceImpl();
//发布服务地址
String address = "http://localhost:9909/userService";
//发布服务
Endpoint.publish(address, userService);
System.out.println("服务已经启动...");
}
}
服务访问地址
http://localhost:9909/userService?wsdl
编写客户端操作
package com.xx.cn.cxf_ws__helloworld.client;
import org.apache.cxf.interceptor.LoggingInInterceptor;
import org.apache.cxf.interceptor.LoggingOutInterceptor;
import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
import com.xx.cn.cxf_ws__helloworld.service.IUserService;
//WS客户端
public class WSClient {
public static void main(String[] args) {
//编写客户端调用发布的webService服务
JaxWsProxyFactoryBean jaxWsProxyFactoryBean = new JaxWsProxyFactoryBean();
jaxWsProxyFactoryBean.setAddress("http://localhost:9909/userService");
jaxWsProxyFactoryBean.setServiceClass(IUserService.class);
//添加日志监控
jaxWsProxyFactoryBean.getInInterceptors().add(new LoggingInInterceptor());
jaxWsProxyFactoryBean.getOutInterceptors().add(new LoggingOutInterceptor());
//创建远程代理对象
IUserService proxy = (IUserService) jaxWsProxyFactoryBean.create();
//调用代理对象任何一个方法,都将通过网络调用web服务
System.out.println(proxy.sayHello("琼华派"));
}
}
接下来,介绍一下WS整合spring进行开发
1.建立mavenweb工程

2.基于maven导入坐标
<dependencies> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-frontend-jaxws</artifactId> <version>3.0.1</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>4.1.7.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>4.1.7.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>4.1.7.RELEASE</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>tomcat-maven-plugin</artifactId> <version>1.1</version> <configuration> <port>9800</port> </configuration> </plugin> </plugins> </build>
3.配置web.xml文件
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"> <!-- spring配置文件位置 --> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:applicationContext.xml</param-value> </context-param> <!-- spring核心监听器 --> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <servlet> <servlet-name>CXFService</servlet-name> <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>CXFService</servlet-name> <url-pattern>/services/*</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> <welcome-file>default.html</welcome-file> <welcome-file>default.htm</welcome-file> <welcome-file>default.jsp</welcome-file> </welcome-file-list> </web-app>
4.导入先前写好的domain和service
5.在spring中配置cxf服务发布
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jaxws="http://cxf.apache.org/jaxws" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd"> <!-- address:客户端访问服务路径 serviceClass:配置接口 serviceBean:配置实现类 --> <jaxws:server id="userService" address="/userService" serviceClass="com.xx.cn.cxf_ws__helloworld.service.IUserService"> <jaxws:serviceBean> <bean class="com.xx.cn.cxf_ws__helloworld.service.IUserServiceImpl" /> </jaxws:serviceBean> </jaxws:server> </beans>
访问地址
http://localhost:9800/cxf_ws__spring/services/userService?wsdl
6.整合spring,编写客户端
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jaxws="http://cxf.apache.org/jaxws" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd"> <jaxws:client id="userServiceClient" serviceClass="com.xx.cn.cxf_ws__helloworld.service.IUserService" address="http://localhost:9800/cxf_ws__spring/services/userService" > <jaxws:inInterceptors> <bean class="org.apache.cxf.interceptor.LoggingInInterceptor"/> </jaxws:inInterceptors> <jaxws:outInterceptors> <bean class="org.apache.cxf.interceptor.LoggingOutInterceptor" /> </jaxws:outInterceptors> </jaxws:client> </beans>
package cxf_ws__spring.test;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import com.xx.cn.cxf_ws__helloworld.domain.User;
import com.xx.cn.cxf_ws__helloworld.service.IUserService;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:applicationContext-test.xml")
public class UserService_WS_Test {
@Autowired
@Qualifier("userServiceClient")
private IUserService userService;
@Test
public void testCall() {
System.out.println(userService.sayHello("琼华派"));
User user = new User();
user.setUsername("xiaoming");
System.out.println(userService.findCarsByUser(user));
}
}