spring和maven的搭建參考相關文檔。本文只介紹與jersey有關配置。
一、jersey在maven中的依賴包
-
<!-- jersey -->
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-core</artifactId>
<version>1.8</version></dependency>
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-server</artifactId>
<version>1.8</version></dependency>
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-client</artifactId>
<version>1.8</version></dependency>
<dependency>
<groupId>javax.ws.rs</groupId>
<artifactId>javax.ws.rs-api</artifactId>
<version>2.0-m10</version></dependency>
<dependency>
<groupId>javax.ws.rs</groupId>
<artifactId>jsr311-api</artifactId>
<version>1.1.1</version></dependency>
<dependency>
<groupId>asm</groupId>
<artifactId>asm</artifactId>
<version>3.3.1</version></dependency>
<!-- jersey end -->
需要json,加入以下
<!-- json-->
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-json</artifactId>
<version>1.8</version>
</dependency>
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-mapper-asl</artifactId>
<version>1.8.8</version>
</dependency>
<!-- json-->
盡量保持包版本的一致
二、整合spring
1、 引入整合包,注意版本
<!-- jersey spring -->
<dependency>
<groupId>com.sun.jersey.contribs</groupId>
<artifactId>jersey-spring</artifactId>
<version>1.8</version>
<!-- 去除自帶的spring版本 -->
<exclusions>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
</exclusion>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
</exclusion>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
</exclusion>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
</exclusion>
<exclusion>
<artifactId>spring-web</artifactId>
<groupId>org.springframework</groupId>
</exclusion>
</exclusions>
</dependency>
<!-- jersey spring end-->
2、web.xml配置
所有rest請求都經過spring過濾
<!-- jersey spring -->
<dependency>
<groupId>com.sun.jersey.contribs</groupId>
<artifactId>jersey-spring</artifactId>
<version>1.8</version>
<!-- 去除自帶的spring版本 -->
<exclusions>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
</exclusion>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
</exclusion>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
</exclusion>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
</exclusion>
<exclusion>
<artifactId>spring-web</artifactId>
<groupId>org.springframework</groupId>
</exclusion>
</exclusions>
</dependency>
<!-- jersey spring end-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
三、編寫服務端資源
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement
public class User implements java.io.Serializable{
private static final long serialVersionUID = 1L;
private String userName = "";
private int age = 0;
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String toString() {
return "name:"+ userName + " age:" + age;
}
}
import javax.ws.rs.FormParam;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement //表示可以被轉換為xml或json格式
public class Home implements java.io.Serializable {
@FormParam("roomno")
private int roomNo;
@FormParam("address")
private String address;
private String longtime;
public int getRoomNo() {
return roomNo;
}
public void setRoomNo(int roomNo) {
this.roomNo = roomNo;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getLongtime() {
return longtime;
}
public void setLongtime(String longtime) {
this.longtime = longtime;
}
public String toString() {
return "roomNo:" + roomNo + " address:" + address + " longtime:" + longtime;
}
}
2、編寫資源接口
import javax.ws.rs.BeanParam;
import javax.ws.rs.Consumes;
import javax.ws.rs.FormParam;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.MediaType;
@Component //定義此類為spring組件,即bean類.
@Scope("prototype") //Spring會針對每一個request請求都生成新的Jersey服務類實例,此方法不需要配置Spring RequsetContextListener
@Path("/restresource")
public class TestRestResource {
1、無參數返回json格式,如返回xml,將Produces參數修改為MediaType.APPLICATION_XML
@GET
@Path("/getUser")
@Produces(MediaType.APPLICATION_JSON)
public User getUser() {
User user = new User();
user.setUserName("sed");
user.setAge(29);
return user;
}
2、@PathParam("id")獲取URI中指定規則的參數
@GET
@Path("getUser/{id}")
@Produces(MediaType.TEXT_PLAIN)
public String getUserId(@PathParam("id") String id) {
return id;
}
3、@QueryParam 用於獲取GET請求中的查詢參數
@GET
@Path("getId")
@Produces(MediaType.TEXT_PLAIN)
public String getId(@QueryParam("id") String id)
{
return id;
}
4、輸入參數為xml格式,輸出為json格式。可以根據需要切換produces和consumes的類型
@POST
@Path("insertUser")
@Produces(MediaType.APPLICATION_JSON) //指定發送請求的 MIME 類型
@Consumes(MediaType.APPLICATION_XML) //指定響應所能接受的 MIME 類型
public User insertuser(User user) {
return user;
}
5、BeanParam 當請求參數很多時,比如客戶端提交一個修改用戶的PUT請求,請求中包含很多項用戶信息
@PUT
@Path("insertUserFromBean")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public User inserthome(@BeanParam User user) {
return user;
}
6、@FormParam 從POST請求的表單參數中獲取數據
@POST
@Path("insertUserFromForm")
@Consumes("application/x-www-form-urlencoded")
@Produces(MediaType.TEXT_PLAIN)
public String insertuser(@FormParam("username") String userName, @FormParam("age") int age) {
User user = new User();
user.setUserName(userName);
user.setAge(age);
return user.toString();
}
7、多參數傳遞
@POST
@Path("map")
@Produces(MediaType.TEXT_PLAIN)
public String getMap(MultivaluedMap<String, String> formParams) {
String result = "who:" + formParams.getFirst("who") + " ; what:"+formParams.getFirst("what");
return formParams.toString();
}
8、
@DELETE
@Path("deleteUser/{id}")
@Produces(MediaType.TEXT_PLAIN)
public String deleteUser(@PathParam("id") String id) {
//System.out.println(uriInfo.getAbsolutePath().toString());
return "delete " + id;
}
}
四、客戶端調用
private static WebResource getWr(String USER_URL) {
Client c = Client.create(); //創建一個 com.sun.jersey .api.client.Client 類的實例
WebResource wr = c.resource(USER_URL); // 建了一個 WebResponse 對象
return wr;
}
1、調用getUser
代碼:
String USER_URL = "http://localhost:8000/restful/services/restresource/getUser";
System.out.println(getWr(USER_URL).get(String.class));
輸出:
{"userName":"sed","age":29}
2、調用getUser/{id}
代碼:
String USER_URL = "http://localhost:8000/restful/services/restresource/getUser";
String result = getWr(USER_URL).path("hnsed").get(String.class) ;
System.out.println(result);
輸出:
hnsed
3、調用getId
代碼:
String USER_URL = "http://localhost:8000/restful/services/restresource/getId";
String result = getWr(USER_URL).queryParam("id", "109").get(String.class);
System.out.println(result);
輸出:
109
4、調用insertUser
代碼:
User user = new User();user.setUserName("hndes");user.setAge(39);String USER_URL = " http://localhost:8000/restful/services/restresource/insertUser";MultivaluedMapImpl params = new MultivaluedMapImpl();params.add("user", user);String result = getWr(USER_URL).entity(user,MediaType.APPLICATION_XML).post(String.class);System.out.println(result);
輸出:
{"userName":"hndes","age":39}
5、調用insertUserFromBean
代碼:String USER_URL = " http://localhost:8000/restful/services/restresource/insertUserFromBean";String json = "{\"userName\":\"szh\",\"age\":\"6\"}";System.out.println(getWr(USER_URL).entity(json,MediaType.APPLICATION_JSON).put(String.class));輸出:
{"userName":"szh","age":6}
6、調用insertUserFromForm
代碼:
String USER_URL = "http://localhost:8000/restful/services/restresource/insertUserFromForm";
Form form = new Form();
form.add("username", "sed");
form.add("age",39);
//ClientResponse 對象代表了一個客戶端收到的 HTTP 響應。
ClientResponse response = getWr(USER_URL).type(MediaType.APPLICATION_FORM_URLENCODED).post(ClientResponse.class, form);
int status = response.getStatus(); //獲取對應請求的 HTTP 狀態碼
System.out.println(response.getEntity(String.class));
輸出:
name:sed age:39
7、調用map
代碼:
MultivaluedMap<String, String> params = new MultivaluedMapImpl();
params.add("who", "sed");
params.add("what","dohousework");
params.add("how","good");
params.add("where","hk");
params.add("when","long time");
String USER_URL = "http://localhost:8000/restful/services/restresource/map";
String result = getWr(USER_URL).post(String.class,params);
System.out.println(result);
輸出:
{what=[dohousework], how=[good], when=[long time], where=[hk], who=[sed]}
8、調用deleteUser
代碼:
String USER_URL = "http://localhost:8000/restful/services/restresource/deleteUser";
String result = getWr(USER_URL).path("109").delete(String.class);
System.out.println(result);
輸出:
delete 109
注:1、Client 類是創建一個 RESTful Web Service 客戶端的主要配置點。你可以使用它來配置不同的客戶端屬性和功能,並且指出使用哪個資源提供者。創建一個 Client 類的實例是一個比較昂貴的操作,所以盡量避免創建一些不需要的客戶端實例。比較好的方式是盡可能地復用已經存在的實例。
2、通過使用 WebResource 對象來創建要發送到 Web 資源的請求,以及處理從 Web 資源返回的響應。例如,你可以使用 WebResource 對象來發送 HTTP GET、PUT、POST 以及 DELETE 請求
轉載地址:http://ekekyn.blog.163.com/blog/static/313887320151294452322/