在Spring MVC中如何使用AJAX渲染视图

29

我正在使用Spring MVC,需要对服务器进行异步调用并仅刷新页面的一部分。

我实际拥有的是返回字符串的控制器。 我使用JQuery(.post())函数调用控制器。

我的解决方案问题在于,我无法像使用ModelAndView作为返回类型时那样呈现JSP。

是否有任何方法可以返回已呈现的视图?

提前致谢。

Neuquino

2个回答

61

我只是想确认axtavt所提供的答案是有效的。花了我一点时间才意识到他在建议什么,所以我打算发布一个代码片段来帮助任何在我之后遇到这个问题的人。不过功劳归于他!:)


MyController.java

@Controller
public class MyController {

    @RequestMapping( method=RequestMethod.GET, value="/mainView" )
    public ModelAndView getMainView( ... ) {        
        /* do all your normal stuff here to build your primary NON-ajax view
         * in the same way you always do
         */             
    }

    /* this is the conroller's part of the magic; I'm just using a simple GET but you
     * could just as easily do a POST here, obviously
     */
    @RequestMapping( method=RequestMethod.GET, value="/subView" )
    public ModelAndView getSubView( Model model ) {
        model.addAttribute( "user", "Joe Dirt" );
        model.addAttribute( "time", new Date() );
        return new ModelAndView( "subView" );
    }

}


mainView.jsp

(...)

<script src="http://code.jquery.com/jquery-1.7.1.min.js"></script>
<script type="text/javascript">
    function doAjaxPost() {

        $.ajax({
            type: "GET",
            url: "subView",
            success: function(response) {
                $("#subViewDiv").html( response );
            }
        });
    }
</script>
<input type="button" value="GO!" onclick="doAjaxPost();" />
<div id="subViewDiv"></div>

(...)


subView.jsp

(...)

<h3>
    User Access Details
</h3>

<p>
    ${user} accessed the system on ${time}
</p>

(...)

就是这样了!太美妙了;直到现在,在Spring中进行AJAX一直都是非常麻烦的...解析大型@ResponseBody,通过在JS中串联大量HTML来构建巨大的集合...噫...我简直不敢相信这种方法有多么简单和棒——直到刚才我才意识到它!:)


1
太棒了!有了这个,我们基本上可以完全忘记js了,因为最终结果在需要呈现的html中,我们只需用jsp中所需的块替换div,我个人认为jsp比jquery/js代码更易于维护。一切伟大的东西通常都很简单。 - Aubergine
1
太棒了...我在过去的三天里一直在苦苦思索如何使用JS输出HTML内容。这个解决方案真是太棒了。感谢您的解释。我希望我能给它更高的评价。 - java_dude
5
因此,必须将此问题及其答案设置为已保护状态。;-) - Aubergine
2
是的,这不错。甚至可以说是非常聪明的解决方案。我会说,这就是解决方案:+1 - Zamboo
很好的解释,只有一个问题。可以使用对话框/弹出窗口来显示代码:$("#subViewDiv").html( response ); - JPG
是的,你应该能够使用对话框来显示代码,此前在将响应添加到 DIV 后(就像我的示例所示)。早些时候,我就是这样使用 JQuery 的 API 显示带有 AJAX 信息的模态框的。 - Bane

19

您可以将此页面片段放入单独的JSP中,并从您的方法返回指向它的ModelAndView。从那时起,AJAX调用和非AJAX调用没有区别。


我有和 OP 相同的需求,这听起来很有前途,但我还不太明白...你能详细说明一下吗?或者提供一个采用这种方法的教程链接吗? - Bane
我有点儿笨。玩了一会儿之后,我明白你想要什么了。 :) 等我弄出来一个东西之后,我会在一分钟内提供一个简短的例子。 - Bane

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接