如何通过数据响应将数据从Spring控制器发送到angularjs控制器

时间:2018-12-03 12:00:59

标签: javascript angularjs spring spring-mvc

控制器代码

@RequestMapping(value="/welcomes", method = RequestMethod.GET, produces="MediaType.application/json")
    public @ResponseBody ModelAndView welcome(@ModelAttribute UserBean userBean)
    {
        List<UserBean> usernames=new ArrayList<UserBean>();
        usernames = retrievedataservice.findAllUsers(userBean);
        System.out.println(usernames.size());
        return new ModelAndView("welcomes", "usernames", usernames);
    }

角度js代码

<script>
var app = angular.module('myApp', []);
app.controller('UserController', function($scope, $http, $location){
    $scope.usernames=[];
        var url = $location.absUrl() + "http://localhost:8080/SpringAngular/welcomes";
        $http.get(url).then(function (response) 
        {
            $scope.usernames = response.records;
        },function error(response) 
        {
            $scope.postResultMessage = "Error with status: " +  response.statusText;
        });
});
</script>
<div data-ng-app="myApp" data-ng-controller="UserController">
   <table border="1" width="50%" height="50%"> 
    <tr><th>user_name</th><th>phone</th><th>email</th></tr>
     <tr data-ng-repeat="user in usernames">
     <td>{{user.username}}</td>
      <td>{{user.phone}}</td>
       <td>{{user.email}}</td>
       </tr>   
   </table>   

实际上,控制器返回数据列表,但是angular js无法获取数据。它返回空值。它无法与angular js和控制器集成。

2 个答案:

答案 0 :(得分:1)

当您将方法注释为@ResponseBody时,此方法将不起作用,因此它将在主体中发送响应,但您将返回modelandview,这显然不起作用。

Angular不需要对modelandview做任何事情,但是它期望json响应,因此它将进行映射。

因此,通过发送List<UserBean>作为响应,更改如下所示的方法。

@RequestMapping(value="/welcomes", method = RequestMethod.GET, produces="MediaType.application/json")
    public @ResponseBody List<UserBean> welcome(UserBean userBean)
    {
        List<UserBean> usernames=new ArrayList<UserBean>();
        usernames = retrievedataservice.findAllUsers(userBean);
        System.out.println(usernames.size());
        return usernames;
    }

上述更改足以使响应正确返回到调用环境,但是您需要确保正确点击该方法。

@Dmitry var url = $location.absUrl() + "http://localhost:8080/SpringAngular/welcomes";提出的建议可能不正确。

答案 1 :(得分:1)

您的控制器没有达到您的期望: 用@ResponseBody注释方法会将方法的返回值包装在响应正文中,并且produces属性也是错误的。 尝试这样的事情:

@RequestMapping(value="/welcomes", method = RequestMethod.GET, produces="application/json")
    public @ResponseBody Object welcome(@ModelAttribute UserBean userBean)
    {
        List<UserBean> usernames=new ArrayList<UserBean>();
        usernames = retrievedataservice.findAllUsers(userBean);
        System.out.println(usernames.size());
        return usernames; // you can also do ResponseEntity.ok().body(usernames)
    }