介紹Spring中ajax與後臺傳輸資料的幾種方式

2020-12-04 18:00:40

欄目介紹與後臺傳輸資料的方法

推薦(免費):

最近寫ajax與後臺傳輸資料的時候碰到了一個問題,我想ajax以json的方式把資料傳輸個後臺,後臺用map的形式接收,然後也以map的形式傳回資料。可是一直碰到前臺報(*)(@415 Unsupported media type) 不支援媒體型別錯誤,然後經過查閱資料終於解決了。這裡總結下關於ajax與後臺傳輸資料的幾種方式,上面問題的解決方法在本文最後。


1.把資料放到url中傳遞
js:
<code>
var id = $("#id").val();
$.ajax({
type: "POST",
url: "/IFTree/people/getPeopleById/"+id,//引數放在url中
success:function(data){ alert(data);
},
error:function(xhr, textStatus, errorThrown) {
}
});
</code>
後臺:

<pre><code>

@RequestMapping(value = "getPeopleById/{id}")
@ResponseBody
    public Map<String, Object> getPeopleById(@PathVariable("id") int id) {
        //@PathVariable("id") 如果引數名與url定義的一樣註解可以不用定義("id")
        System.out.println(id);
        Map<String, Object> map = new HashMap<String, Object>();
        return map;
    }
}

</code></pre>

2.把資料放到data中
js:
<code>
var id = $("#id").val();
$.ajax({
type: "POST",
url: "/IFTree/people/getPeopleById",
data: {id:id},
success:function(data){ alert(data.result);
},
error:function(xhr, textStatus, errorThrown) {
}
});
</code>
後臺(兩個方式):

<pre><code>

@RequestMapping(value = "getPeopleById")
@ResponseBody
public Map<String, Object> getPeopleById(HttpServletRequest request,HttpServletResponse response) {
    int id = Integer.valueOf(request.getParameter("id"));
    Map<String, Object> map = new HashMap<String, Object>();
    return map;
}

</code></pre>


@RequestMapping(value = "getPeopleById")
@ResponseBody
public Map<String, Object> getPeopleById(HttpServletRequest request,HttpServletResponse response) {
    int id = Integer.valueOf(request.getParameter("id"));
    // 這裡得到的都是字串得轉換成你需要的型別
    Map<String, Object> map = new HashMap<String, Object>();
    return map;
}

</code>

3.以json傳輸(就是開頭說的情況)
js(包含一些常見的ajax引數解釋):
<code>
var id = $("#id").val();
$.ajax({
type: "POST",//請求型別
timeout:10000,  //設定請求超時時間(毫秒)
async:ture,//是否為非同步請求
cache:false,//是否從瀏覽器快取中載入請求資訊。
url: "/IFTree/people/getPeopleById",
contentType: "application/json;charset=UTF-8",//提交的資料型別
data: JSON.stringify({id:id}),//這裡是把json轉化為字串形式
dataType: "json",//返回的資料型別
success:function(data){
$("#name").val(data.result.name);
},
error:function(xhr, textStatus, errorThrown) {
}
});
});
</code>
後臺:

<pre><code>

@RequestMapping(value = "getPeopleById", produces = "application/json")
@ResponseBody
public Map<String, Object> getPeopleById(@RequestBody Map<String, Object> body){
    System.out.println(""+body.get("id"));
    People people = peopleService.getPeopleById(Integer.valueOf((String)body.get("id")));
    Map<String, Object> map = new HashMap<String, Object>();
    map.put("result", people);
    return map;
}

</code></pre>

詳解:

@RequestBody
該註解首先讀取request請求的正文資料,然後使用預設設定的HttpMessageConverter進行解析,把資料繫結要物件上面,然後再把物件繫結到controllor中的引數上。
@ResponseBody
該註解也是一樣的用於將Controller的方法返回的物件,通過的HttpMessageConverter轉換為指定格式後,寫入到Response物件的body資料區。

Srping mvc .xml(設定轉換器)

<code>

 <!-- spring MVC提供的介面卡 spring預設載入 (如果不修改預設載入的4類轉換器,該bean可不設定)-->
 <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
    <property name="messageConverters">
        <!-- 該介面卡預設載入以下4類轉換器-->
        <list>
            <bean class="org.springframework.http.converter.BufferedImageHttpMessageConverter" />
            <bean class="org.springframework.http.converter.ByteArrayHttpMessageConverter" />
            <bean class="org.springframework.http.converter.xml.SourceHttpMessageConverter" />
            <bean class="org.springframework.http.converter.xml.XmlAwareFormHttpMessageConverter" />
            <bean class="org.springframework.http.converter.StringHttpMessageConverter" />
            <bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
                <property name="supportedMediaTypes">
                    <list>
                        <value>application/json;charset=UTF-8</value>
                    </list>
                </property>
            </bean><!--這裡設定了json轉換器支援的媒體型別-->
        </list>
    </property>
</bean>

</code>
ByteArrayHttpMessageConverter: 負責讀取二進位制格式的資料和寫出二進位制格式的資料;
StringHttpMessageConverter: 負責讀取字串格式的資料和寫出二進位制格式的資料;
ResourceHttpMessageConverter:負責讀取資原始檔和寫出資原始檔資料;
FormHttpMessageConverter: 負責讀取form提交的資料
MappingJacksonHttpMessageConverter: 負責讀取和寫入json格式的資料;
SouceHttpMessageConverter: 負責讀取和寫入 xml 中javax.xml.transform.Source定義的資料;
Jaxb2RootElementHttpMessageConverter: 負責讀取和寫入xml 標籤格式的資料;
AtomFeedHttpMessageConverter: 負責讀取和寫入Atom格式的資料;
RssChannelHttpMessageConverter: 負責讀取和寫入RSS格式的資料;

專案裡面我用到的只有json轉換器,所以要匯入關於json的包(maven):

<code>
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-core-asl</artifactId>
<version>1.9.11</version>
</dependency>
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-mapper-asl</artifactId>
<version>1.9.11</version>
</dependency>
</code>

同樣controller中引數也能以實體類的方式接收資料,
開始一直報(415 Unsupported media type)的錯誤是因為組態檔沒有寫對也沒匯入相應的包。
如果有哪裡不足或錯誤的地方望提出,謝謝_

想了解更多程式設計學習,敬請關注欄目!

以上就是介紹Spring中ajax與後臺傳輸資料的幾種方式的詳細內容,更多請關注TW511.COM其它相關文章!