0

从 jquery 做一个帖子。POST 正在发生,但无法访问控制器添加的模型属性。

jQuery代码:

$.post('<c:url value="/savedLog.form" />', $('#logForm').serialize(), function(data, textStatus) {
    var jsonlog = "${logJson}"
    if (data === "SUCCESS") {
        alert(jsonlog);
    }
});

控制器:

public String savedLog(@RequestParam(value = "requestId", required = true) LogRequest request, ModelMap model) throws IOException 
{
    try 
    {
        //Code to populate log            
        model.addAttribute("logJson", log.getLog());
        return "success";
    }​
}

POST 工作正常,控制器方法执行成功。实际代码中有一个问题。已删除,因为它是多余的。

可能是什么问题。这条线不起作用。var jsonlog = "${logJson}" 模型属性或 jquery 有问题吗?

谢谢你。

4

1 回答 1

0

看起来您混淆了生成页面的请求(其中包含 AJAX 表单)和发生 AJAX POST 时调用的请求。

var jsonlog = "${logJson}"

只会在第一个(页面)请求上填充。AJAX POST 在呈现后无法将 JSTL 值注入您的页面。

您需要在来自 AJAX POST 的响应中将该值作为文本或 JSON 数据发送,然后从data.POST 回调中的 var 读取该值。添加@ResponseBody注解告诉 Spring 返回 JSON(可能需要添加 Jackson 库)并返回 Map ...

public @ResponseBody Map<String, String> savedLog(@RequestParam(value = "requestId", required = true) LogRequest request, ModelMap model) throws IOException {
try {
    //Code to populate log            
    //model.addAttribute("logJson", log.getLog());
    Map <String, String> map = new HashMap<String, String>();
    map.put("logJson", log.getLog());
    return map;
}​

然后在 AJAX 代码中,阅读:

$.post('<c:url value="/savedLog.form" />', $('#logForm').serialize(), function(data, textStatus) {

    if (data.logJson) {
        alert(data.logJson);
    }
}, "json"); // Note JSON dataType specified here

注意:您不应该从控制器返回“SUCCESS”作为文本。为此使用 HTTP 代码,例如,如果发生错误,则抛出 404 或 500(通过 HttpServletResponse 对象),否则当您返回 Map 时,状态将自动变为 200。

于 2012-09-14T01:26:22.587 回答