jersey是一个RESTful Web Service框架。web service即远程函数调用,通过该特性,在互联网中跨机器调用其他服务器上的函数,就像调用本地代码一样简单又方便。原理是框架把请求对象序列化为json形式的字符串,发送http请求到指定的服务器上,服务器端把json字符串再反序列化为对象,找到函数代码入口后开始执行,得到返回对象后序列化为json字符串,作为客户端http请求的回应返回,客户端再将结果反序列化为对象。至此,完成一次远程调用。虽然细节上比较麻烦,但框架会帮我们封装好细节,并且总体上看好处是显而易见的——把服务分布在不同的机器上有利于负载均衡,该请求还是无状态的,对于此次请求的处理不依赖于上一次的状态。
获取jar
<!-- pom.xml的依赖部分 -->
<dependencies>
<span style="white-space:pre"> </span><dependency>
<groupId>org.glassfish.jersey.containers</groupId>
<artifactId>jersey-container-servlet</artifactId>
<version>2.5</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-json-jackson</artifactId>
<version>2.5</version>
</dependency>
</dependencies>
常用类
org.glassfish.jersey.server.
ResourceConfig
用来绑定resource,代表着WebService的类。
ResourceConfig org.glassfish.jersey.server.ResourceConfig. register(Class<?> componentClass)
用来绑定resource的函数。
用来绑定resource,代表着WebService的类。
ResourceConfig org.glassfish.jersey.server.ResourceConfig. register(Class<?> componentClass)
用来绑定resource的函数。
代码
app类:
package com.likeyichu.webservice;
import org.glassfish.jersey.jackson.JacksonFeature;
import org.glassfish.jersey.server.ResourceConfig;
public class App extends ResourceConfig {
public App() {
//向jersey框架注册资源类,凡完全限定名是以指定字符串开头的类,都将包含
packages("com.likeyichu.webservice");
register(JacksonFeature.class);
}
}
serviceResource类;
package com.likeyichu.webservice;
import javax.ws.rs.FormParam;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.MediaType;
@Path("animal")
public class Animal {
public String species,name;
public int age;
public static Animal animal=new Animal();
@GET
@Path("{species}")
@Produces(MediaType.APPLICATION_JSON)
public Animal wsAnimal(@PathParam("species") String species,
@QueryParam("name") String name,
@QueryParam("age") int age
){
animal.species=species;
animal.name=name;
animal.age= age==0?2:age;
return animal;
}
}
注意:每次根据@path找到的类,jersey都会自动new一个
新对象,所以想对一些成员变量保持不变的话可以把它们设置为static。
在WebContainer中配置
该地址为jersey官方文档。
用Tomcat作HttpServer
web.xml配置,让Tomcat读取
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
<display-name>Archetype Created Web Application</display-name>
<servlet>
<!-- 自己定名字,随便取 -->
<servlet-name>jerseyws</servlet-name>
<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>javax.ws.rs.Application</param-name>
<!-- 自己的继承了ResourceConfig的类名 -->
<param-value>com.likeyichu.webservice.App</param-value>
</init-param>
<!-- 指定这个“jerseyws” Servlet被tomcat加载的顺序 -->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>jerseyws</servlet-name>
<!-- 如果项目名为ABC,那么www.abc.com/ABC/*的请求都会被jersey框架处理-->
<url-pattern>/*</url-pattern>
</servlet-mapping>
</web-app>
效果
json反序列化到形参
public class UrlRequest {
private String url;
public String getUrl() {return url;}
public void setUrl(String url) {this.url = url;}
}
@Path("post")
@POST
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON) //因为这行,urlResponseFun2()的形参request会被jersey注入
//注意请求的头部必须有 ContentType:application/json 否则tomcat会报错
public UrlResponse urlResponseFun2 ( UrlRequest request) throws IOException {
省略
}