【问题标题】:How to return an object from a Spring MVC controller in response to AJAX request?如何从 Spring MVC 控制器返回对象以响应 AJAX 请求?
【发布时间】:2014-04-24 11:06:27
【问题描述】:

我必须从控制器返回员工列表以响应 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");
        }
    });
});


提前致谢。

【问题讨论】:

    标签: jquery ajax spring list controller


    【解决方案1】:

    我需要这个 ajax 中的员工列表

    spring 当你需要对象序列化、反序列化和消息转换时。在这种情况下,您需要使用@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 序列化和反序列化。

    另请参阅:

    【讨论】:

      【解决方案2】:
      @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

      【讨论】:

      • 我已经从 jQuery ajax 获取到控制器的值,但是我无法在 jQuery ajax 中接收到控制器的返回结果。
      【解决方案3】:

      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' or '1'='1'" 调用您的方法,那么它将返回整个员工列表。

      【讨论】:

      • 如何在这种方法中增强安全性或防止sql注入,请您解释一下吗??
      • orm 工具已经限制了 sql 注入。如果您遵循他们的标准。如果您想安全起见,请使用准备好的语句来摆脱这些类型的问题。
      【解决方案4】:

      在控制器中将方法设为@ResponseBody 类型,并在ajax 中从成功函数中获取列表。

      如果使用 Maven,请将 Jackson Mapper 文件放入 Pom.xml 文件中

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-10-25
        • 2012-05-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多