近日学习WebService,初步写了一个简单的案例,使用cxf框架开发webservice接口
首先,,导入maven依赖
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-core</artifactId>
<version>3.0.1</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-frontend-jaxws</artifactId>
<version>3.0.1</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-transports-http-jetty</artifactId>
<version>3.0.1</version>
</dependency>
依赖导入后,进行接口的开发
service
package com.qianfeng.service;
import javax.jws.WebService;
@WebService
public interface WeatherService {
String getWeather(String cityName);
}
接口实现类
package com.qianfeng.service;
import javax.jws.WebService;
@WebService
public class WeatherServiceImpl implements WeatherService {
public String getWeather(String cityName) {
return cityName+":晴";
}
}
发布webservice接口
package com.qianfeng.server;
import com.qianfeng.service.WeatherService;
import com.qianfeng.service.WeatherServiceImpl;
import org.apache.cxf.jaxws.JaxWsServerFactoryBean;
public class WeatherServer {
public static void main(String[] args) {
JaxWsServerFactoryBean factoryBean=new JaxWsServerFactoryBean();
factoryBean.setAddress("http://localhost:9595/weather");
factoryBean.setServiceClass(WeatherService.class);
factoryBean.setServiceBean(new WeatherServiceImpl());
factoryBean.create();
}
}
接下来是客户端的编写,客户端导入的依赖与服务端相同
import java.util.Arrays;
public class WebClient {
public static void main(String[] args) throws Exception {
JaxWsDynamicClientFactory factory=JaxWsDynamicClientFactory.newInstance();
Client client = factory.createClient("http://localhost:9595/weather?wsdl");
Object[] s = client.invoke("getWeather","北京");
System.out.println(Arrays.asList(s));
}
}
这里使用的是动态调用,也有一种静态调用的方法,静态调用的话需要在客户端也有一个与服务端相同的接口才行,具体的代码如下
package com.qianfeng.client;
import com.qianfeng.service.WeatherService;
import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
public class WebClient1 {
public static void main(String[] args) {
JaxWsProxyFactoryBean factoryBean=new JaxWsProxyFactoryBean();
factoryBean.setAddress("http://localhost:9595/weather?wsdl");
factoryBean.setServiceClass(WeatherService.class);
WeatherService weatherService = factoryBean.create(WeatherService.class);
String s = weatherService.getWeather("北京");
System.out.println(s);
}
}
两者的区别:
静态调用需要依赖service,因为客户端调用cxf webservice接口的过程中需要服务器端提供service,需要使用cxf工具将webservice的class类生成到本地,引入到项目代码中,从而调用相应的接口方法,很不方便
动态调用完全不依赖service,服务器端只要提供路径和接口方法名称就可以方便调用。