Restlet - 基於JAX-RS的Restlet開發例項

襲冷發表於2014-04-01
一、示例說明
    版本:Restlet版本為2.1.0。
    另外:這個應該是才開始接觸級別的示例,剛學者可以作為借鑑看看,大神請深藏您的功與名。

二、關於Restlet
    1、官網:http://restlet.org/
    2、原則:為所有“事物”即資源定義ID;將所有事物連結在一起;使用標準方法,即CRUD;資源多重表述;無狀態通訊。具體描述谷歌搜尋。

三、建立Java Web工程,新增相關Jar。文中示例工程名為JAXRSRestlet

    

四、建立Model,示例為Student

public class Student {
	private Integer id;
	private String name;
	private Integer sex;
	private Integer age;

	public Student() {
	}
	/** setter/getter **/
}

五、建立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;
	}
}
六、建立對應的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 + "";
	}
}
七、擴充套件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;
	}
}
八、擴充套件org.restlet.ext.jaxrs.JaxRsApplication類

public class RestJaxRsApplication extends JaxRsApplication {
	public RestJaxRsApplication(Context context) {
		super(context);
		// 將StudentApplication加入了執行環境中,如果有多個Application可以在此繫結
		this.add(new StudentApplication());
	}
}
九、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>
十、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)、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"}
 
 
 

相關文章