Jersey RESTful 框架是开源的RESTful框架, 实现了JAX-RS (JSR 311 & JSR 339) 规范。它扩展了JAX-RS 参考实现, 提供了更多的特性和工具, 可以进一步地简化 RESTful service 和 client 开发。
Jersey入门案例:
Jersey是一个REST框架,有很多相关概念会与SpringMVC实现RESTful相似,所以我们可以对比着学习,Jersey还有一个特点就是,基于Jersey的REST应用,可以运行在Servlet环境下面,也可以脱离该环境。 下面将使用两种方式实现Jersey的入门。
一、基于Servlet容器
创建一个web项目,项目结构如下
在pom.xml中只需要引入一个Jersey的Servlet容器依赖
<dependency>
<groupId>org.glassfish.jersey.containers</groupId>
<artifactId>jersey-container-servlet</artifactId>
<version>2.25</version>
</dependency>
然后在web.xml文件中添加Jersey的拦截器
<servlet>
<servlet-name>JerseyServletContainer</servlet-name>
<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
<init-param>
<!-- jersey.config.server.provider.packages 用于扫描Jersey服务类所在的包-->
<param-name>jersey.config.server.provider.packages</param-name>
<param-value>com.hnhe.jersey</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>JerseyServletContainer</servlet-name>
<url-pattern>/api/*</url-pattern>
</servlet-mapping>
其中ServletContainer即为核心控制器,jersey.config.server.provider.packages参数用于扫描jersey中REST服务类所在的包,有点类似于SpringMVC的包扫描,而 配置的/api/* 项目服务总体前缀。
定义rest服务类
@Path("service")
public class JerSeyDemo {
@GET // request method
@Produces(MediaType.TEXT_PLAIN)
@Path("/go")
public String go(){
return "demo go go go";
}
}
- 主要该类必须是之前配置的路径下的包,确保能被扫描到。
- 在类上面添加了@Path(“service”),代表资源根路径为service,类似于SpringMVC中在类上面添加@RequestMapping(“service”);
- 方法go上面添加了两个标签,@GET标签代表该方法接受GET类型请求,类似于SpringMVC中的@GetMapping标签;
- @Produces标签代表该方法的响应MIME类型为text/plain,类似于@RequestMapping中的produces属性;如果@Produces的类型是MediaType.APPLICATION_JSON,则需要引入相关的依赖,否则报错。
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-json-jackson</artifactId>
<version>2.25</version>
</dependency>
- 该方法返回String,这个String值Jersey会自动按照text/plain格式输出。
添加tomcat服务,部署项目发布
访问http://localhost:8080/JerseyProDemo/api/service/go
二、使用内置容器
Jersey提供了在SE环境下的部署,即使用内置的服务器来发布REST服务。提供了对Jetty,JDK HttpServer,Grizzly HttpServer,和一个内置的Simple HttpServer来部署。下面简单来看一下使用Jetty发布Jersey服务的例子:
在pom.xml文件中添加jetty依赖
<--!该依赖里面包含了jetty相关的jar包及jersey-jetty相关发布依赖-->
<dependency>
<groupId>org.glassfish.jersey.containers</groupId>
<artifactId>jersey-container-jetty-http</artifactId>
<version>2.21</version>
</dependency>
创建一个类用于设置发布环境
import org.glassfish.jersey.server.ResourceConfig;
/**
*ResourceConfig 是Jersey 中用于配置应用资源类
* 在Jersey中 把所有提供rest服务的类 都称为资源类
*/
public class RestApplication extends ResourceConfig {
public RestApplication(){
this.packages("com.hnhe.jersey");
}
}
- ResourceConfig类继承了Application类,这是Jersey中一个非常基础的类,用于定义一个JAX-RS应用的基础组件。该类实现了org.glassfish.jersey.server.ServerConfig接口,该接口用于注册应用中的资源组件;
- 该类还实现了javax.ws.rs.core.Configurable接口,该接口用于向当前应用上下文中注册一些必要的组件和元信息。
- 在RestApplication类的构造方法中,我们调用了packages方法注册了扫描资源类的基础包;
发布应用:
import org.glassfish.jersey.jetty.JettyHttpContainerFactory;
import java.net.URI;
public class App {
public static void main(String[] args) {
/**
* 使用包装好的JettyHttpContainerFactory,来发布一个应用。
* 第一个参数:发布的url地址
* 第二个参数:传入一个我们创建的应用配置对象
*/
JettyHttpContainerFactory.createServer(URI.create("http://localhost:8081/"),new RestApplication());
}
}
访问地址:http://localhost:8081/service/go 结果一样
三、Jersey的简单应用
获取参数方式1:
@GET
@Produces(MediaType.APPLICATION_JSON)
@Path("/add")
public void add(@QueryParam("id") String id){
System.out.println("id = "+id);
}
http://localhost:8081/service/add/id=8
@QueryParam有点类似 于SpringMVC中的@PathVariable标签;
获取参数方式2:
还有一些获取参数的写法,是直接在请求路径上拼接特定的参数:
@GET
@Produces(MediaType.APPLICATION_JSON)
@Path("/test/{id}/{id2}/{id3}")
public List<Long> test(@PathParam("id") Long id,
@PathParam("id2") Long id2,
@PathParam("id3") Long id3){
List<Long> idList = new ArrayList<>();
idList.add(id);
idList.add(id2);
idList.add(id3);
return idList;
}
在注解@Path中的{id}/{id2}/{id3},表示携带的参数,参数1,参数2,参数3;然后通过@PathParam获取参数的值。
Jersey常见注解含义: