1. 程式人生 > >spring RestTemplate用法詳解

spring RestTemplate用法詳解

前面介紹過Spring的MVC結合不同的view顯示不同的資料,如:結合json的view顯示json、結合xml的view顯示xml文件。那麼這些資料除了在WebBrowser中用JavaScript來呼叫以外,還可以用遠端伺服器的Java程式、C#程式來呼叫。也就是說現在的程式不僅在BS中能呼叫,在CS中同樣也能呼叫,不過你需要藉助RestTemplate這個類來完成。RestTemplate有點類似於一個WebService客戶端請求的模版,可以呼叫http請求的WebService,並將結果轉換成相應的物件型別。至少你可以這樣理解!

一、準備工作

1、 下載jar包

2、 需要jar包如下

clip_image002

3、 當前工程的web.xml配置

xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4" 
    xmlns="http://java.sun.com/xml/ns/j2ee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
    http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
    <servlet
>
        <servlet-name>dispatcherservlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServletservlet-class>
        <init-param>
            <param-name>contextConfigLocationparam-name>
            <param-value>/WEB-INF/dispatcher.xmlparam-value
>
        init-param>
        <load-on-startup>1load-on-startup>
    servlet>
    <servlet-mapping>
        <servlet-name>dispatcherservlet-name>
        <url-pattern>*.dourl-pattern>
    servlet-mapping>
    <welcome-file-list>
      <welcome-file>index.jspwelcome-file>
    welcome-file-list>
web-app>

4、 WEB-INF中的dispatcher.xml配置

xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:util="http://www.springframework.org/schema/util"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
    http://www.springframework.org/schema/mvc
    http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
    http://www.springframework.org/schema/context 
    http://www.springframework.org/schema/context/spring-context-3.0.xsd
    http://www.springframework.org/schema/util
    http://www.springframework.org/schema/util/spring-util-3.0.xsd">
    <context:component-scan base-package="com.hoo.*">
        <context:exclude-filter type="assignable" expression="com.hoo.client.RESTClient"/>
    context:component-scan>
    <bean id="handlerAdapter" class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"/>
    <bean name="xStreamMarshallingView" class="org.springframework.web.servlet.view.xml.MarshallingView">
        <property name="marshaller">
            <bean class="org.springframework.oxm.xstream.XStreamMarshaller">  
                <property name="autodetectAnnotations" value="true"/>  
            bean>  
        property>
    bean>
    <bean class="org.springframework.web.servlet.view.BeanNameViewResolver">
        <property name="order" value="3"/>
    bean>
    <bean id="handlerMapping" class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
        <property name="order" value="1" />
    bean>
beans>

5、 啟動後,可以看到index.jsp 沒有出現異常或錯誤。那麼當前SpringMVC的配置就成功了。

二、REST控制器實現

REST控制器主要完成CRUD操作,也就是對於http中的post、get、put、delete。

還有其他的操作,如head、options、trace。

具體程式碼:

package com.hoo.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;
/**
 * function:SpringMVC REST示例
 * @author hoojo
 * @createDate 2011-6-9 上午11:34:08
 * @file RESTController.java
 * @package com.hoo.controller
 * @project SpringRestWS
 * @blog http://blog.csdn.net/IBM_hoojo
 * @email [email protected]
 * @version 1.0
 */
@RequestMapping("/restful")
@Controller
public class RESTController {
    @RequestMapping(value = "/show", method = RequestMethod.GET)
    public ModelAndView show() {
        System.out.println("show");
        ModelAndView model = new ModelAndView("xStreamMarshallingView");
        model.addObject("show method");
        return model; 
    }
    @RequestMapping(value = "/get/{id}", method = RequestMethod.GET)
    public ModelAndView getUserById(@PathVariable String id) {
        System.out.println("getUserById-" + id);
        ModelAndView model = new ModelAndView("xStreamMarshallingView");
        model.addObject("getUserById method -" + id);
        return model; 
    }
    @RequestMapping(value = "/add", method = RequestMethod.POST)
    public ModelAndView addUser(String user) {
        System.out.println("addUser-" + user);
        ModelAndView model = new ModelAndView("xStreamMarshallingView");
        model.addObject("addUser method -" + user);
        return model; 
    }
    @RequestMapping(value = "/edit", method = RequestMethod.PUT)
    public ModelAndView editUser(String user) {
        System.out.println("editUser-" + user);
        ModelAndView model = new ModelAndView("xStreamMarshallingView");
        model.addObject("editUser method -" + user);
        return model;
    }
    @RequestMapping(value = "/remove/{id}", method = RequestMethod.DELETE)
    public ModelAndView removeUser(@PathVariable String id) {
        System.out.println("removeUser-" + id);
        ModelAndView model = new ModelAndView("xStreamMarshallingView");
        model.addObject("removeUser method -" + id);
        return model;
    }
}

上面的方法對應的http操作:

/show -> get 查詢
/get/id -> get 查詢
/add -> post 新增
/edit -> put 修改
/remove/id -> delete 刪除

在這個方法中,就可以看到RESTful風格的url資源標識

@RequestMapping(value = "/get/{id}", method = RequestMethod.GET)
public ModelAndView getUserById(@PathVariable String id) {
    System.out.println("getUserById-" + id);
    ModelAndView model = new ModelAndView("xStreamMarshallingView");
    model.addObject("getUserById method -" + id);
    return model; 
}

value=”/get/{id}”就是url中包含get,並且帶有id引數的get請求,就會執行這個方法。這個url在請求的時候,會通過Annotation的@PathVariable來將url中的id值設定到getUserById的引數中去。 ModelAndView返回的檢視是xStreamMarshallingView是一個xml檢視,執行當前請求後,會顯示一篇xml文件。文件的內容是新增到model中的值。

三、利用RestTemplate呼叫REST資源

程式碼如下:

package com.hoo.client;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestTemplate;
/**
 * function:RestTemplate呼叫REST資源
 * @author hoojo
 * @createDate 2011-6-9 上午11:56:16
 * @file RESTClient.java
 * @package com.hoo.client
 * @project SpringRestWS
 * @blog http://blog.csdn.net/IBM_hoojo
 * @email [email protected]
 * @version 1.0
 */
@Component
public class RESTClient {
    @Autowired
    private RestTemplate template;
    private final static String url = "http://localhost:8080/SpringRestWS/restful/";
    public String show() {
        return template.getForObject(url + "show.do", String.class, new String[]{});
    }
    public String getUserById(String id) {
        return template.getForObject(url + "get/{id}.do", String.class, id); 
    }
    public String addUser(String user) {
        return template.postForObject(url + "add.do?user={user}", null, String.class, user);
    }
    public String editUser(String user) {
        template.put(url + "edit.do?user={user}", null, user);
        return user;
    }
    public String removeUser(String id) {
        template.delete(url + "/remove/{id}.do", id);
        return id;
    }
}

RestTemplate的getForObject完成get請求、postForObject完成post請求、put對應的完成put請求、delete完成delete請求;還有execute可以執行任何請求的方法,需要你設定RequestMethod來指定當前請求型別。

RestTemplate.getForObject(String url, Class responseType, String... urlVariables)

引數url是http請求的地址,引數Class是請求響應返回後的資料的型別,最後一個引數是請求中需要設定的引數。

template.getForObject(url + "get/{id}.do", String.class, id);

如上面的引數是{id},返回的是一個string型別,設定的引數是id。最後執行該方法會返回一個String型別的結果。

下面建立一個測試類,完成對RESTClient的測試。程式碼如下:

package com.hoo.client;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit38.AbstractJUnit38SpringContextTests;
/**
 * function:RESTClient TEST
 * @author hoojo
 * @createDate 2011-6-9 下午03:50:21
 * @file RESTClientTest.java
 * @package com.hoo.client
 * @project SpringRestWS
 * @blog http://blog.csdn.net/IBM_hoojo
 * @email [email protected]
 * @version 1.0
 */
@ContextConfiguration("classpath:applicationContext-*.xml")
public class RESTClientTest extends AbstractJUnit38SpringContextTests {
    @Autowired
    private RESTClient client;
    public void testShow() {
        System.out.println(client.show());
    }
    public void testGetUserById() {
        System.out.println(client.getUserById("abc"));
    }
    public void testAddUser() {
        System.out.println(client.addUser("jack"));
    }
    public void testEditUser() {
        System.out.println(client.editUser("tom"));
    }
    public void testRemoveUser() {
        System.out.println(client.removeUser("aabb"));
    }
}

我們需要在src目錄下新增applicationContext-beans.xml完成對restTemplate的配置。restTemplate需要配置MessageConvert將返回的xml文件進行轉換,解析成JavaObject。

xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context-3.0.xsd">
    <context:component-scan base-package="com.hoo.*"/>
    <bean id="restTemplate" class="org.springframework.web.client.RestTemplate">
        <property name="messageConverters">
            <list>
                <bean class="org.springframework.http.converter.xml.MarshallingHttpMessageConverter">
                    <property name="marshaller" ref="xStreamMarshaller"/>
                    <property name="unmarshaller" ref="xStreamMarshaller"/>
                bean>
            list>
        property>
    bean>
    <bean id="xStreamMarshaller" class="org.springframework.oxm.xstream.XStreamMarshaller">
        <property name="annotatedClasses">
            <array>                
            array>
        property>
    bean>
beans>

上面配置了xStreamMarshaller是和RESTController中的ModelAndView的view對應的。因為那邊是用xStreamMarshaller進行編組的,所以RestTemplate這邊也需要用它來解組。RestTemplate還指出其他的MarshallingHttpMessageConverter;

相關推薦

spring RestTemplate用法

前面介紹過Spring的MVC結合不同的view顯示不同的資料,如:結合json的view顯示json、結合xml的view顯示xml文件。那麼這些資料除了在WebBrowser中用JavaScript來呼叫以外,還可以用遠端伺服器的Java程式、C#程式來呼叫。也就是說現

Spring AOP用法

trace 方法名 java 範式 advice work 配對 中文翻譯 roc 什麽是AOP AOP:Aspect Oriented Programming,中文翻譯為”面向切面編程“。面向切面編程是一種編程範式,它作為OOP面向對象編程的一種補充,用於處理系統中分布於

Spring MVC 學習筆記(二):@RequestMapping用法

一、@RequestMapping 簡介 在Spring MVC 中使用 @RequestMapping 來對映請求,也就是通過它來指定控制器可以處理哪些URL請求,相當於Servlet中在web.xml中配置 <servlet>  

Spring中@Async用法及簡單例項

Spring中@Async用法 引言: 在Java應用中,絕大多數情況下都是通過同步的方式來實現互動處理的;但是在處理與第三方系統互動的時候,容易造成響應遲緩的情況,之前大部分都是使用多執行緒來完成此類任務,其實,在spring 3.x之後,就已經內建了@Async來完美解決這個問題,本文將完成

SPRING MVC 中的 MULTIACTIONCONTROLLER 用法 (轉載)

http://www.blogjava.net/wuhen86/articles/288966.html Spring MVC 中 Controller 的層次實在是多,有些眼花繚亂了。在單個的基礎上,再新加兩三個叫做豐富,再多就未必是好事,反而會令人縮手新聞片腳,無

Spring MVC的一些關於請求的註解用法

    這段時間一直在著手於RESTful風格的介面設計。springmvc的RESTful風格的url是通過@RequestMapping 及@PathVariable annotation提供的。為此我好好研究了一下關於Springmvc請求這方面的內容,也借鑑了前人的

Spring核心技術--IoC container用法

一直在使用Spring提供的IoC容器, 但是始終沒有系統化的梳理一下. 今天在這裡寫下, 也是以備以後參考之用. Ioc container的核心是BeanFactory介面, 它提供的方法能夠管理任何型別的物件. ApplicationContext是它的

Spring框架spring-web模組中的RestTemplate

RestTemplate類是spring-web模組中進行HTTP訪問的REST客戶端核心類。RestTemplate請求使用阻塞式IO,適合低併發的應用場景。 1. RestTemplate類提供了3個建構函式 RestTemplate() RestTemplate(

Spring Boot中@RequestMapping 用法之地址對映(轉)

引言 前段時間使用springboot來開發專案,並且需要使用到傳輸JSON資料,並且踩了很多坑,無意中找到了這篇文章,詳細的說明了@RequestMapping的使用 簡介: @RequestMapping RequestMappin

Spring基本功能

tex factor oid out 負責 sch bsp 初始化 pub 一、SpringIOC   Spring的控制反轉:把對象的創建,初始化,銷毀的過程交給SpringIOC容器來做,由Spring容器控制對象的生命周期。   1.1 啟動Spring容器的方式:

JavaScript中return的用法

style 返回 www log tle blog 意思 charset fun 1、定義:return 從字面上的看就是返回,官方定義return語句將終止當前函數並返回當前函數的值,可以看下下面的示例代碼: <!DOCTYPE html><html l

SVN trunk(主線) branch(分支) tag(標記) 用法和詳細操作步驟

trac load mar span 必須 最可 objc copy 右鍵 原文地址:http://blog.csdn.net/vbirdbest/article/details/51122637 使用場景: 假如你的項目(這裏指的是手機客戶端項目)的某個版本(例如1.0

js 定時器用法——setTimeout()、setInterval()、clearTimeout()、clearInterval()

ntb 幫助 .get tint num 用法 -c 函數 tel 在js應用中,定時器的作用就是可以設定當到達一個時間來執行一個函數,或者每隔幾秒重復執行某段函數。這裏面涉及到了三個函數方法:setInterval()、setTimeout()、clearI

selenium用法

key url enc element api code 需要 int question selenium用法詳解 selenium主要是用來做自動化測試,支持多種瀏覽器,爬蟲中主要用來解決JavaScript渲染問題。 模擬瀏覽器進行網頁加載,當requests,url

C# ListView用法

ont 結束 server 發生 匹配 鼠標 之前 小圖標 order 一、ListView類 1、常用的基本屬性: (1)FullRowSelect:設置是否行選擇模式。(默認為false) 提示:只有在Details視圖該屬性才有意義

linux cp命令參數及用法---linux 復制文件命令cp

linux file linux cp命令參數及用法詳解---linux 復制文件命令cp [root@Linux ~]# cp [-adfilprsu] 來源檔(source) 目的檔(destination)[root@linux

Python數據類型方法簡介一————字符串的用法

python 字符串連接 字符串用法 符串是Python中的重要的數據類型之一,並且字符串是不可修改的。 字符串就是引號(單、雙和三引號)之間的字符集合。(字符串必須在引號之內,引號必須成對)註:單、雙和三引號在使用上並無太大的區別; 引號之間可以采取交叉使用的方式避免過多轉義;

C# ListView用法(轉)

分組 創建 cti 排列 checkbox 定義 com 程序 erl 一、ListView類 1、常用的基本屬性: (1)FullRowSelect:設置是否行選擇模式。(默認為false) 提示:只有在Details視圖該屬性才有

java中的instanceof用法

定義 xtend print 繼承 interface 參數 保留 如果 ack   instanceof是Java的一個二元操作符(運算符),也是Java的保留關鍵字。它的作用是判斷其左邊對象是否為其右邊類的實例,返回的是boolean類型的數據。用它來判斷某個對象是否是

@RequestMapping 用法

同時 get() turn example track find 說明 tex -h 簡介: @RequestMapping RequestMapping是一個用來處理請求地址映射的註解,可用於類或方法上。用於類上,表示類中的所有響應請求的方法都是以該地址作為父路徑。