基于JAX-RS规范的webService入门
1、WebService概述
1.1、什么是WebService?
WebService(WEB服务)能够快捷和方便地综合结合各种系统、商务和任何应用平台。利用最新的WebService标准能够使任何软件系统和系统之间的应用互通互联,方便而且廉价。
2、WebService的三个规范:
Java中共有三种WebService规范,分别是Jax-WS(操作过于繁琐)、Jax-RS、JAXM&SAAJ(废弃)
3、Apache的CXF
Apache CXF = Celtix + Xfire,开始叫Apache CeltiXfire,后来改名为Apache CXF了,以下简称CXF。Apache CXF是一个开源的web service框架,CXF帮助您构建和开发web service,它支持多种协议,如SOAP1.1,2 XML/HTTP、RESTful或者CORBA。
RESTful:一种风格而不是一个协议。它理念上是网络上的所有事务都被抽象化为资源,每个资源对应一个唯一的资源标识符。
灵活部署:可以运行在Tomcat,Jboss,Jetty(内置),webLogic上面。
4、基于JAX-RS规范的入门
4.1、JAX-RS介绍
JAX-RS是一个是Java编程语言接口,被设计用来简化使用REST架构的应用程序开发
JAX=RS API使用Java编程语言的注解来简化RESTful web Service的开发。开发人员使用JAX-RS的注解修饰Java编程语言的类文件来定义资源和能够应用在资源上的行为。JAX-RS的注解是运行时的注解,因此运行的映射会为资源生成辅助类和其他的辅助文件。包含JAX-RS资源类的Java EE应用程序中资源时被配置好的。辅助类和辅助文件是生成的,资源通过被发布到Java EE 服务器上 来公开给客户端。下表列出了JAX-RS定义的一些Java注解以及怎样使用他们的简要的描述。
4.2、RESTful的注解说明
5、基于JAX-RS的webService服务器端代码实现
Spring与jaxrs整合实现
5.1、创建一个空的JavaSE工程
步骤略
5.2、创建子工程,工程类型Maven工程
工程名称jaxrs-server,步骤略
5.3、在该项目pom文件中导入坐标
<dependencies> <!-- cxf 进行rs开发 必须导入 --> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-frontend-jaxrs</artifactId> <version>3.0.1</version> </dependency> <!-- 日志引入 --> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.7.12</version> </dependency> <!-- 客户端 --> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-rs-client</artifactId> <version>3.0.1</version> </dependency> <!-- 扩展json提供者 --> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-rs-extension-providers</artifactId> <version>3.0.1</version> </dependency> <!-- 转换json工具包,被extension providers 依赖 --> <dependency> <groupId>org.codehaus.jettison</groupId> <artifactId>jettison</artifactId> <version>1.3.7</version> </dependency> <!-- spring 核心 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>4.2.4.RELEASE</version> </dependency> <!-- spring web集成 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>4.2.4.RELEASE</version> </dependency> <!-- spring 整合junit --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>4.2.4.RELEASE</version> </dependency> <!-- junit 开发包 --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> </dependency> </dependencies>
5.4、编写实体类domain
User.java
import java.util.ArrayList; import java.util.List; import javax.xml.bind.annotation.XmlRootElement; @XmlRootElement(name = "User") 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; } @Override public String toString() { return "User [id=" + id + ", username=" + username + ", city=" + city + ", cars=" + cars + "]"; } }
Car.java
import javax.xml.bind.annotation.XmlRootElement; @XmlRootElement(name = "Car") 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 + "]"; } }
5.5、编写Service
IUserService.java接口
import java.util.List; import javax.ws.rs.Consumes; import javax.ws.rs.DELETE; import javax.ws.rs.GET; import javax.ws.rs.POST; import javax.ws.rs.PUT; import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.Produces; import cn.itcast.domain.User; @Path("/userService")//基础访问路径,如果不写则需要在spring配置文件中指定基础访问路径,配置的内容如5.6部分所示 @Produces("*/*") public interface IUserService { @POST//匹配请求方式 @Path("/user")//匹配请求路径 @Consumes({ "application/xml", "application/json" })//匹配请求的参数类型 public void saveUser(User user); @PUT @Path("/user") @Consumes({ "application/xml", "application/json" }) public void updateUser(User user); @GET//匹配请求方式 @Path("/user")//匹配请求路径 @Produces({ "application/xml", "application/json" })//指定返回的数据类型 public List<User> findAllUsers(); @GET @Path("/user/{id}") @Consumes("application/xml") @Produces({ "application/xml", "application/json" }) public User finUserById(@PathParam("id") Integer id); @DELETE @Path("/user/{id}") @Consumes({"application/xml", "application/json"}) public void deleteUser(@PathParam("id") Integer id); }
UserServiceImpl.java实现类
import java.util.ArrayList; import java.util.List; import cn.itcast.domain.Car; import cn.itcast.domain.User; public class UserServiceImpl implements IUserService { public void saveUser(User user) { System.out.println("save user:" + user); } public void updateUser(User user) { System.out.println("update user:" + user); } public List<User> findAllUsers() { List<User> users = new ArrayList<User>(); User user1 = new User(); user1.setId(1); user1.setUsername("小明"); user1.setCity("北京"); List<Car> carList1 = new ArrayList<Car>(); Car car1 = new Car(); car1.setId(101); car1.setCarName("保时捷"); car1.setPrice(1000000d); carList1.add(car1); Car car2 = new Car(); car2.setId(102); car2.setCarName("宝马"); car2.setPrice(400000d); carList1.add(car2); user1.setCars(carList1); users.add(user1); User user2 = new User(); user2.setId(2); user2.setUsername("小丽"); user2.setCity("上海"); users.add(user2); return users; } public User finUserById(Integer id) { if (id == 1) { User user1 = new User(); user1.setId(1); user1.setUsername("小明"); user1.setCity("北京"); return user1; } return null; } public void deleteUser(Integer id) { System.out.println("delete user id :" + id); } }
5.6、在applicationContext.xml中配置jaxrs的基础访问路径
参数address就是基础访问路径。
<?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:cxf="http://cxf.apache.org/core" xmlns:jaxws="http://cxf.apache.org/jaxws" xmlns:jaxrs="http://cxf.apache.org/jaxrs" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://cxf.apache.org/core http://cxf.apache.org/schemas/core.xsd http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd http://cxf.apache.org/jaxrs http://cxf.apache.org/schemas/jaxrs.xsd ">
<!--此处的address就是基础访问路径,和服务接口中的@Path("/userService")效果相同--> <jaxrs:server address="/userService" serviceClass="com.alibaba.service.UserServiceImpl"/> </beans>
此处加载服务service实现类到Spring容器中。
5.7、在web.xml指定加载Spring配置文件并将CXF核心控制器加载进Spring容器中,该控制器就是一个Servlet
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1"> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:applicationContext.xml</param-value> </context-param> <!--CXF核心控制器--> <servlet> <servlet-name>cxfServlet</servlet-name> <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>cxfServlet</servlet-name> <url-pattern>/ws/*</url-pattern> </servlet-mapping> </web-app>
5.8、进入浏览器测试数据请求
访问路径(以自己的实际情况为准)
http://localhost:8081/jaxrs_server_war_exploded/ws/userService/user/1
CXF会接收以/ws/开头的请求,并且会自动根据请求的路径去匹配service接口中的路径调用相应的方法并返回指定结果。
6、基于JAX-RS的webService客户端端代码实现
6.1、创建jax_clientweb工程
步骤略
6.2、导入坐标,和服务器端一样的pom坐标
坐标略
6.3、创建实体类,将服务器端的实体类复制粘贴到客户端的实体类路径中,不一定和服务器端的实体类路径一致
过程略
6.4、编写junit测试类
import org.apache.cxf.jaxrs.client.WebClient; import org.junit.Test; import javax.ws.rs.core.MediaType; public class TestDemo { @Test public void test() {
//获取服务器数据
User user = WebClient.create("http://localhost:8081/jaxrs_server_war_exploded/ws/userService/user/1").type(MediaType.APPLICATION_XML).get(User.class);
System.out.println(user);
//向服务器发送带参数的数据获取请求,参数类型和参数user
WebClient.create("http://localhost:8081/jaxrs_server_war_exploded/ws/userService/user").type(MediaType.APPLICATION_XML).post(user);
} }
6.5、测试
略
完