`

使用Maven和Jersey Framework开发REST风格Web Service

阅读更多

本文演示环境为eclipse + Maven插件 + Jersey framework。本文只关注Jersey的使用,所以只使用类中定义的静态数据做演示。请在使用时修改我的代码。如果你的eclipse中没有安装Maven插件,请关注我的博客,我马上就会推出Maven+eclipse的开发教程。

蓝锋博客: http://bluesfeng.iteye.com/

1. 在eclipse中创建Maven项目


2.单击"Next"


3. 选择Maven项目类型为"maven-archetype-webapp"


4. 输入项目相关的Maven设置


5. 分别创建src/main下java文件夹以及src下test文件夹


6. 设置src/main/java和src/test/java为source folder


 

7. 最终设置结果如下:


8. 修改pom.xml,添加Maven相应依赖库

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>net.jianxi.tutorials.jerseyws</groupId>
	<artifactId>jerseywstest</artifactId>
	<packaging>war</packaging>
	<version>1.0</version>
	<name>jerseywstest Maven Webapp</name>
	<url>http://maven.apache.org</url>

	<dependencies>
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>4.7</version>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>com.sun.jersey</groupId>
			<artifactId>jersey-core</artifactId>
			<version>1.3</version>
		</dependency>
		<dependency>
			<groupId>com.sun.jersey</groupId>
			<artifactId>jersey-server</artifactId>
			<version>1.3</version>
		</dependency>
		<dependency>
			<groupId>com.sun.jersey</groupId>
			<artifactId>jersey-client</artifactId>
			<version>1.3</version>
		</dependency>
		<dependency>
			<groupId>log4j</groupId>
			<artifactId>log4j</artifactId>
			<version>1.2.14</version>
		</dependency>
		<dependency>
			<groupId>javax.ws.rs</groupId>
			<artifactId>jsr311-api</artifactId>
			<version>1.1.1</version>
		</dependency>
		<dependency>
			<groupId>asm</groupId>
			<artifactId>asm</artifactId>
			<version>3.2</version>
		</dependency>
	</dependencies>
	<build>
		<finalName>jerseywstest</finalName>
		<plugins>
			<plugin>
				<artifactId>maven-compiler-plugin</artifactId>
				<configuration>
					<source>1.6</source>
					<target>1.6</target>
				</configuration>
			</plugin>
			<plugin>
				<groupId>org.codehaus.mojo</groupId>
				<artifactId>tomcat-maven-plugin</artifactId>
				<configuration>
					<warFile>target/jerseywstest.war</warFile>
				</configuration>
			</plugin>
		</plugins>
	</build>

</project>
 

9. 添加基本POJO类Student:

package net.jianxi.tutorials.jerseyws.metadata;

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
public class Student {
	private int id;
	private String name;
	private String dept;
	
	public int getId() {
		return id;
	}
	
	public Student() {
	}
	
	public Student(int id, String name, String dept) {
		super();
		this.id = id;
		this.name = name;
		this.dept = dept;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getDept() {
		return dept;
	}
	public void setDept(String dept) {
		this.dept = dept;
	}
	
}
 

10. 添加一个REST web服务实现类RestWsDemo:

package net.jianxi.tutorials.jerseyws;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.ws.rs.DELETE;
import javax.ws.rs.FormParam;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.MediaType;

import net.jianxi.tutorials.jerseyws.metadata.Student;

import org.apache.log4j.Logger;


@Path("/students")
public class RestWsDemo {
	private static Logger logger = Logger.getLogger(RestWsDemo.class);
	private static int index = 1;
	private static Map<Integer,Student> studentList = new HashMap<Integer, Student>();
	
	public RestWsDemo() {
		if(studentList.size()==0) {
			studentList.put(index, new Student(index++, "Frank",  "CS"));
			studentList.put(index, new Student(index++, "Jersey", "Math"));
		}
	}
	
	@GET
	@Path("{studentid}")
	@Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
	public Student getMetadata(@PathParam("studentid") int studentid) {
		if(studentList.containsKey(studentid))
			return studentList.get(studentid);
		else
			return new Student(0, "Nil", "Nil");
	}
	
	@GET
	@Path("list")
	@Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
	public List<Student> getAllStudents() {
		List<Student> students = new ArrayList<Student>();
		students.addAll(studentList.values());
		return students;
	}
	
	@POST
	@Path("add")
	@Produces("text/plain")
	public String addStudent(@FormParam("name") String name,
			                 @FormParam("dept") String dept) {
		studentList.put(index, new Student(index++, name, dept));
		return String.valueOf(index-1);
	}
	
	@DELETE
	@Path("delete/{studentid}")
	@Produces("text/plain")
	public String removeStudent(@PathParam("studentid") int studentid) {
		logger.info("Receieving quest for deleting student: " + studentid);
		
		Student removed = studentList.remove(studentid);
		if(removed==null) return "failed!";
		else   return "true";
	}	
	
	@PUT
	@Path("put")
	@Produces("text/plain")
	public String putStudent(@QueryParam("studentid") int studentid,
			                 @QueryParam("name") String name,
			                 @QueryParam("dept") String dept
			                 ) {
		logger.info("Receieving quest for putting student: " + studentid);
		if(!studentList.containsKey(studentid))
			return "failed!";
		else
			studentList.put(studentid, new Student(studentid, name, dept));
		
		return String.valueOf(studentid);
	}	
}

11. 修改src/main/webapp/WEB-INF/web.xml文件如下:

<!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>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
       
		<init-param>
			<param-name>com.sun.jersey.config.property.resourceConfigClass</param-name>
			<param-value>com.sun.jersey.api.core.PackagesResourceConfig</param-value>
		</init-param>

		<init-param>
			<param-name>com.sun.jersey.config.property.packages</param-name>
			<param-value>net.jianxi.tutorials.jerseyws</param-value>
		</init-param>
		<load-on-startup>1</load-on-startup>
	</servlet>

	<servlet-mapping>
		<servlet-name>jerseyws</servlet-name>
		<url-pattern>/rest/*</url-pattern>
	</servlet-mapping>  
</web-app>
 

12. 运行Maven package任务,构建war文件,部署war应用到你的Web服务器。


13. 测试

我马上就会推出如何用SoapUI工具测试Jersey Web服务的教程。这里这介绍简单的测试方法。


13.1) 对于GET,可以直接通过浏览器进行测试,在浏览器中直接输入:http://localhost:8080/jerseywstest/rest/students/list, 你应该看到返回的XML数据:

<students>
  <student>
    <dept>CS</dept>
    <id>1</id>
    <name>Frank</name>
  </student>
  <student>
    <dept>Math</dept>
    <id>2</id>
    <name>Jersey</name>
  </student>
</students>

输入: http://localhost:8080/jerseywstest/rest/students/1则会返回一个学生的信息。

 

13.2) 测试POST方法。

添加一个testpost.htm文件

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
	<form action="/jerseywstest/rest/students/add" method="post">
	  <input type="text" id="name" name="name"/><br/>
	  <input type="text" id="dept" name="dept"/><br/>
	  <input type= "submit"/>
	</form>
</body>
</html>

 提交后你在用list方法就可以看到数据的变化。

 

13.3) PUT和DELETE方法的测试

添加一个Junit测试类

package net.jianxi.tutorials.jerseyws;


import javax.ws.rs.core.MultivaluedMap;

import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;

import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.ClientResponse;
import com.sun.jersey.api.client.WebResource;
import com.sun.jersey.core.util.MultivaluedMapImpl;

public class RestWsDemoTest {
	private String url = "http://localhost:8080/jerseywstest/rest/students";

	@Test
	public void testDelete() {
		Client client = Client.create();
		WebResource webResource = client.resource(url + "/delete/1");
		ClientResponse response = webResource.delete(ClientResponse.class);
		
		System.out.println("Response for delete request: " + response.getStatus());
	}
	
	@Test
	public void testPut() {
		Client client = Client.create();
		WebResource webResource = client.resource(url + "/put");
		MultivaluedMap queryParams = new MultivaluedMapImpl();
		queryParams.add("studentid", "2");
		queryParams.add("name", "nametest");
		queryParams.add("dept", "depttest");
		ClientResponse response = webResource.queryParams(queryParams).put(ClientResponse.class, "foo:test");
		System.out.println("Response for put request: " + response.getStatus());
	}
}
 

 

 

 

 

  • 大小: 44.4 KB
  • 大小: 47 KB
  • 大小: 92.1 KB
  • 大小: 61.1 KB
  • 大小: 18.1 KB
  • 大小: 34.9 KB
  • 大小: 16.7 KB
  • 大小: 107.5 KB
3
1
分享到:

相关推荐

Global site tag (gtag.js) - Google Analytics