Maven和Jersey Framework开发REST风格Web Service
本文演示环境为eclipse + Maven插件 + Jersey framework。本文只关注Jersey的使用,所以只使用类中定义的静态数据做演示。请在使用时修改我的代码。如果你的eclipse中没有安装 Maven插件,请关注我的博客,我马上就会推出Maven+eclipse的开发教程。
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:
1 package net.jianxi.tutorials.jerseyws.metadata;
2
3 import javax.xml.bind.annotation.XmlRootElement;
4
5 @XmlRootElement
6 public class Student {
7 private int id;
8 private String name;
9 private String dept;
10
11 public int getId() {
12 return id;
13 }
14
15 public Student() {
16 }
17
18 public Student(int id, String name, String dept) {
19 super();
20 this.id = id;
21 this.name = name;
22 this.dept = dept;
23 }
24 public void setId(int id) {
25 this.id = id;
26 }
27 public String getName() {
28 return name;
29 }
30 public void setName(String name) {
31 this.name = name;
32 }
33 public String getDept() {
34 return dept;
35 }
36 public void setDept(String dept) {
37 this.dept = dept;
38 }
39
40 }
41
10. 添加一个REST web服务实现类RestWsDemo:
1 package net.jianxi.tutorials.jerseyws;
2
3 import java.util.ArrayList;
4 import java.util.HashMap;
5 import java.util.List;
6 import java.util.Map;
7
8 import javax.ws.rs.DELETE;
9 import javax.ws.rs.FormParam;
10 import javax.ws.rs.GET;
11 import javax.ws.rs.POST;
12 import javax.ws.rs.PUT;
13 import javax.ws.rs.Path;
14 import javax.ws.rs.PathParam;
15 import javax.ws.rs.Produces;
16 import javax.ws.rs.QueryParam;
17 import javax.ws.rs.core.MediaType;
18
19 import net.jianxi.tutorials.jerseyws.metadata.Student;
20
21 import org.apache.log4j.Logger;
22
23
24 @Path("/students")
25 public class RestWsDemo {
26 private static Logger logger = Logger.getLogger(RestWsDemo.class);
27 private static int index = 1;
28 private static Map<Integer,Student> studentList = new HashMap<Integer, Student>();
29
30 public RestWsDemo() {
31 if(studentList.size()==0) {
32 studentList.put(index, new Student(index++, "Frank", "CS"));
33 studentList.put(index, new Student(index++, "Jersey", "Math"));
34 }
35 }
36
37 @GET
38 @Path("{studentid}")
39 @Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
40 public Student getMetadata(@PathParam("studentid") int studentid) {
41 if(studentList.containsKey(studentid))
42 return studentList.get(studentid);
43 else
44 return new Student(0, "Nil", "Nil");
45 }
46
47 @GET
48 @Path("list")
49 @Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
50 public List<Student> getAllStudents() {
51 List<Student> students = new ArrayList<Student>();
52 students.addAll(studentList.values());
53 return students;
54 }
55
56 @POST
57 @Path("add")
58 @Produces("text/plain")
59 public String addStudent(@FormParam("name") String name,
60 @FormParam("dept") String dept) {
61 studentList.put(index, new Student(index++, name, dept));
62 return String.valueOf(index-1);
63 }
64
65 @DELETE
66 @Path("delete/{studentid}")
67 @Produces("text/plain")
68 public String removeStudent(@PathParam("studentid") int studentid) {
69 logger.info("Receieving quest for deleting student: " + studentid);
70
71 Student removed = studentList.remove(studentid);
72 if(removed==null) return "failed!";
73 else return "true";
74 }
75
76 @PUT
77 @Path("put")
78 @Produces("text/plain")
79 public String putStudent(@QueryParam("studentid") int studentid,
80 @QueryParam("name") String name,
81 @QueryParam("dept") String dept
82 ) {
83 logger.info("Receieving quest for putting student: " + studentid);
84 if(!studentList.containsKey(studentid))
85 return "failed!";
86 else
87 studentList.put(studentid, new Student(studentid, name, dept));
88
89 return String.valueOf(studentid);
90 }
91 }
92
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数据:
输入:http://localhost:8080/jerseywstest/rest/students/1则会返回一个学生的信息。<students>
<student>
<dept>CS</dept>
<id>1</id>
<name>Frank</name>
</student>
<student>
<dept>Math</dept>
<id>2</id>
<name>Jersey</name>
</student>
</students>
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测试类
1 package net.jianxi.tutorials.jerseyws;
2
3
4 import javax.ws.rs.core.MultivaluedMap;
5
6 import org.junit.Before;
7 import org.junit.BeforeClass;
8 import org.junit.Test;
9
10 import com.sun.jersey.api.client.Client;
11 import com.sun.jersey.api.client.ClientResponse;
12 import com.sun.jersey.api.client.WebResource;
13 import com.sun.jersey.core.util.MultivaluedMapImpl;
14
15 public class RestWsDemoTest {
16 private String url = "http://localhost:8080/jerseywstest/rest/students";
17
18 @Test
19 public void testDelete() {
20 Client client = Client.create();
21 WebResource webResource = client.resource(url + "/delete/1");
22 ClientResponse response = webResource.delete(ClientResponse.class);
23
24 System.out.println("Response for delete request: " + response.getStatus());
25 }
26
27 @Test
28 public void testPut() {
29 Client client = Client.create();
30 WebResource webResource = client.resource(url + "/put");
31 MultivaluedMap queryParams = new MultivaluedMapImpl();
32 queryParams.add("studentid", "2");
33 queryParams.add("name", "nametest");
34 queryParams.add("dept", "depttest");
35 ClientResponse response = webResource.queryParams(queryParams).put(ClientResponse.class, "foo:test");
36 System.out.println("Response for put request: " + response.getStatus());
37 }
38 }
39