RESTful Web Service是轻量级的service,可以通过HTTP的方式来实现对后台数据库的CRUD,
在Web开发和移动开发时使用的比较广泛,非常方便。
在Java世界里, JAX-RS规范定义了对RESTful Web Service的实现。
Oracle的Jersey框架则是对JAX-RS的一个实现。
下面我们学习如何使用Jersey来创建RESTful WebService。
我的开发环境:
Eclipse Juno, Java 1.6, Tomcat 7.0, Jersey 1.18
1. 创建第一个RESTful web service
1.1创建一个叫jersey1的Dynamic Web Project.
1.2在WEB-INF/lib文件夹中导入jersey的包。
1.3创建web.xml,定义Jersey的使用。
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"> <display-name>sample</display-name> <servlet> <servlet-name>Jersey REST Service</servlet-name> <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class> <init-param> <param-name>com.sun.jersey.config.property.packages</param-name> <param-value>sample</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>Jersey REST Service</servlet-name> <url-pattern>/rest/*</url-pattern> </servlet-mapping> </web-app>
1.4创建Java class
package sample; import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.Produces; import javax.ws.rs.core.MediaType; //Sets the path to base URL + /hello @Path("/hello") public class Hello { // This method is called if TEXT_PLAIN is request @GET @Produces(MediaType.TEXT_PLAIN) public String sayPlainTextHello() { return "Hello Jersey"; } // This method is called if XML is request @GET @Produces(MediaType.TEXT_XML) public String sayXMLHello() { return "<?xml version=\"1.0\"?>" + "<hello> Hello Jersey" + "</hello>"; } // This method is called if HTML is request @GET @Produces(MediaType.TEXT_HTML) public String sayHtmlHello() { return "<html> " + "<title>" + "Hello Jersey" + "</title>" + "<body><h1>" + "Hello Jersey" + "</body></h1>" + "</html> "; } }
1.5.创建测试应用
package sample; import java.net.URI; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.UriBuilder; 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.api.client.config.ClientConfig; import com.sun.jersey.api.client.config.DefaultClientConfig; public class Test { public static void main(String[] args) { ClientConfig config = new DefaultClientConfig(); Client client = Client.create(config); WebResource service = client.resource(getBaseURI()); // Fluent interfaces System.out.println(service.path("rest").path("hello") .accept(MediaType.TEXT_PLAIN).get(ClientResponse.class) .toString()); // Get plain text System.out.println(service.path("rest").path("hello") .accept(MediaType.TEXT_PLAIN).get(String.class)); // Get XML System.out.println(service.path("rest").path("hello") .accept(MediaType.TEXT_XML).get(String.class)); // The HTML System.out.println(service.path("rest").path("hello") .accept(MediaType.TEXT_HTML).get(String.class)); } private static URI getBaseURI() { return UriBuilder.fromUri( "http://localhost:8080/jersey1").build(); } }
1.6. 部署项目到tomcat后,运行Test程序:
2.然后来结合JAXB来创建RESTful web service.
JAX-RS可以直接通过JAXB来创建XML和JSON的输出。
JAXB是Java对xml的实现。
2.1 创建叫jersey2的Dynamic Web Project,导入jersey库。
2.2 创建一个对象,这里注意下,加上@XmlRootElement就可以了。
package sample; import javax.xml.bind.annotation.XmlRootElement; @XmlRootElement public class Todo { private String summary; private String description; public String getSummary() { return summary; } public void setSummary(String summary) { this.summary = summary; } public String getDescription() { return description; } public void setDescription(String description) { this.description = description; } }
2.3 创建一个class来调用jersey
package sample; import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.Produces; import javax.ws.rs.core.MediaType; @Path("/todo") public class TodoResource { // This method is called if XMLis request @GET @Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON }) public Todo getXML() { Todo todo = new Todo(); todo.setSummary("This is my first todo"); todo.setDescription("This is my first todo"); return todo; } // This can be used to test the integration with the browser @GET @Produces({ MediaType.TEXT_XML }) public Todo getHTML() { Todo todo = new Todo(); todo.setSummary("This is my first todo"); todo.setDescription("This is my first todo"); return todo; } }
2.4 web.xml文件
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"> <display-name>sample</display-name> <servlet> <servlet-name>Jersey REST Service</servlet-name> <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class> <init-param> <param-name>com.sun.jersey.config.property.packages</param-name> <param-value>sample</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>Jersey REST Service</servlet-name> <url-pattern>/rest/*</url-pattern> </servlet-mapping> </web-app>
2.5 部署项目,然后通过浏览器来测试
输入url: http://localhost:8080/jersey2/rest/todo
可以看到RESTful web service的输出:
为了更清楚一点,我用Chrome浏览器的Postman来测试一下,这是一个RESTful的客户端。
小结:
可以看到在Java中,可以通过JAX-RS+JAXB非常方便的实现RESTful web service。
直接在对象中定义url以及get,post,put,delete等方法就行了。