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类:
serviceResource类;
注意:每次根据@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 { 省略 }