1、相关说明

   version:文中示例使用的Spring版本为3.0.3,Restlet版本为2.1.0。

   entity:Student

2、创建Java Web工程,添加相关Jar。文中示例工程名为SpringRestlet。

说明:动态代理的cglib-nodep.jar不可缺少。

3、web.xml配置

dispatcherServlet
org.springframework.web.servlet.DispatcherServlet
contextConfigLocation
classpath*:/applicationContext.xml
org.springframework.web.context.ContextLoaderListener
org.springframework.web.util.IntrospectorCleanupListener
encodingFilter
org.springframework.web.filter.CharacterEncodingFilter
encoding
UTF-8
forceEncoding
true
restlet
org.restlet.ext.spring.SpringServerServlet
org.restlet.application
application
restlet
/*

4、Model实体类代码

@JsonSerialize(include = Inclusion.NON_NULL)public class Student {    private Integer id;    private String name;    private Integer sex;    private Integer age;    public Student() {    }        /**setter/getter**/}

说明:@JsonSerialize(include = Inclusion.NON_NULL)为JackSon的注解,作用是返回JSON格式的实体时不返回该实体类值为Null的Field,如: {"id" : 1,"name" : null,"sex" : 1,"age" : 20} 。

5、Resource代码

 (1)、StudentResource:示例中主要针对单个实例的RetrieveUpdateDelete

@Controller@Scope("prototype")public class StudentResource extends ServerResource{                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                private Integer id;                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                @Autowired    private StudentBO studentBO;                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                public void setStudentBO(StudentBO studentBO) {        this.studentBO = studentBO;    }                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         @Override    protected void doInit() throws ResourceException {        id = Integer.valueOf((String) getRequestAttributes().get("studentId"));    }                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                @Get("json")    public Student findStudentById(){        Student s = this.studentBO.getStudent(id);        return s;    }                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                @Delete("json")    public Integer deleteStudentById() {        return this.studentBO.removeStudent(id);    }                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          @Put("json")    public Integer updateStudent(Student student) {        student.setId(id);        return this.studentBO.saveOrUpdateStudent(student);    }}

(2)、StudentListResource:示例中主要针对单个实例的Create和多个实例的Retrieve。

@Controller@Scope("prototype")public class StudentListResource extends ServerResource {                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    @Autowired    private StudentBO studentBO;                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    @Post    public Integer saveStudent(Student student) {        return studentBO.saveOrUpdateStudent(student);    }                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    @Get("json")    public List
findStudentAll() { return studentBO.getStudentAll(); } public void setStudentBO(StudentBO studentBO) { this.studentBO = studentBO; }}

说明:接受Spring管理的Bean,@Scope("prototype")的annotation必须要有,否则会出现正确调用指定方法的问题,用xml配置Bean时也必须要Attribute:scope。

6、BusinessObject代码

@Service@Scope("prototype")public class StudentBO {    private static Map
students = new HashMap
(); // next Id private static int nextId = 5; static { students.put(1, new Student(1, "Michael", 1, 18)); students.put(2, new Student(2, "Anthony", 1, 22)); students.put(3, new Student(3, "Isabella", 0, 19)); students.put(4, new Student(4, "Aiden", 1, 20)); } public Student getStudent(Integer id) { return students.get(id); } public List
getStudentAll() { return new ArrayList
(students.values()); } public Integer saveOrUpdateStudent(Student student) { if (student.getId() == null) { student.setId(nextId++); } students.put(student.getId(), student); return student.getId(); } public Integer removeStudent(Integer id) { students.remove(id); return id; }}

7、Spring applictionContext.xml配置

说明:该application在web.xml中引用

8、Client代码

public class StudentClient {                                                                                                                                                                                                                                                                                                                                                   public void student_get(){        try {            ClientResource client = new ClientResource(                "http://127.0.0.1:8080/SpringRestlet/student/1");            Representation representation = client.get();            System.out.println(representation.getText());        } catch (Exception e) {            e.printStackTrace();        }    }                                                                                                                                                                                                                                                                                                                                                   public void student_delete() {        try {            ClientResource client = new ClientResource(                "http://127.0.0.1:8080/SpringRestlet/student/1");            Representation representation = client.delete();            System.out.println(representation.getText());        } catch (Exception e) {            e.printStackTrace();        }    }                                                                                                                                                                                                                                                                                                                                                   public void student_put(){        try {            ClientResource client = new ClientResource(                "http://127.0.0.1:8080/SpringRestlet/student/1");            Student student = new Student("Test_Put", 1, 18);            Representation representation = client.put(                student, MediaType.APPLICATION_JAVA_OBJECT);            System.out.println(representation.getText());        } catch (Exception e) {            e.printStackTrace();        }    }                                                                                                                                                                                                                                                                                                                                                   public void student_post(){        try {            ClientResource client = new ClientResource(                "http://127.0.0.1:8080/SpringRestlet/student");            Student student = new Student("Test_Post", 1, 18);            Representation representation = client.post(                student, MediaType.APPLICATION_JAVA_OBJECT);            System.out.println(representation.getText());        } catch (Exception e) {            e.printStackTrace();        }    }                                                                                                                                                                                                                                                                                                                                                   public void student_findAll(){        try {            ClientResource client = new ClientResource(                "http://127.0.0.1:8080/SpringRestlet/student");            Representation representation = client.get();            System.out.println(representation.getText());        } catch (Exception e) {            e.printStackTrace();        }    }                                                                                                                                                                                                                                                                                                                                                   public static void main(String[] args) {        StudentClient client =  new  StudentClient();        client.student_get();    }}

9、补充

   (1)、请求参数问题:客户端发送形如/student/{studentId}的URI请求时,可能是还需要携带其他parameter的,参数携带形式可如/student/{studentId}?name=John&sex=23;Server端获取参数时,针对在URI{}内的参数使用getRequest().getAttributes().get("studentId");方式获取,针对附加参数可以通过Form form = getRequest().getResourceRef().getQueryAsForm(); String name = form.getValues("name");方式获取

   (2)、客户端工具:测试Server端时,如果不想写Client端code,可以是WizTools.org的RestClient-ui.jar的小工具,Post和Put请求时的对象可以以JSON格式添加到Http body中即可。

   (3)、相关资源:文中工程以上传至51cto下载中心,含代码和Jar包。链接地址: