本文演示环境为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()); } }?
?
?
?
?