1、示例说明
版本:Restlet版本为2.1.0。
另外:这个应该是才开始接触级别的示例,刚学者可以作为借鉴看看,大神请深藏您的功与名。
2、关于Restlet
(1)、官网:http://restlet.org/
(2)、原则:为所有“事物”即资源定义ID;将所有事物链接在一起;使用标准方法,即CRUD;资源多重表述;无状态通信。具体描述谷歌搜索。
3、创建Java Web工程,添加相关Jar。文中示例工程名为JAXRSRestlet
4、创建Model,示例为Student
public class Student { private Integer id; private String name; private Integer sex; private Integer age; public Student() { } /**setter/getter**/ }
5、创建BusinessObject类,示例虚拟了一个数据库和相应的一些操作
public class StudentBO { private static Map<Integer, Student> students = new HashMap<Integer, Student>(); // 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<Student> getStudentAll() { return new ArrayList<Student>(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; } }
6、创建对应的Resource类,具体看注释
//student路径进来的都会调用StudentResource来处理 @Path("student") public class StudentResource { StudentBO studentBO = new StudentBO(); // 说明了http的方法是get方法 @GET // 每个方法前都有对应path,用来申明对应uri路径 @Path("{id}/xml") // 指定返回的数据格式为xml @Produces("application/xml") // 接受传递进来的id值,其中id为Path中的{id},注意定义的占位符与@PathParam要一致 public Student getStudentXml(@PathParam("id") int id) { return studentBO.getStudent(id); } @GET @Path("{id}/json") @Produces("application/json") public Student getStudentJson(@PathParam("id") int id) { return studentBO.getStudent(id); } @POST @Path("post") public String addStudent(Representation entity) { Form form = new Form(entity); String name = form.getFirstValue("name"); int sex = Integer.parseInt(form.getFirstValue("sex")); int age = Integer.parseInt(form.getFirstValue("age")); Student student = new Student(); student.setName(name); student.setSex(sex); student.setAge(age); int i = studentBO.saveOrUpdateStudent(student); return i + ""; } @PUT @Path("put") public String updateStudent(Representation entity) { Form form = new Form(entity); int id = Integer.parseInt(form.getFirstValue("id")); String name = form.getFirstValue("name"); int sex = Integer.parseInt(form.getFirstValue("sex")); int age = Integer.parseInt(form.getFirstValue("age")); Student student = new Student(); student.setId(id); student.setName(name); student.setSex(sex); student.setAge(age); int i = studentBO.saveOrUpdateStudent(student); return i + ""; } }
7、扩展javax.ws.rs.core.Application类
public class StudentApplication extends Application { @Override public Set<Class<?>> getClasses() { Set<Class<?>> rrcs = new HashSet<Class<?>>(); // 绑定StudentResource。有多个资源可以在这里绑定。 rrcs.add(StudentResource.class); return rrcs; } }
8、扩展org.restlet.ext.jaxrs.JaxRsApplication类
public class RestJaxRsApplication extends JaxRsApplication { public RestJaxRsApplication(Context context) { super(context); //将StudentApplication加入了运行环境中,如果有多个Application可以在此绑定 this.add(new StudentApplication()); } }
9、web.xml配置
<context-param> <param-name>org.restlet.application</param-name> <param-value>app.RestJaxRsApplication</param-value> </context-param> <servlet> <servlet-name>RestletServlet</servlet-name> <servlet-class>org.restlet.ext.servlet.ServerServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>RestletServlet</servlet-name> <url-pattern>/*</url-pattern> </servlet-mapping>
10、Client端测试
/** * 示例使用了Junit,不用可以写Main方法 */ public class Client { public static String url = "http://127.0.0.1:8080/JAXRSRestlet/"; @Test public void testGetXml() { ClientResource client = new ClientResource(url + "student/1/xml"); try { System.out.println(client.get().getText()); } catch (ResourceException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } @Test public void testGetJson() { ClientResource client = new ClientResource(url + "student/1/json"); try { System.out.println(client.get().getText()); } catch (ResourceException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } @Test public void testPost() { ClientResource client = new ClientResource(url + "student/post"); try { Form form = new Form(); form.add("name", "testPost"); form.add("age", "0"); form.add("sex", "39"); String id = client.post(form.getWebRepresentation()).getText(); System.out.println(id); } catch (Exception e) { e.printStackTrace(); } } @Test public void testPut() { ClientResource client = new ClientResource(url + "student/put"); try { Form form = new Form(); form.add("id", "1"); form.add("name", "testPut"); form.add("age", "22"); form.add("sex", "0"); String id = client.put(form.getWebRepresentation()).getText(); System.out.println(id); } catch (Exception e) { e.printStackTrace(); } } @Test public void testDelete() { ClientResource client = new ClientResource(url + "student/1"); try { System.out.println(client.delete().getText()); } catch (ResourceException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }
1、输出结果
(1)、testGetXml():<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Student><age>18</age><id>1</id><name>Michael</name><sex>1</sex></Student>
(2)、testGetJson:{"id":1,"sex":1,"age":18,"name":"Michael"}
(3)、testPut():1
再调用testGetJson()传入{id}=1时:{"id":1,"sex":0,"age":22,"name":"testPut"}
(4)、testPost():5
再调用testGetJson()传入{id}=5时:{"id":5,"sex":39,"age":0,"name":"testPost"}