【js類庫AngularJs】解決angular+springmvc的post提交問題

AngularJS誕生於2009年,由Misko Hevery 等人創建,後爲Google所收購。是一款優秀的前端JS框架,已經被用於Google的多款產品當中。AngularJS有着諸多特性,最爲核心的 是:MVVM、模塊化、自動化雙向數據綁定、語義化標籤、依賴注入、等等。

參考資料:

angularjs中文網:http://www.apjs.net/

angularjs官網:http://angularjs.org

 

寫此文的背景:在學習使用angular的$http.post()提交數據時,後臺接收不到參數值。

    於是查閱了相關資料(寫的最好的唯有此文http://victorblog.com/2012/12/20/make-angularjs-http-service-behave-like-jquery-ajax/)。

寫此文的目的:通過上面提到的文章中的解決之道,結合自己的經驗,總結了如下發現。

前端:html,jquery,angular

後端:java,springmvc

一、平常使用的post提交和接收方式

前端使用jquery提交數據。

複製代碼
$.ajax({
    url:'/carlt/loginForm',
    method: 'POST',   
    data:{"name":"jquery","password":"pwd"},
    dataType:'json',
    success:function(data){
        //...
    }
});
複製代碼

後端java接收:

複製代碼
@Controller
public class UserController {
    @ResponseBody
    @RequestMapping(value="/loginForm",method=RequestMethod.POST)
    public User loginPost(User user){
        System.out.println("username:"+user.getName());
        System.out.println("password:"+user.getPassword());
        return user;
    }
}
複製代碼

model(不要忘記get、set方法):

複製代碼
public class User {
    private String name;
    private String password;
    private int age;
    
    //setter getter method

}
複製代碼

後臺打印:

username:jquery
password:pwd

調用接口查看到的前端返回結果:

二、使用angularJs的post方法提交

複製代碼
<div ng-app="myApp" ng-controller="formCtrl">
  <form novalidate>
    UserName:<br>
    <input type="text" ng-model="user.username"><br>
    PassWord:<br>
    <input type="text" ng-model="user.pwd">
    <br><br>
    <button ng-click="login()">登錄</button>
  </form>
</div>
複製代碼

js代碼:

複製代碼
var app = angular.module('myApp', []);
app.controller('formCtrl', function($scope,$http) {
    $scope.login = function() {
        $http({
            url:'/carlt/loginForm',
            method: 'POST',            
            data: {name:'angular',password:'333',age:1}      
        }).success(function(){
            console.log("success!");
        }).error(function(){
            console.log("error");
        })
    };
});
複製代碼

後臺打印結果:

username:null
password:null

查看前端:

 

三、解決angular提交post問題。

相信看過上面提到的哪怕文章的人已經知道怎麼解決問題了吧。文中是更改了angular的提交方式,使得angular的提交數據方式更像jquery的。

我試過,也是行得通的。然後我又試了另外一種方式。如下:

前端不變,依然是:

複製代碼
var app = angular.module('myApp', []);
app.controller('formCtrl', function($scope,$http) {
    $scope.login = function() {
        $http({
            url:'/carlt/loginForm',
            method: 'POST',            
            data: {name:'angular',password:'333',age:1}      
        }).success(function(){
            console.log("success!");
        }).error(function(){
            console.log("error");
        })
    };
});
複製代碼

後臺變了,只是在User前加上@RequstBody,因爲angular提交的是json對象:

複製代碼
@Controller
public class UserController {
    @ResponseBody
    @RequestMapping(value="/loginForm",method=RequestMethod.POST)
    public User loginPost(@RequestBody User user){
        System.out.println("username:"+user.getName());
        System.out.println("password:"+user.getPassword());
        return user;
    }
}
複製代碼

@RequestBody

作用: 

      i) 該註解用於讀取Request請求的body部分數據,使用系統默認配置的HttpMessageConverter進行解析,然後把相應的數據綁定到要返回的對象上;

      ii) 再把HttpMessageConverter返回的對象數據綁定到 controller中方法的參數上。

使用時機:

A) GET、POST方式提時, 根據request header Content-Type的值來判斷:

  •     application/x-www-form-urlencoded, 可選(即非必須,因爲這種情況的數據@RequestParam, @ModelAttribute也可以處理,當然@RequestBody也能處理);
  •     multipart/form-data, 不能處理(即使用@RequestBody不能處理這種格式的數據);
  •     其他格式, 必須(其他格式包括application/json, application/xml等。這些格式的數據,必須使用@RequestBody來處理);

B) PUT方式提交時, 根據request header Content-Type的值來判斷:

  •     application/x-www-form-urlencoded, 必須;
  •     multipart/form-data, 不能處理;
  •     其他格式, 必須;

說明:request的body部分的數據編碼格式由header部分的Content-Type指定;

四、解決了angular問題之後,發現jquery按照原來的方式提交post請求會報錯(錯誤碼415)。如下方式可以解決jquery提交問題:

複製代碼
$.ajax({
    url:'/carlt/loginForm',
    method: 'POST',
    contentType:'application/json;charset=UTF-8',
    data:JSON.stringify({"name":"jquery","password":"pwd"}),
    dataType:'json',
    success:function(data){
        //...
    }
});
複製代碼

json對象轉json字符串:JSON.stringify(jsonObj); 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章