方法 = RequestMethod.POST 和 model.addAttribute

method = RequestMethod.POST and model.addAttribute

我对 java 世界比较陌生。 我正在使用 Spring MVC(使用 4.0.2)Maven...

1) 我有 jsp 文件发送 json 数据 [A] 到控制器 (POST)

2) 然后,Controller(method) 根据来自 jsp

的数据计算另一个值

3) 我需要return另一个值(计算结果)[B]到jsp model.addAtrribute。

但不是 return 型号。这是我的代码。

在 JSP 文件中(原始试用版)

 $.ajax({
                url:'/mypage.html',
                    data: 'left=' + left +'&right='+ right,  ----[A1]
                    type:"POST",
                    success: function(json){
                    //alert('succeed!');
                    }   
                  });
    .........
    .........
<p style="color:red; font-size: 12pt">Distance: ${distance}</p>  --- [B1]

所以现在控制器:

在控制器中(原试用版)

@RequestMapping(value="/mypage", method = RequestMethod.POST)
public @ResponseBody String update(@RequestBody String  response, Model model) {

    String left = … response parsing…...;   ---[A2] //works fine  
    String right = … response parsing...; -----[A2] //works fine

    String distance = getDistance(left, right);   // [B2] is calculated for distance based on [A2], works fine

    model.addAttribute("distance", distance);   --- [B2]

    Return "mypage";  // [B2] should be delivered to [B1] (in jsp) and display ${distance} value
}

我已经简化了我的代码,因为响应、解析部分工作正常。

我认为(我的怀疑部分)有问题:

===> 'method=RequestMethod.post' 和 'model.addAttribute'

===> return "mypage" 和 [B1] 部分在 jsp

如果有人能指出我做错了什么,真的很感激。

====================== 已解决!!!! =====================

我在这里添加我的解决方案,以防万一, 如果有人也需要使用这种技术....

感谢@willysama 和@misko321 提供了很好的答案并指出了可以做什么和不能做什么并提供了示例代码。

[解决方法]

在控制器中(最终解决方案)

    @RequestMapping(value="/mypage", method = RequestMethod.POST)
    public @ResponseBody String update(@RequestBody String  response) {
        String left = … response parsing…...;      
        String right = … response parsing...;  
        String distance = getDistance(left, right);   //e.g. distance = 100

        return distance;    // simply return String value of distance
                            // don't need to have model.addAttribute
    }

在JSP文件中(最终解决方案)

 $.ajax({
            url:'/mypage.html',
            data: 'left=' + left +'&right='+ right, 
            type:"POST",
            success: function(response){   // here should be 'response'
             //here gets from controller
            alert('what I get?response='+response);  //what I get? response=100
            $('#distance_result').text(response);  // to [1] for refreshing distance value 

            }   
        });
    ......
    ......
    <p style="color:red; font-size: 12pt">Distance: <span id="distance_result">${distance}</span></p>   // [1] refresh the distance value which returned from controller

(解决方案的简单注释) 我不需要通过 model.addAttribute.

传递距离值

当我post有字符串return值时控制器中的更新方法(public@ResponseBody字符串更新....) , 所以我只需要 return 字符串(这里是 'distance')到 jsp

然后在 jsp 中, 'ajax success:' 部分将成功地从控制器收到这个 return 'distance' ,@willysama 和 @misko321 都指出了这一点。如下所示:

success: function(response){   
                $('#distance_result').text(response);

所以最后刷新距离值的地方..

<p style="color:red; font-size: 12pt">Distance: <span id="distance_result">${distance}</span></p>

效果很好。

在您的代码中,您进行了 Ajax 调用,而不是标准请求。所以页面 mypage 被 returned 到 Ajax 成功函数:

success: function(json) {
//alert('succeed!');
} ),

作为已呈现的 html,但页面未刷新。 我认为你应该 return 只是一个 JSON 或者甚至是一个简单的字符串,然后在 success 函数中解析它。然后您可以用新值替换旧值。 或者,您可以在 Ajax 成功刷新页面后重定向到同一页面,或者不进行 Ajax 调用,而是标准 POST 请求。

你不能那样做。您正在尝试动态更改已从服务器加载的 jsp 中的值。唯一的方法是在 javascript 中使用 ajax 调用的 return。

放置一个特定的标签或class您想要异步设置值的地方:

<p style="color:red; font-size: 12pt">Distance: <span id="distance_result">${distance}</span></p>

并更新您的成功函数以使用来自服务器的响应并在需要的地方进行设置:

success: function(json){
    $('#distance_result').text(json.responseText);
}