基于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、测试


 

posted @ 2019-06-28 10:58  手握钢叉的猹  阅读(4779)  评论(2编辑  收藏  举报