有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

JavaSpring和Jquery

我使用SpringFramework3.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请求方法(2):

@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参数,获取对象并将其放入第一个方法中使用的同一个模型页面


共 (2) 个答案

  1. # 1 楼答案

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

    This video涵盖了准确设置您要执行的操作的所有步骤

  2. # 2 楼答案

    有两种方法可以实现这一点,但是不能将c:forEach标记与返回JSON的Ajax请求混合使用

    第一种方法是发送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标记是服务器端技术

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

    因此,让我们在主页(Restarunts)中说:

    <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构建select元素,然后用新构建的元素替换现有的select元素。这是一种传统的客户端方法

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