Jersey + Spring restful web service demo

Spring 3 MVC本身就支持resutful web service, 同时实现Java Resutful Webservice的技术也很多,如Restlet、RestEasy 和Jersey。这里用Jersey来实现。
Jersey的官方介绍:
Jersey is the open source, production quality, JAX-RS (JSR 311) Reference Implementation for building RESTful Web services. But, it is also more than the Reference Implementation.

涉及的技术:
    Jersey 1.17
    Spring 3.2.2.RELEASE
    Maven 3
    Flex SDK 4.6

1. 项目依赖Pom.xml片段
    ......
    <repositories>
		<repository>
			<id>maven2-repository.java.net</id>
			<name>Java.net Repository for Maven</name>
			<url>http://download.java.net/maven/2/</url>
		</repository>
	</repositories>
 
	<dependencies>
 
		<!-- Jersey -->
		<dependency>
			<groupId>com.sun.jersey</groupId>
			<artifactId>jersey-server</artifactId>
			<version>1.17</version>
		</dependency>
		
		<dependency>
			<groupId>com.sun.jersey</groupId>
			<artifactId>jersey-json</artifactId>
			<version>1.17</version>
		</dependency>		
 
		<!-- Spring 3 dependencies -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-core</artifactId>
			<version>3.2.2.RELEASE</version>
		</dependency>
 
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context</artifactId>
			<version>3.2.2.RELEASE</version>
		</dependency>
 
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-web</artifactId>
			<version>3.2.2.RELEASE</version>
		</dependency>
 
		<!-- Jersey + Spring -->
		<dependency>
			<groupId>com.sun.jersey.contribs</groupId>
			<artifactId>jersey-spring</artifactId>
			<version>1.17</version>
			<exclusions>
				<exclusion>
					<groupId>org.springframework</groupId>
					<artifactId>spring</artifactId>
				</exclusion>
				<exclusion>
					<groupId>org.springframework</groupId>
					<artifactId>spring-core</artifactId>
				</exclusion>
				<exclusion>
					<groupId>org.springframework</groupId>
					<artifactId>spring-web</artifactId>
				</exclusion>
				<exclusion>
					<groupId>org.springframework</groupId>
					<artifactId>spring-beans</artifactId>
				</exclusion>
				<exclusion>
					<groupId>org.springframework</groupId>
					<artifactId>spring-context</artifactId>
				</exclusion>
			</exclusions>
		</dependency> 
	</dependencies>

  <build>
    <finalName>CNET</finalName>
  <plugins>
    <plugin>
      <artifactId>maven-compiler-plugin</artifactId>
        <configuration>
          <source>1.7</source>
          <target>1.7</target>
        </configuration>
    </plugin>
  </plugins>
</build>
 ...



