如何从Spring MVC控制器返回一个对象以响应AJAX请求?

时间:2014-04-24 11:06:27

标签: jquery ajax spring list controller

我必须从控制器返回一个员工列表以响应jQuery AJAX请求。我该怎么办呢?

我的控制器:

@RequestMapping("phcheck")
public ModelAndView pay(@RequestParam("empid") int empid, String fdate, String tdate) {
    ModelAndView mav = new ModelAndView("phcheck");
    List<Employee> employees = entityManager.createQuery(
        "SELECT e FROM Employee e WHERE e.empId = " + empid, Employee.class)
        .getResultList();
    mav.addObject("employees", employees); // I need this list of employee in AJAX

    return mav;
}


相关视图中的AJAX代码

$(document).ready(function () {
    $("#empid").change(function () {
        if ($("#fdate").val() != "" && $("#tdate").val() != "" && $("#empid").val() != "") {
            jQuery.ajax({
                url: "phcheck.htm?empid=" + $("#empid").val() +
                                 "&&fdate=" + $("#fdate").val() +
                                 "&&tdate=" + $("#tdate").val(),
                success: function (data) {
                    alert(data + "success");
                },
                error: function (data) {
                    alert(data + "error");
                }
            });
        } else {
            alert("Please fill the from date and to date or select the employee id");
            $("#empid .option").attr("selected", "selected");
        }
    });
});


提前谢谢。

4 个答案:

答案 0 :(得分:16)

  

我需要ajax中的员工列表

在春天,您需要对象序列化,反序列化和消息转换。在这种情况下,您需要使用@RequestBody@ResponseBody注释控制器处理程序方法。

其中:

  • @ResponseBody :将告知spring尝试转换其返回值并自动将其写入http响应。
  • @RequestBody :将告知spring尝试将传入请求正文的内容动态转换为参数对象。

在您的情况下,您需要JSON类型,您必须将@ResponseBody添加到方法签名或方法上方,并生成和使用可选的,如:

@RequestMapping(value="phcheck", method=RequestMethod.GET
                produces="application/json")
public @ResponseBody List<Employee> pay(@RequestParam("empid") int empid, String fdate, String tdate) {

  //get your employee list here
  return empList;
}

并在AJAX中使用呼叫:

  • contentType: 'application/json'属性说明您要发送的数据类型。和
  • dataType: json属性告诉jquery将接收哪种内容类型的响应。

在您的情况下contentType: 'application/json'不需要,默认一个,即'application/x-www-form-urlencoded; charset=UTF-8'就足够了。

你可以收到AJAX成功的员工名单,迭代它就像:

  success: function (data) {
          $.each(data, function(index, currEmp) {
             console.log(currEmp.name); //to print name of employee
         });    
        },

<小时/> 注意: Jackson mapper或任何其他映射器应该在buildpath上可用,以便进行JSON序列化和反序列化。

另见:

答案 1 :(得分:1)

@RequestMapping(value = "phcheck", produces = "application/json")
@ResponseBody
public ModelAndView pay(@RequestParam("empid") int empid, @RequestParam("fdate") String fdate, @RequestParam("tdate") String tdate) {

   return entityManager.createQuery("select e from Employee e where e.empId="+empid, Employee.class).getResultList();
}


url:"phcheck.htm?empid="+$("#empid").val()+"&fdate="+$("#fdate").val()+"&tdate="+$("#tdate").val()

在Spring MVC中,您必须注册MappingJackson2HttpMessageConverter就像完成here

答案 2 :(得分:1)

ModelAndView意味着您计划渲染视图,而不是。要返回对象,请使用@ResponseBody注释:

@RequestMapping("phcheck")
public @ResponseBody List<Employee> pay(@RequestParam("empid") int empid, String fdate, String tdate) {
   return entityManager.createQuery("select e from Employee e where e.empId="+empid, Employee.class).getResultList();
}

此外,您应该更加小心处理查询。您的查询是不安全的,并允许SQL注入。例如,如果某人使用empId =“'15'或'1'='1'”调用您的方法,那么它将返回整个员工列表。

答案 3 :(得分:0)

Make the method as @ResponseBody Type in the controller and in the ajax take the List from success function.

Put the Jackson Mapper file in Pom.xml file if using Maven