【问题标题】:method = RequestMethod.POST and model.addAttribute方法 = RequestMethod.POST 和 model.addAttribute
【发布时间】:2015-07-06 10:15:51
【问题描述】:

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

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

2) 然后,Controller(method) 根据来自 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
}

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

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

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

===>在jsp中返回“mypage”和[B1]部分

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

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

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

感谢@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

(解决方案的简单 cmets) 我不需要通过model.addAttribute传递距离值。

我发布时控制器中的更新方法具有字符串返回值(公共@ResponseBody String更新......), 所以我只需要将字符串(这里是'距离')返回给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>

效果很好。

【问题讨论】:

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


    【解决方案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);
    }
    

    【讨论】:

    • 感谢您的回答。我不知道我无法在已加载的 jsp 页面上刷新值。我已经尝试了您的答案并输入了您建议的代码(请在原始问题的已编辑部分中检查“此处”部分。)。但我没有成功的运气。它不会刷新距离值.. 还有其他建议吗?
    • 你能检查一下 [why?] 部分吗?谢谢。
    【解决方案2】:

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

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

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

    【讨论】:

    • 感谢您的回答,我已经尝试过您的建议(在问题的已编辑部分中查看此处):在成功中添加响应(jsp 端)重定向页面(控制器端).. 但没有运气.它不会刷新页面......还有其他建议吗?您提到了标准请求而不是 Ajax 调用……什么是标准请求?我怎样才能在代码中做到这一点?
    猜你喜欢
    • 1970-01-01
    • 2020-09-25
    • 1970-01-01
    • 1970-01-01
    • 2014-01-02
    • 1970-01-01
    • 1970-01-01
    • 2021-03-10
    • 2018-03-24
    相关资源
    最近更新 更多