2. Web.xml
a.注册Spring “ContextLoaderListener” listener class在web.xml
b.加入Jersey Spring servlet
	<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>classpath:applicationContext.xml</param-value>
	</context-param>
	<listener>
		<listener-class>
			org.springframework.web.context.ContextLoaderListener
		</listener-class>
	</listener>
   
	<servlet>
		<servlet-name>jersey-serlvet</servlet-name>
		<servlet-class>
			com.sun.jersey.spi.spring.container.servlet.SpringServlet
		</servlet-class>
		<init-param>
			<param-name>com.sun.jersey.config.property.packages</param-name>
			<param-value>com.cnet.web.rest</param-value>
		</init-param>
		<load-on-startup>1</load-on-startup>
	</servlet>
 
	<servlet-mapping>
		<servlet-name>jersey-serlvet</servlet-name>
		<url-pattern>/rest/*</url-pattern>
	</servlet-mapping>	 


3. 处理Request请求:
package com.cnet.shared.services;

import java.util.List;

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import com.cnet.server.service.EmployeeService;
import com.cnet.shared.vo.EmployeeVO;

@Component
@Path("/employee")
public class EmployeeRestService {

	@Autowired
	EmployeeService service;

	@GET
	@Path("/list")
	@Produces("application/json")
	public List<EmployeeVO> listAllEmployee() {

		List<EmployeeVO> result = service.listAllEmployee();

		return result;
	}

}

@Component注解定义此类为spring组件,即bean类.
@Autowired指定了一个EmployeeService引用,Spring会提供该引用。
@Path是个JAX-RS注解,它的值是一个相对的URI路径, 所以方法listAllEmployee的http web service的URI就是/CNET/rest/employee/list
@Produces指定了返回的数据格式是json
@GET注解是请求方法指示符,这个指示符注解的Java方法会处理HTTP GET请求

4.Spring的应用上下文 applicationContext.xml
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
	http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
	http://www.springframework.org/schema/context
	http://www.springframework.org/schema/context/spring-context-3.0.xsd">
	<context:component-scan base-package="com.cnet.shared.services" />	
	<bean id="employeeService" class="com.cnet.server.service.impl.EmployeeServiceImpl" />
    <bean id="employeeDAO" class="com.cnet.server.dao.impl.EmployeeDAOImpl" />
</beans>

5. EmployeeVO.java
package com.cnet.shared.vo;

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
public class EmployeeVO implements java.io.Serializable {
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private String userName;
	private String emailAddr;

	public void setUserName(String name) {
		this.userName = name;
	}

	public String getUserName() {
		return this.userName;
	}

	public void setEmailAddr(String emailAddr) {
		this.emailAddr = emailAddr;
	}

	public String getEmailAddr() {
		return this.emailAddr;
	}
}

6. Service层和DAO层的具体实现
EmployeeServiceImpl.java
package com.cnet.server.service.impl;

import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;

import com.cnet.server.dao.EmployeeDAO;
import com.cnet.server.service.EmployeeService;
import com.cnet.shared.vo.EmployeeVO;

public class EmployeeServiceImpl implements EmployeeService{

	@Autowired
	EmployeeDAO dao;
	
	@Override
	public List<EmployeeVO> listAllEmployee() {
		
		return dao.listAllEmployee();
	}

}


EmployeeDAOImpl.java
package com.cnet.server.dao.impl;

import java.util.ArrayList;
import java.util.List;

import com.cnet.server.dao.EmployeeDAO;
import com.cnet.shared.vo.EmployeeVO;

public class EmployeeDAOImpl implements EmployeeDAO {
	@Override
	public List<EmployeeVO> listAllEmployee() {
		List <EmployeeVO> list = new ArrayList<EmployeeVO>();
		EmployeeVO vo1 = new EmployeeVO();
		vo1.setUserName("Ted");
		vo1.setEmailAddr("[email protected]");
		
		EmployeeVO vo2 = new EmployeeVO();
		vo2.setUserName("Mike");
		vo2.setEmailAddr("[email protected]");
		
		list.add(vo1);
		list.add(vo2);
		
		return list;		
	}
}


5. flex端调用Restful web service
CNET.mxml
<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
			   xmlns:s="library://ns.adobe.com/flex/spark" 
			   xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600" creationComplete="webService.send()">
	<fx:Script>  
		<![CDATA[   
			import mx.collections.ArrayCollection;
			import mx.rpc.events.ResultEvent;
			
		private function onLoad(event : ResultEvent) : void {
			var rawData:String = String(event.result);
			var rawResult:Object = JSON.parse(rawData);  
			var arr:Array = rawResult.employeeVO as Array;  
			var dp:ArrayCollection = new ArrayCollection(arr);  
			grid.dataProvider = dp;
		}
		]]>
	</fx:Script>
	<fx:Declarations>
		<s:HTTPService id="webService" method="GET" url="http://localhost:8080/CNET/rest/employee/list"  showBusyCursor="true" result="onLoad(event)" />   
	</fx:Declarations>
	<mx:DataGrid id="grid" horizontalCenter="0">
		<mx:columns>
			<mx:DataGridColumn dataField="userName" headerText="Name" />
			<mx:DataGridColumn dataField="emailAddr" width="200" headerText="Email" />
		</mx:columns>
	</mx:DataGrid>
</s:Application>



访问URL,成功获取数据。

Jersey + Spring restful web service demo_第1张图片

你可能感兴趣的:(Web,service)