Webserver 基于ws超级简单入门
基于mavn
项目目录结构
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>web_server</groupId>
<artifactId>web_server</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<!-- 要进行jaxws 服务开发 -->
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-frontend-jaxws</artifactId>
<version>3.0.1</version>
</dependency>
<!-- 内置jetty web服务器 -->
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-transports-http-jetty</artifactId>
<version>3.0.1</version>
</dependency>
<!-- 日志实现 -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.12</version>
</dependency>
</dependencies>
</project>
domain包里就是一些实体类而已,没什么好说的
package cxf.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 cxf.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 cxf.server;
import cxf.domain.Car;
import cxf.domain.User;
import javax.jws.WebMethod;
import javax.jws.WebService;
import java.util.List;
@WebService//声明这个接口是webserver接口
public interface IUserServer {
@WebMethod//@WebMethod用于向外公布,它修饰的方法是webservice方法,去掉也没影响的,类似一个注释信息
public String sayHello(String name);
@WebMethod
public List<Car> findCarsByUser(User user);
}
package cxf.server.serverimpl;
import cxf.domain.Car;
import cxf.domain.User;
import cxf.server.IUserServer;
import javax.jws.WebService;
import java.util.ArrayList;
import java.util.List;
@WebService(endpointInterface = "cxf.server.IUserServer",serviceName = "userService")//endpointInterfacewebserver接口的全类名,serviceName 是访问的名称
public class UserserverIMpl implements IUserServer {
// 简单参数传递
public String sayHello(String name) {
return "say"+name;
}
// 复杂参数传递
public List<Car> findCarsByUser(User user) {
if ("xiaoming".equals(user.getUsername())) {
List<Car> cars = new ArrayList<Car>();
Car car1 = new Car();
car1.setId(1);
car1.setCarName("大众途观");
car1.setPrice(200000d);
cars.add(car1);
Car car2 = new Car();
car2.setId(2);
car2.setCarName("现代ix35");
car2.setPrice(170000d);
cars.add(car2);
return cars;
} else {
return null;
}
}
}
接下来就是启动webserver了编写启动类
package cxf.ws;
import cxf.server.IUserServer;
import cxf.server.serverimpl.UserserverIMpl;
import javax.xml.ws.Endpoint;
public class WS_server {
public static void main(String[] args) {
// 使用CXF 将 UserService服务 注册到网络上
// 1 、 服务实现对象
IUserServer userServer=new UserserverIMpl();
// 2、 发布服务地址
String address="http://localhost:9989/userServer";
// 3、 发布服务
Endpoint.publish(address,userServer);
System.out.println("服务已经启动...");
}
}
运行可以看见控制台
在游览器访问地址
这里意思说没有调用
在路径上加上?wsdl可以看到此webserver所提供的方法及其各种参数
接下来写客户端,我这里为了方便把客户端写在一个项目里面,你也可以重新新建一个项目来写
package cxf.ws.client;
import cxf.domain.User;
import cxf.server.IUserServer;
import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
public class WebClient {
public static void main(String[] args) {
JaxWsProxyFactoryBean jaxWsProxyFactoryBean=new JaxWsProxyFactoryBean();
jaxWsProxyFactoryBean.setServiceClass(IUserServer.class);
jaxWsProxyFactoryBean.setAddress("http://localhost:9989/userServer");
// 创建调用远程服务代理对象
IUserServer proxy= (IUserServer) jaxWsProxyFactoryBean.create();
// 调用代理对象 任何一个方法,都将通过网络 调用web服务
String helloName = proxy.sayHello("张三");
System.out.print(helloName);
System.out.print("\r\n");
User user = new User();
user.setUsername("xiaoming");
System.out.println(proxy.findCarsByUser(user));
}
}
我们通过JaxWsProxyFactoryBean 来构建一个IUserServer的代理对象
传入两个基本参数
jaxWsProxyFactoryBean.setServiceClass(IUserServer.class);
jaxWsProxyFactoryBean.setAddress("http://localhost:9989/userServer");
通过create()方法获得代理对象
这样就可以调用IUserServer里面的方法了
喜欢的小伙伴可以去主页下载全部代码。