日期:2014-05-16  浏览次数:20978 次

使用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("=========