本文演示环境为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