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;}@Overridepublic 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服务器端接口@WebServicepublic interface IUserService {@WebMethodpublic String sayHello(String name);@WebMethodpublic 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.xsdhttp://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.xsdhttp://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;@Testpublic void testCall() {System.out.println(userService.sayHello("琼华派"));User user = new User();user.setUsername("xiaoming");System.out.println(userService.findCarsByUser(user));}}
webService的简单使用
原文地址:https://www.cnblogs.com/god-1949-keshi/p/8283948.html