Restful的编程风格
Restful的概述
1. 概述
* 一种软件架构风格,设计风格而不是标准,只是提供了一组设计原则和约束条件。
* 它主要用于客户端和服务器交互类的软件。
* 基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。
2. JaxRs的WebService服务发布方式就是采用的Restful的风格。
使用JaxRs规范发布Restful风格的WebService服务
1. 创建Maven工程,导入如下坐标依赖
<dependencies>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-frontend-jaxrs</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>
<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>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-rs-extension-providers</artifactId>
<version>3.0.1</version>
</dependency>
<dependency>
<groupId>org.codehaus.jettison</groupId>
<artifactId>jettison</artifactId>
<version>1.3.7</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.10</version>
<scope>test</scope>
</dependency>
</dependencies>
2. 从资料中导入User和Car的类(强调:从jaxrs的素材中导入)
* @XmlRootElement(name = "Car"),以后把User类转换成XML格式的数据时候,Car作为根节点,例如
<Car>
<id>1</id>
</Car>
3. 从资料中导入service接口和serviceImpl实现类(强调:从jaxrs的素材中导入)
* @Path("/userService") -- 请求的路径
* @Produces("*/*") -- 响应的MIME类型
* @POST -- 请求方式,适合于新增
* @PUT -- 请求方式,适合于修改
* @GET -- 请求方式,适合于查询
* @DELETE -- 请求方式,适合于删除
* @Path("/user/{id}") -- 查询id为xxx的对象,例如:/user/1 查询id为1的用户
* @Consumes({ "application/xml", "application/json" }) -- 客户端发送的参数类型
4. 编写服务端发布WebService
/**
* 发布服务
* @author Administrator
*/
public class Server {
public static void main(String[] args) {
// 创建服务器工厂对象
JAXRSServerFactoryBean bean = new JAXRSServerFactoryBean();
// 设置实体类,可以帮助转换json字符串
bean.setResourceClasses(User.class,Car.class);
// 设置请求地址
bean.setAddress("http://localhost:12345");
// 设置实现类
bean.setServiceBean(new UserServiceImpl());
// 开启服务
bean.create();
}
}
5. 客户端的程序
@Test
public void run1(){
User user = new User();
user.setId(1);
user.setUsername("aaa");
WebClient.create("http://localhost:12345/userService/user").type(MediaType.APPLICATION_XML).post(user);
}
Spring整合JaxRs规范的WebService
Spring整合JaxRs
1. 创建Maven项目,导入坐标依赖
<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>
2. 导入相关的domain和service
3. 把 UserService接口的 @Path("/userService") 注释掉,因为准备使用配置文件来描述路径
4. 编写配置文件
<bean id="userService" class="cn.itcast.service.UserServiceImpl"/>
<jaxrs:server address="/userService">
<jaxrs:serviceBeans>
<ref bean="userService"/>
</jaxrs:serviceBeans>
</jaxrs:server>
5. 在web.xml配置文件配置Spring的监听器,服务器启动,就加载applicationContext.xml配置文件
* 加载Spring配置文件的监听器
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext-cxf.xml</param-value>
</context-param>
* 配置CXF的Servlet程序
<servlet>
<servlet-name>cxf</servlet-name>
<servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>cxf</servlet-name>
<url-pattern>/ws/*</url-pattern>
</servlet-mapping>
6. 编写客户端的代码
@Test
public void run1(){
User user = new User();
user.setId(1);
user.setUsername("aaa");
// WebClient.create("http://localhost:8080/demo1/ws/userService/user").type(MediaType.APPLICATION_XML).post(user);
// WebClient.create("http://localhost:8080/demo1/ws/userService/user").type(MediaType.APPLICATION_XML).put(user);
User u = WebClient.create("http://localhost:8080/demo1/ws/userService/user/1").accept(MediaType.APPLICATION_XML).get(User.class);
System.out.println(u);
}