寫此文的背景:在學習使用angular的$http.post()提交資料時,後台接收不到參數值,於是查閱了相關資料,尋找解決辦法。
寫此文的目的:透過上面提到的文章中的解決之道,結合自己的經驗,總結瞭如下發現。
前端:html,jquery,angular
後端:java,springmvc
一、平常使用的post提交和接收方式
前端使用jquery提交資料。
$.ajax({ url:'/carlt/loginForm', method: 'POST', data:{"name":"jquery","password":"pwd"}, dataType:'json', success:function(data){ //... } });
後端接收:
@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呼叫介面查看到的前端回傳結果:
<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>
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
查看前端:
我試過,也是行得通的。然後我又試了另一種方式。如下:
前端不變,還是:
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進行解析,然後將對應的資料綁定到要回傳的物件上;
$.ajax({ url:'/carlt/loginForm', method: 'POST', contentType:'application/json;charset=UTF-8', data:JSON.stringify({"name":"jquery","password":"pwd"}), dataType:'json', success:function(data){ //... } });ii) 再把HttpMessageConverter回傳的物件資料綁定到controller中方法的參數。
使用時機:
A) GET、POST方式提時, 根據request header Content-Type的值來判斷: