- 浏览: 1190466 次
- 性别:
- 来自: 广州
文章分类
- 全部博客 (883)
- Spring (101)
- Swing (1)
- Mysql (21)
- Js (59)
- Jsp (2)
- Hibernate (19)
- Myeclipse (5)
- SqlServer 2000 (2)
- poi (15)
- Java (70)
- SSH (12)
- Html (47)
- Fusion Charts (1)
- C\C++ (2)
- 汇编 (36)
- Jquery (37)
- Struts2 (6)
- Ubuntu (16)
- powerDesinger (4)
- Jboss (3)
- JAX-RS (13)
- JAXB (5)
- JAX-WS (11)
- JMS (4)
- WebSocket (8)
- PHP (16)
- Flash (1)
- maven (3)
- Oracle (8)
- HttpClient (6)
- sqlserver (19)
- svn (5)
- Tomcat (3)
- Jdbc (3)
- EsayUi (11)
- 微信公众平台 (19)
- IIS (2)
- Freemarker (11)
- Comet (1)
- Spring MVC (85)
- JBoss Seam (3)
- 二维码 (9)
- Spring Security (4)
- Ehcache (3)
- Apache Shiro (7)
- jackson (16)
- JPA (8)
- jcaptcha (2)
- RSA (2)
- Ajax (6)
- 跟我学Shiro (0)
- Spring4 (19)
- 跟我学spring3 (0)
- css (32)
- excel (4)
- Filter (3)
- 微信公众帐号开发教程 (0)
- Android (6)
- log4j (6)
- 淘宝接口 (17)
- 支付集成 (3)
- 单点登录 (3)
- Html5 (27)
- 移动平台前端 (3)
- Linux (44)
- FusionCharts (27)
- Json Jackson Xml (5)
- 方培工作室-微信开发 (0)
- Apache与Tomcat与IIS整合 (10)
- Nginx (17)
- webService (2)
- apache (4)
- lucene (3)
- lodop (2)
- Shiro (3)
- zTree (2)
- ireport (12)
- Servlet3.0 (5)
- 前端美工 (19)
- AngularJS (1)
- C#开发微信门户及应用 (0)
- Shell (3)
- bat脚本 (16)
- Bootstrap (26)
- Less (10)
- photoshop (6)
- Redis (6)
- Mongodb (10)
- MyBatis (3)
- 数据结构 (0)
- 读写分离-主从复制 (0)
- JFinal (0)
- 百度地图api (3)
- hadoop-hbase-hive-spark (3)
- WebStorm (2)
- Quartz (5)
- ios (0)
- Mina (8)
- Android Studio (4)
- Ratchet教程 (0)
- 移动端重构系列 (1)
- cubic-bezier贝塞尔曲线CSS3动画工具 (1)
- nginx+tomcat+memcached集群 (0)
- 集群 (0)
- ZooKeeper (3)
- Dubbo (0)
- vpn (0)
- kafka (0)
- JVM垃圾回收机制 (0)
- 微信小程序 (0)
- Lua (0)
- Hystrix (0)
- Vue.js (0)
- mycat (0)
- Openresty (0)
- springBoot (0)
- 新分类 (0)
- guava (0)
- 大数据 (0)
- Sentinel (0)
最新评论
-
JackMacing:
中文怎么解决?
SpringMVC与iReport(JasperReports) 5.6整合开发实例 -
18335864773:
用pageoffice把.可以实现在线的文档操作.直接转pdf ...
转:使用jasperreport动态生成pdf,excel,html -
linhao0907:
推荐一款轻量开源的支付宝组件:https://github.c ...
关于Alipay支付宝接口(Java版) -
songronghu:
太好了,非常有用,谢谢分享~
Java ConcurrentModificationException 异常分析与解决方案 -
wzwahl36:
http://www.atool.org/json2javab ...
Java下利用Jackson进行JSON解析和序列化
一、HTTP Caching
HTTP1.0中定义了Expires来指定cache在浏览器的生命时长。例如:
- HTTP/1.1 200 OK
- Content-Type: application/xml
- Expires: Tue, 15 May 2011 16:00 GMT
- <Customer id="1">...</Customers>
缓存的数据直到2011年5月15有效。
在JAX-RS中使用javax.ws.rs.core.Response对象来设置有效期:
- @Path("{id}")
- @GET
- @Produces("application/xml")
- public Response getCustomer(@PathParam("id") int id) {
- Customer cust = findCustomer(id);
- ResponseBuilder builder = Response.ok(cust, "application/xml");
- Date date = Calendar.getInstance().set(2010, 5, 15, 16, 0);
- builder.expires(date);
- return builder.build();
- }
HTTP1.1中重新设计了缓存语法。通过使用Cache-Control来对cache进行控制,其中的值以逗号分隔。它包括:
- private
用于指定当且仅有Client才能缓存这个数据 - public
指定在 请求/响应 链中的任何环节都可以缓存数据 - no-cache
这个指令用于指示数据不应该缓存或者除非数据被重新验证过,否则不能被用于再次请求 - no-store
通过缓存数据都被缓存了硬盘中,以使用得下次可以;这个指令表示不要将缓存存在本地。 - no-transform
有时缓存会被自动进行转换以节省内存或者带宽,例如压缩图像。no-transform用于指定不允许进行数据转换 - max-age
max-age用于指示缓存的有效期;如果max-age和Expires同时指定,则max-age有效 - s-maxage
用于指定缓存在一个共享的,中间节点的最大生命期。
例如:
- HTTP/1.1 200 OK
- Content-Type: application/xml
- Cache-Control: private, no-store, max-age=300
- <customers>...</customers>
与Cache-Control对应的,JAX-RS提供了javax.ws.rs.core.CacheControl类来表示Cache-Control头:
- public class CacheControl {
- public CacheControl() {...}
- public static CacheControl valueOf(String value)
- throws IllegalArgumentException {...}
- public boolean isMustRevalidate() {...}
- public void setMustRevalidate(boolean mustRevalidate) {...}
- public boolean isProxyRevalidate() {...}
- public void setProxyRevalidate(boolean proxyRevalidate) {...}
- public int getMaxAge() {...}
- public void setMaxAge(int maxAge) {...}
- public int getSMaxAge() {...}
- public void setSMaxAge(int sMaxAge) {...}
- public List<String> getNoCacheFields() {...}
- public void setNoCache(boolean noCache) {...}
- public boolean isNoCache() {...}
- public boolean isPrivate() {...}
- public List<String> getPrivateFields() {...}
- public void setPrivate(boolean _private) {...}
- public boolean isNoTransform() {...}
- public void setNoTransform(boolean noTransform) {...}
- public boolean isNoStore() {...}
- public void setNoStore(boolean noStore) {...}
- public Map<String, String> getCacheExtension() {...}
- }
在ResponseBuilder类中调用callControl()设置返回的Cache-Control:
- @Path("{id}")
- @GET
- @Produces("application/xml")
- public Response getCustomer(@PathParam("id") int id) {
- Customer cust = findCustomer(id);
- CacheControl cc = new CacheControl();
- cc.setMaxAge(300);
- cc.setPrivate(true);
- cc.setNoStore(true);
- ResponseBuilder builder = Response.ok(cust, "application/xml");
- builder.cacheControl(cc);
- return builder.build();
- }
二、重验证和条件GET
另一个和cache有关的就是当cache变得陈旧的时候,缓存端能够询问服务端缓存的数据是否仍然有效,这叫做revalidation。为了执行revalidation,客户端需要从服务器端取得一些缓存数据的额外的信息,服务端在最初的响应里会发回一个Last-Modified与/或ETag头。
* Last-Modified
Last-Modified头表示服务端发回数据的一个时间戳。例如:
- HTTP/1.1 200 OK
- Content-Type: application/xml
- Cache-Control: max-age=1000
- Last-Modified: Tue, 15 May 2009 09:56 EST
- <customer id = "1">..</customer>
以上,最初的响应的有效期是1000秒,并且时间戳是2009,5,15,9点56。如果客户端支持重新验证,它会存储这个时候戳到缓存数据中。1000稍以后,客户端可以选择重新验证缓存。要重新验证,它需要发送一个条件(conditional)GET请求,并且传递一个If-Modified-Since头信息,If-Modified-Since的值即是Last-Modified的值。例如:
然后服务器会判断数据是否有变化,如果有,则返回一个200, 'OK'的响应,并发回新的响应体;如果没有改变,则返回304, 'Not Modified',和一个空的响应体。这两种情况下都需要发送新的Cache-Control和Last-Modified头。
* ETag
ETag是用来表示数据版本的、假设唯一的某个标识。它的值是任一一个以引用括起的字符串,通常是MD5 哈希值。 例如:
- HTTP/1.1 200 OK
- Content-Type: application/xml
- Cache-Control: max-age=1000
- ETag: "3141271342554322343200"
- <customer id="123">...</customer>
类似于Last-Modified头,如果客户端缓存了这个响应体,则也应该缓存ETag的值。1000秒以后,客户端需要执行一个重验证请求,其中包含一个If-None-Match的请求头:
当服务器端收到这个GET请求时,它就会试图比较当前resource的ETag值和传入的If-None-Match的值,如果不成功,则返回200, 'OK'和一个新的响应体;否则返回304和'Not Modified’和一个空的响应体。
最后关于ETag有两种类型:strong和weak:
- 一个strong的ETag:资源的任何变化都会引起ETag的变化
- 一个weak的ETag:只有资源显著的变化才变化
例如,一个weak的ETag:
- HTTP/1.1 200 OK
- Content-Type: application/xml
- Cache-Control: max-age=1000
- ETag: W/"3141271342554322343200"
- <customer id="123">...</customer>
对应于ETag的JAX-RS类是javax.ws.rs.core.EntityTag:
- public class EntityTag {
- public EntityTag(String value) {...}
- public EntityTag(String value, boolean weak) {...}
- public static EntityTag valueOf(String value)
- throws IllegalArgumentException {...}
- public boolean isWeak() {...}
- public String getValue() {...}
- }
* JAX-RS和条件GET
为了计算上面的验证条件,JAX-RS提供了一个帮助类javax.ws.rs.core.Request:
- public interface Request {
- ...
- ResponseBuilder evaluatePreconditions(EntityTag eTag);
- ResponseBuilder evaluatePreconditions(Date lastModified);
- ResponseBuilder evaluatePreconditions(Date lastModified, EntityTag eTag);
- }
重载的evaludatePreconditions()方法需要一个javax.ws.rs.core.EntityTag和/或java.util.Date对象,表达ETag和最后修改时间(Last-Modified)。这些值是最新的、当前的,然后把它们同传入的请求参数If-Not-Modified和If-None-Match对象。如果不匹配则返回200,'OK'和响应体,或者返回304,'Not Modified'和空响应体:
- @Path("/customers")
- public class CustomerResource {
- @Path("{id}")
- @GET
- @Produces("application/xml")
- public Response getCustomer(@PathParam("id") int id,
- @Context Request request) {
- Customer cust = findCustomer(id);
- EntityTag tag = new EntityTag(
- Integer.toString(cust.hashCode()));
- CacheControl cc = new CacheControl();
- cc.setMaxAge(1000);
- ResponseBuilder builder = request.evaluatePreconditions(tag);
- if (builder != null) {
- builder.cacheControl(cc);
- return builder.build();
- }
- // Preconditions not met!
- builder = Response.ok(cust, "application/xml");
- builder.cacheControl(cc);
- builder.tag(tag);
- return builder.build();
- }
- }
三、并发(Concurrency)
当需要更新Server上的某个数据时,通常就需要面对并发的问题了,因为很有可能有多个人同时在更新同一个信息。
HTTP规范通过使用有条件的PUT或POST请求来解决这个问题,有点类似于有条件GET请求。首先客户端取得数据:
- HTTP/1.1 200 OK
- Content-Type: application/xml
- Cache-Control: max-age=1000
- ETag: "3141271342554322343200"
- Last-Modified: Tue, 15 May 2009 09:56 EST
- <customer id="123">...</customer>
为了带条件的更新,我们需要用到ETag或Last-Modified头,这些信息用于告诉服务端我们需要更新的哪个版本。当我们做PUT或POST请求时,这些信息会随同If-Match或If-Unmodified-Since一同发送出去,其中If-Match信息的值是ETag;If-Unmodified-Since的值是Last-Modified。因此上面GET对应的更新请求可能是:
- PUT /customers/123 HTTP/1.1
- If-Match: "3141271342554322343200"
- If-Unmodified-Since: Tue, 15 May 2009 09:56 EST
- Content-Type: application/xml
- <customer id="123">...</customer>
可以发送If-Match或If-Unmodified-Since中的任何一个。当Server收到这个请求时,就会去检查当前的ETag是否匹配If-Match或当前的时间戳是否匹配If-Unmodified-Since头。如果这些条件都不满足,则返回412, 'Precondition Failed'响应,用于告诉客户端当前数据已经被修改过,请重试;如果条件满足,则执行更新,并返回成功的结果。
* JAX-RS和条件更新
和读取数据一样,还是要用到Request.evaluatePreconditions()方法,例如:
- @Path("/customers")
- public class CustomerResource {
- @Path("{id}")
- @PUT
- @Consumes("application/xml")
- public Response updateCustomer(@PathParam("id") int id,
- @Context Request request) {
- Customer cust = findCustomer(id);
- EntityTag tag = new EntityTag(
- Integer.toString(cust.hashCode()));
- Date timestamp = ...; // get the timestampe
- ResponseBuilder builder =
- request.evaluatePreconditions(timestamp, tag);
- if (builder != null) {
- // Preconditions not met!
- return builder.build();
- }
- //... perform the update ...
- builder = Response.noContent();
- return builder.build();
- }
- }
发表评论
-
JAX-RS入门 十一:HATEOAS
2012-09-11 19:09 697HATEOAS全称:超媒体即状态应用引擎 (Hypermedi ... -
JAX-RS入门 十: 兼容与演进
2012-09-11 19:09 820网络服务会随着时间 ... -
JAX-RS入门 九: 内容约定(2)
2012-09-10 23:33 597JAX-RS与Conneg JAX-RS有一些用来帮助 ... -
JAX-RS入门 九: 内容约定(1)
2012-09-10 23:32 629通常一个SOA的应用都需要足够的灵活,以便于各种不同的客户端或 ... -
JAX-RS入门 八: HTTP响应
2012-09-10 23:32 965首先先看一下HTTP中定义的响应码及其意义: ... -
JAX-RS入门 七: 数据处理(2)
2012-09-10 23:31 840上节介绍了JAX-RS中怎么与一些基础的对象进行交互,这节介绍 ... -
JAX-RS入门 六: 数据处理(1)
2012-09-10 23:30 880接下来要花两小节来介绍一下JAX-RS中的数据处理(Data ... -
JAX-RS入门 五: 自动类型转换
2012-09-09 12:41 682一、默认类型转换规则 在上一节中,已经了解了怎么使用那 ... -
JAX-RS入门 四: 注入
2012-09-09 12:39 1081一、Annotations @javax.ws.rs.Pa ... -
JAX-RS入门 三 :细节
2012-09-09 12:33 721一、若希望一个Java类能够处理REST请求,则这个类必须 ... -
JAX-RS入门 二 :运行
2012-09-09 12:31 935上一节,已经成功的定义了一个REST服务,并且提供了具体的 ... -
JAX-RS入门 一 :基础
2012-09-09 12:29 1687简介 JAX-RS是一套用java实现REST服务的规范,提 ...
相关推荐
[奥莱理] RESTful Java 开发 (Jax-RS 实现) (英文版) [奥莱理] RESTful Java with Jax-RS (E-Book) ☆ 图书概要:☆ Learn how to design and develop distributed web services in Java using RESTful ...
The RESTEasy workbook that follows provides step-by-step instructions for installing, configuring, and running several working JAX-RS examples, using the JBoss RESTEasy implementation of JAX-RS 2.0. ...
使用到的外部jar包有(可选的部分,当且仅当作为一个独立的application运行时) •jetty-http-7.5.4.v20111024.jar •jetty-io-7.5.4.v20111024.jar •jetty-server-7.5.4.v20111024.jar •jetty-util-7.5.4.v...
赠送jar包:jackson-jaxrs-json-provider-2.7.8.jar; 赠送原API文档:jackson-jaxrs-json-provider-2.7.8-javadoc.jar; 赠送源代码:jackson-jaxrs-json-provider-2.7.8-sources.jar; 赠送Maven依赖信息文件:...
javax.xml.ws.Service 报错需要的包,亲测可以用,直接下载在ide里buildpath一下就可以,四个jar包 ,整合了其他的jar所以配置简单
这个架构原则提升了万维网的可伸缩性,无论何种应用都能从该原则中受益无穷。 JAX-RS(JSR 311)指的是Java API for RESTful Web Services,Roy Fielding也参与了JAX-RS的制订,他在自己的博士论文中定义了REST。...
概述这是一个多模块项目,包含用于以下数据格式的基于Jackson的JAX-RS提供程序:(二进制JSON) (另一种二进制JSON) 提供程序实现特定数据格式的JAX-RS MessageBodyReader和MessageBodyWriter处理程序。...
jax-rs-test JAX-RS测试
JAX-RS 性能 比较每个请求和单例 JAX-RS 资源类的性能。 请参阅。 该项目包括 4 个资源类:2 个每个请求范围和 2 个单例。 两个只是返回一个查询参数。 在另外两个资源中,我们将通过@Context 注入 UriInfo。 上...
关于JAX-RS的注解详细,本人通过网络及实际应用收集的资料
使用Eclipse开发基于SpringBoot+JAX-RS的Restful服务.docx使用Eclipse开发基于SpringBoot+JAX-RS的Restful服务.docx使用Eclipse开发基于SpringBoot+JAX-RS的Restful服务.docx使用Eclipse开发基于SpringBoot+JAX-RS的...
jax-rs 2.1规范最终版,英文原版。jax-rs规范定义了java平台Rest调用风格的WebService接口。
JAX-RS REST helloworld 项目源码 下载后引入eclipse jee 启动tomcat可直接访问 访问路径为http://localhost:8080/AndroidJAX-RS/jaxrs/helloworld/html
restlet_jax-rs列子 可直接运行 在我的博客里有一些描述。希望能给大家提供点帮助
JAX-RS-演示学术项目的 JAX-RS(用于 RESTful Web 服务的 Java API)演示。 该演示使用作为 JSR 311 规范的参考实现。
srb4j, Simple RESTFul backend for Java, 一个JAX-RS服务端代码脚手架(就像AppFuse之于Webapp),基于OAuth2提供了完整的注册、登录、密码恢复等功能。 它本质是一个Maven Archetype, 所以你可以用它快速生成一个...
JAX-RS-FileUpload-Jersey-Example
JAX-RS+spring
web service rest(jax-rs)整合完整的Jax-rs组件包,内含2个版本,分别是1.0和1.4版本。