使用Jquery,Jackson JSON,JAX-RS,Apache Wink,Spring实现REST应用开发
简介
REST 是英文 Representational State Transfer 的缩写,有中文翻译为“具象状态传输”。相较于基于 SOAP 和 WSDL 的 Web 服务,REST 模式提供了更为简洁的实现方案。目前,越来越多的 Web 服务开始采用 REST 风格设计和实现。
REST中的一个重要概念是资源的存在性,每个资源都一个全局引用标识符,即URI。特别是数据和函数都被认为是可通过URI识别和访问的资源。为了操纵这些资源,网络组件,客户端和服务器通过一个标准的接口通信,如HTTP和一个组固定的动词 — GET,PUT,POST和DELETE — 交换这些资源。
JAX-RS为在Java中构建RESTful Web服务提供了标准化API,API提供了一组注解,以及相关的类和接口。对POJO应用注解允许你暴露Web资源,这个方法使得在Java中创建RESTful Web服务变得简单。
Apache Wink是一个简单而强大的RESTful Web服务创建框架。它由一个服务器端模块和一个客户端模块组成。Apache Wink的服务器端模块是JAX-RS1.0规范的一个完全实现。除了对基本协议的实现外,Apache Wink服务器端模块还提供了一系列便于开发RESTful Web服务的新特性。Apache Wink客户端模块提供了调用RESTful Web服务的相关功能,该模块基于JDK HttpURLConnection实现。
简单的说:REST是一种Web Service的设计模式,本文提到的实现方式,是从浏览器客户端借用jQuery发送Ajax请求到server端的Apache Wink提供的JAX-RS服务 (每个Resource是由spring负责实例化的) 从而实现WebService。
好了,废话不多说了,现在贴出具体的代码样例。
开发环境:
JDK1.5以上
Jquery1.4以上
jackson-all-1.6.2.jar
jsr311-api.jar
wink-server-1.1.2-incubating.jar
Spring2.0以上
JaxRSResource.java
–该接口没有任何方法,只是为了让spring过滤所有实现该接口的Resource
package com.cuishen.jaxrs.demo; public interface JaxRSResource { }
WinkApplication.java
–继承自javax.ws.rs.core.Application,并重写getSingletons(),在该方法中调用spring的getBean()接口,并过滤出所有实现了JaxRSResource接口的bean,然后返回给Application
package com.cuishen.jaxrs.demo; import java.util.HashSet; import java.util.Set; import javax.ws.rs.core.Application; import com.cuishen.jaxrs.demo.factory.MyBeanFactory;; public class WinkApplication extends Application { public WinkApplication() { } @Override public Set<Object> getSingletons() { String beans[] = MyBeanFactory.getBeanNamesForType(JaxRSResource.class); Set<Object> result = new HashSet<Object>(); if (beans != null) { for (int i = 0; i < beans.length; i++) { String beanName = beans[i]; result.add(MyBeanFactory.getBean(beanName)); } } return result; } }
DemoResource.java
–具体的Resource实现,实现JaxRSResource接口,也是spring托管的一个bean
package com.cuishen.jaxrs.demo; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.ws.rs.*; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.codehaus.jackson.map.ObjectMapper; import com.cuishen.jaxrs.demo.bean.TestBean; @Path("/accountDemo") public class DemoResource implements JaxRSResource { private static final Log log = LogFactory.getLog(DemoResource.class); @POST @Path("/transactions/{id}") @Produces("application/json") public Map<String, String> getTransactions(@PathParam("id") String id) throws Exception { log.error("============================= successful getTransactions ================="); Map<String, String> map = new HashMap<String, String>(); map.put("id", id); return map; } @POST @Path("/transactions/") @Consumes("application/json") @Produces("application/json") public String getTransactions(HashMap<String, String> params) throws Exception { log.error("============================= successful getTransactions 2 ================="); List<TestBean> list = new ArrayList<TestBean>(); TestBean bean = new TestBean(); String id = (String) params.get("id"); bean.setId(id); bean.setName("xiao ming"); list.add(bean); bean = new TestBean(); bean.setId("222"); bean.setName("xiao zhang"); list.add(bean); ObjectMapper objectMapper = new ObjectMapper(); String listJson = objectMapper.writeValueAsString(list); return listJson; } @POST @Path("/demoData") @Consumes("application/x-www-form-urlencoded") @Produces("application/json") public String getDemoData(@FormParam("id") String id, @FormParam("name") String name) throws Exception { log.error("=========