method = RequestMethod.POST和model.addAttribute

时间:2015-04-27 19:44:31

标签: java spring jsp maven model-view-controller

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

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

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

的数据计算另一个值

3)我需要通过model.addAtrribute将另一个值(计算结果)[B]返回给jsp。

但它没有按型号返回。这是我的代码。

在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
}

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

我认为(我的怀疑部分)是错误的:

===&GT; 'method = RequestMethod.post'和'model.addAttribute'

===&GT;返回“mypage”和[B1]部分在jsp中

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

======================解决了!!!! =====================

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

感谢@willysama和@ misko321以获得良好的答案&amp;指出什么可以和不可以,并提供示例代码。

[解决方案]

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

    @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传递距离值。

我发布时控制器中的更新方法有String返回值(public @ResponseBody String update ....), 所以我只需要将String(这里是'distance')返回给jsp

然后在jsp中, 'ajax成功:'部分将获得@willysama和@ misko321指出的控制器成功返回'距离'。如下所示:

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

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

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

运作良好。

2 个答案:

答案 0 :(得分:1)

在您的代码中,您进行Ajax调用,而不是标准请求。因此页面mypage返回到Ajax成功函数:

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

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

答案 1 :(得分:1)

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

将特定标记或类放在要异步设置值的位置:

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

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

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