最近一直在搞老項目的開發工作,很少寫博文了。聽了兩位阿里巴巴大牛的討論,決定試試用restful風格的webservices看看。
這里用的是Jersey這個框架,剛開始弄,有點麻煩,只能到處查資料。網上的資料也比較零碎,這里整理一下。
一.helloworld
需要三個包,這里從maven獲取。
<dependencies> <dependency> <groupId>com.sun.jersey</groupId> <artifactId>jersey-core</artifactId> <version>1.18</version> </dependency> <dependency> <groupId>com.sun.jersey</groupId> <artifactId>jersey-json</artifactId> <version>1.18</version> </dependency> <dependency> <groupId>com.sun.jersey</groupId> <artifactId>jersey-servlet</artifactId> <version>1.18</version> </dependency> </dependencies>
然后再web.xml中代碼:
<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>hello.resource</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>
寫一個資源類:
@Path("hello") public class HelloResource {
@GET
@Produces(MediaType.TEXT_PLAIN)
public String greed(){
return "hello world";
} }
這樣,訪問:http://localhost:8080/rest/hello ,可以看到頁面會輸出:hello world
二.傳遞參數
在HelloResource這個類中,新加一個方法:
@GET @Produces(MediaType.TEXT_PLAIN) @Path("{id}") public String sayHello(@PathParam("id")int id){ return "hello jersey "+id; }
此時,訪問:http://localhost:8080/rest/hello/123 ,頁面會輸出:
hello jersey 123
后面的123即是參數id的值。試了一下,如果再寫一個一樣的方法,把參數類型改成String類型,當輸入參數類型不同的時候,會自動識別不同的方法。不過中文不可以直接跟在后面,會有亂碼的情況。
我們一般傳遞參數的話,是采用?符來進行傳參的。上面的方式看上去有點奇怪,不符合我們經常用的方式。
這里還有一種方式,適合我們的方式,不采用PathParam這個屬性,采用QueryParam這個。
再寫一個方法:
@GET @Path("/param") @Produces("text/plain") public String sayHis(@QueryParam("param")String param){ return "nice "+param; }
此時,訪問:http://localhost:8080/rest/hello/param?param=work ,頁面會輸出:
nice work
這些算是一個基本入門,關於客戶端使用等相關知識,在之后的博文中再寫。
這里有一篇博文寫的也不錯:
http://my.oschina.net/mlongbo/blog/152548#OSC_h5_14
另附glassfish配置方式:
上面是用com.sun的包,還有一種是org.glassfish的包。
配置都差不多。
web.xml:
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0"> <servlet> <servlet-name>Jersey REST Service</servlet-name> <servlet-class> org.glassfish.jersey.servlet.ServletContainer </servlet-class> <init-param> <param-name>jersey.config.server.provider.packages</param-name> <param-value>hello.resource</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>
目前接觸到的區別在於,用glassfish方式,配置后的json,不需要下載,瀏覽器即可顯示出json內容。用sun的話,直接用json格式輸出,需要下載打開才可以看到。不知道是不是也需要一些類似的配置。
需要的包:
<dependencies> <dependency> <groupId>org.glassfish.jersey.containers</groupId> <!-- if your container implements Servlet API older than 3.0, use "jersey-container-servlet-core" --> <artifactId>jersey-container-servlet</artifactId> <version>2.13</version> </dependency> <!-- Required only when you are using JAX-RS Client --> <dependency> <groupId>org.glassfish.jersey.core</groupId> <artifactId>jersey-client</artifactId> <version>2.13</version> </dependency> </dependencies>