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

来源:互联网 发布:淘宝客qq群拉人 编辑:程序博客网 时间:2024/05/21 17:09

本文演示环境为eclipse + Maven插件 + Jersey framework。

1. 修改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>com.johnf.app</groupId>  <artifactId>jersy-rest-methods</artifactId>  <packaging>war</packaging>  <version>0.0.1-SNAPSHOT</version>  <name>jersy-rest-methods Maven Webapp</name>  <url>http://maven.apache.org</url>    <properties>  <jersey.version>1.19</jersey.version>  <spring.version>4.1.4.RELEASE</spring.version>  </properties>    <dependencies>  <!-- junit -->    <dependency>      <groupId>junit</groupId>      <artifactId>junit</artifactId>      <version>4.4</version>      <scope>test</scope>    </dependency>    <!-- jersey  -->    <dependency>    <groupId>com.sun.jersey</groupId>    <artifactId>jersey-core</artifactId>    <version>${jersey.version}</version>    </dependency>    <dependency>    <groupId>com.sun.jersey</groupId>    <artifactId>jersey-server</artifactId>    <version>${jersey.version}</version>    </dependency>    <dependency>    <groupId>com.sun.jersey</groupId>    <artifactId>jersey-client</artifactId>    <version>${jersey.version}</version>    </dependency>    <dependency>    <groupId>com.sun.jersey</groupId>    <artifactId>jersey-json</artifactId>    <version>${jersey.version}</version>    </dependency>    <!-- jersey-spring --><dependency><groupId>com.sun.jersey.contribs</groupId><artifactId>jersey-spring</artifactId><version>${jersey.version}</version><!-- 去除jersey自带的低版本spring --><exclusions><exclusion><groupId>org.springframework</groupId><artifactId>spring-core</artifactId></exclusion><exclusion><groupId>org.springframework</groupId><artifactId>spring-context</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-aop</artifactId></exclusion></exclusions></dependency>    <!-- spring --><dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-web</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-beans</artifactId><version>${spring.version}</version></dependency>  </dependencies>    <build>    <finalName>jersy-rest-methods</finalName>  </build></project>

2. 添加基本POJO类Student:

package com.johnfnash.app.jersey.domain;import java.io.Serializable;import javax.xml.bind.annotation.XmlRootElement;/** * 学生实体类  */@XmlRootElement //注意:需要加上@XmlRootElement注解,产生xml响应时需要用到public class Student implements Serializable {private static final long serialVersionUID = 435012662554501777L;/** id */private int id;/** 姓名 */private String name;/** 系 */private String dept;public Student() {}public Student(int id, String name, String dept) {this.id = id;this.name = name;this.dept = dept;}public int getId() {return id;}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;}}

3. 添加一个REST web服务实现类StudentRest:

package com.johnfnash.app.jersey.rest;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 com.johnfnash.app.jersey.domain.Student;@Path("/students")public class StudentRest {    private static int index = 1;    private static Map<Integer, Student> stuMap = new HashMap<Integer, Student>();    private final static String OK = "ok";    private final static String FAILED = "failed";        public StudentRest() {        if(stuMap.size()==0) {            stuMap.put(index, new Student(index++, "Frank", "CS"));            stuMap.put(index, new Student(index++, "Jersey", "Math"));        }    }        @GET    @Path("{studentId}")    @Produces({MediaType.APPLICATION_JSON})    public Student getStudentById(@PathParam("studentId")int stuId) {        if(stuMap.containsKey(stuId)) {            return stuMap.get(stuId);        } else {            return new Student(0, "Nil", "Nil");        }    }    @GET    @Path("list")    @Produces({MediaType.APPLICATION_XML})    public List<Student> getAllStudents() {        List<Student> stuList = new ArrayList<Student>();        stuList.addAll(stuMap.values());        return stuList;    }        @POST    @Path("add")    @Produces("text/plain")    public String addStudent(@FormParam("name") String name,            @FormParam("dept") String dept) {        stuMap.put(index, new Student(index++, name, dept));        return String.valueOf(index-1);    }        @DELETE    @Path("delete/{studentId}")    @Produces("text/plain")    public String deleteStudent(@PathParam("studentId") int stuId) {        Student removed = stuMap.remove(stuId);        if(removed==null) {            return FAILED;        } else {            return OK;        }    }        @PUT    @Path("put")    @Produces("text/plain")    public String putStudent(@QueryParam("studentId") int stuId,            @QueryParam("name") String name, @QueryParam("dept") String dept) {        if(!stuMap.containsKey(stuId)) {            return FAILED;        } else {            stuMap.put(stuId, new Student(stuId, name, dept));        }        return String.valueOf(stuId);    }    }

4. 修改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>    <!-- spring -->  <listener>  <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>  </listener>  <context-param>  <param-name>contextConfigLocation</param-name>  <param-value>classpath:applicationContext.xml</param-value>  </context-param>    <!-- jersey 配置 -->  <servlet>  <servlet-name>jersey</servlet-name>  <servlet-class>com.sun.jersey.spi.spring.container.servlet.SpringServlet</servlet-class>  <!-- rest服务所在位置 -->  <init-param>  <param-name>com.sun.jersey.config.property.packages</param-name>  <param-value>com.johnfnash.app.jersey.rest</param-value>  </init-param>  <load-on-startup>1</load-on-startup>  </servlet>    <servlet-mapping>  <servlet-name>jersey</servlet-name>  <url-pattern>/rest/*</url-pattern>  </servlet-mapping></web-app>
由于使用了spring,需要在src/main/resources下建一个空的spring配置文件:applicationContext.xml

5. 测试

5.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/jersey-rest-methods/rest/students/1,会返回一个学生的信息

{"dept":"CS","id":"1","name":"Frank"}

5.2) 测试POST方法。

添加一个testpost.htm文件

<!DOCTYPE html><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>add</title></head><body><form action="/jersey-rest-methods/rest/students/add" method="post"><input type="text" name="name" /><br/><input type="text" name="dept" /><br/><input type="submit" /></form></body></html>

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

5.3) PUT和DELETE方法的测试

package com.johnfnash.app.jersey;import javax.ws.rs.core.MultivaluedMap;import junit.framework.Assert;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 StudentRestTest {    private final String url = "http://localhost:8080/jersey-rest-methods/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: " + response.getEntity(String.class));        Assert.assertEquals(200, response.getStatus());    }    @Test    public void testPut() {        Client client = Client.create();        WebResource webResource = client.resource(url + "/put");        //设置查询参数        MultivaluedMap<String,String> queryParams = new MultivaluedMapImpl();        queryParams.add("studentId", "2");        queryParams.add("name", "testname");        queryParams.add("dept", "testdept");        //请求        ClientResponse response =                webResource.queryParams(queryParams).put(ClientResponse.class);        System.out.println("response for put: " + response.getEntity(String.class));        Assert.assertEquals(200, response.getStatus());    }    }
本文参考:http://www.cnblogs.com/bluesfeng/archive/2010/10/28/1863816.html
0 0
原创粉丝点击