如何在使用ajax后在JSP中显示模型属性?

时间:2017-03-03 09:20:49

标签: ajax spring jsp post model

我有问题。我使用ajax成功地将index值从JSP传递给控制器​​。当我点击“通过”时按钮,'索引'值正在增加,并使用ajax成功传递给控制器​​。根据这个索引,我将list [index]添加到model。(带model.addAttribute)尽管我在JSP中使用了${nextWord},但我在视图中看不到这个值。我该如何解决?谢谢你的回答。

控制器

private List<Map<String, Object>> list;

@RequestMapping(value="/practice/{category}", method = RequestMethod.GET)
public String practicePageStart(@PathVariable("category") String category, 
                                ModelMap model, HttpSession session){
    // return 10 value from DB. Example;
    // [{idWord=1},{word='exampleWord'},{meaning='turkishMeaning'},{type='NOUN'}]
    list = wordService.getRandomWords(Integer.parseInt(String.valueOf(session.getAttribute("wordCount"))));
    model.addAttribute("wordList", list);

    return "practiceCategory";
}

@RequestMapping(value="/practice/{category}", method = RequestMethod.POST)
public String practicePagePost(@PathVariable("category") String category, 
            @RequestParam("index") int index, ModelMap model, HttpSession session){

    model.addAttribute("nextWord", list.get(index).get("word"));

    return "practiceCategory";
}

JSP

<script>
    $(document).ready(function() {                        
        $('#pass').click(function(event) {
            var inputIndex = $('#index').val();
            $.ajax({
                type: "POST",
                url: "${pageContext.request.contextPath}/practice/${category}",
                async: false,
                data: { index: inputIndex }
                complete: function(){   
                    alert("${nextWord}");
                    $('#label').text("${nextWord}");
                }
            });
            document.getElementById("index").value = (parseInt(document.getElementById("index").value) + 1).toString();
        });
    });
</script>

3 个答案:

答案 0 :(得分:1)

使用@ResponseBody并返回对象而不是返回ViewResolver。

返回ViewResolver将解析视图并在执行Ajax调用时发送html内容。因此,如果您只需要价值,则不建议使用。

@ResponseBody示例

public @ResponseBody Integer retriveValue(-,-,-){
 return Integer.valueOf(5);
}

答案 1 :(得分:1)

在我看来,你混合不同: (1)rendring阶段(servlet容器 - 后台 - java)vs. (2)在浏览器中运行(js,此处不存在请求属性)。

你需要另一个jsp文件来渲染数据。或者你在practicePagePost方法中将其作为json返回。

@ResponseBody
@RequestMapping(value="/practice/{category}", method = RequestMethod.POST)
public String practicePagePost(@PathVariable("category") String category, 
            @RequestParam("index") int index, ModelMap model, HttpSession session){

    return list.get(index).get("word");
}

答案 2 :(得分:1)

将您的控制器方法更改为:

@RequestMapping(value="/practice/{category}", method = RequestMethod.POST)
@ResponseBody 
public String practicePagePost(@PathVariable("category") String category, 
            @RequestParam("index") int index, ModelMap model, HttpSession session){

    return list.get(index).get("word");
}

你的阿贾克斯:

            $.ajax({
                type: "POST",
                url: "${pageContext.request.contextPath}/practice/${category}",
                async: false,
                data: { index: inputIndex }
                success: function(data){   
                    alert(data);
                    $('#label').text(data);
                }
            });