1

我使用 Spring Framework 3.1,我有一个页面,它显示一个对象列表。例如:

<c:forEach var="person" items="${restaurants}">
...
</c:forEach>

以及控制器方法(1)的代码:

    @RequestMapping(value = "/people",method = RequestMethod.GET)
 private String restaurants(Map<String, Object> map) {
    List<Restaurant> r=new ArrayList<Restaurant>();
    for(int i=0;i<5;i++)
    {
        Restaurant restaurant=new Restaurant();
        restaurant.setAbout("bla bla!"+i);
        restaurant.setName("REstaurant"+i);
        r.add(restaurant);
    }
    map.put("restaurants",r);
    return "/restaurants";
  }

现在我想使用 AJAX 动态更改信息。

我的 AJAX POST 请求方法(二):

@RequestMapping(value = "/restaurant")
private  @ResponseBody List<Restaurant> restaurant(Map<String, Object> map,
@RequestParam(value = "id", required = false) Long id,HttpServletResponse response) {
    List<Restaurant> r=new ArrayList<Restaurant>();
    for(int i=0;i<5;i++)
    {
        Restaurant restaurant=new Restaurant();
        restaurant.setAbout("bla bla bla!"+i);
        restaurant.setName("REstaurant"+i);
        r.add(restaurant);
    }
    return r;
}

ajax请求后如何显示收到的信息?我可以用 c:forEach 标签再做一次吗?我知道我应该重写我的第二种方法。根据第二种方法中的 id 参数,获取对象并将其放入第一种方法中使用的同一模型页面?

4

2 回答 2

1

有两种方法可以解决此问题,但您不能将c:forEach标记与返回的 Ajax 请求混合使用JSON

第一种方法是发送从第二个控制器Ajax检索数据的请求。JSON

$.post("/restaurant", {id:1}, function(data){
   /* Write the json returned in the data parameter
      to the user interface by creating dynamic HTML
    */  
});

这种方法不能利用for:each标记,因为 ajax 请求由客户端处理,而 JSTLforeach标记是一种服务器端技术。

另一种方法是将选择标记的标记放入片段中。这将允许您重用组件并独立调用它。

所以让我们在你的主页(限制)中说你有:

<div id="theSelect">
   <jsp:include page="myFragment.jsp"/>
</div>

片段(myFragment.jsp)看起来像:

<c:forEach var="person" items="${restaurants}">
...
</c:forEach>

假设设置了适当的 ViewResolver,您可以修改控制器以返回视图而不是 JSON。

@RequestMapping(value = "/restaurant")
private  String restaurant(Map<String, Object> map,
@RequestParam(value = "id", required = false) Long id,HttpServletResponse response) {
    List<Restaurant> r=new ArrayList<Restaurant>();
    for(int i=0;i<5;i++)
    {
        Restaurant restaurant=new Restaurant();
        restaurant.setAbout("bla bla bla!"+i);
        restaurant.setName("REstaurant"+i);
        r.add(restaurant);
    }
    map.put("restaurants",r);
    return "myFragment";
}

然后,您可以使用 jQuery 重新加载select元素:

$("#theSelect").load("/restraunt");

所以简而言之,我推荐两种方法:

  1. 通过 ajax 检索 JSON 并通过 Javascript 构建选择元素,然后用新构建的元素替换现有的选择元素。这是一种传统的客户端方法。

  2. 使选择元素成为片段。使控制器的响应返回片段并将此元素加载到 DOM 中。

于 2013-09-11T09:12:09.980 回答
0

@Kevin 的帖子是正确的,您确实需要在配置中添加一些 jar,并且您需要实现一个 ContentNegotiatingViewResolver 以从您的控制器生成 JSON。

该视频涵盖了准确设置您要执行的操作的所有步骤。

于 2013-09-11T16:10:02.157 回答