在Spring MVC中如何从JSP按钮调用控制器方法

5
我想在Spring MVC中使用一个按钮调用控制器方法,但我希望它停留在当前页面,不重新加载页面或执行其他操作,只需调用该方法。我发现这很困难。我的按钮在cars.jsp页面上。为了保留在这个页面上,我必须做如下操作:
@RequestMapping(value="/start")
public String startCheckingStatus(Model model){
    System.out.println("start");
    model.addAttribute("cars", this.carService.getCars());
    return "car\\cars";
}

button:

 <a href="<spring:url value="/cars/start"/>">Start</a>

但这不是一个好的解决方案,因为我的页面实际上重新加载了。我能不能只调用controller方法而不进行任何刷新、重定向或其他操作呢?当我像这样删除返回类型时:
@RequestMapping(value="/start")
public void startCheckingStatus(Model model){
    System.out.println("start");
}

我遇到了404错误。

你需要使用像jquery、dojo等ajax框架来调用控制器,如果你不想重新加载页面。 - Pankaj Pandey
2个回答

2
在您的按钮上添加一个onclick事件,并从您的JavaScript中调用以下代码:
 $("#yourButtonId").click(function(){
    $.ajax({
        url : 'start',
        method : 'GET',
        async : false,
        complete : function(data) {
            console.log(data.responseText);
        }
    });

});

如果您想等待调用结果,请保留async:false,否则请将其删除。

0

如在其他地方提到的那样,您可以通过实现基于Ajax的解决方案来实现此目标:

https://en.wikipedia.org/wiki/Ajax_(programming)

使用Ajax,Web应用程序可以异步地(在后台)发送数据到服务器并从服务器检索数据而不干扰现有页面的显示和行为。通过将数据交换层与表示层解耦,Ajax允许Web页面以及Web应用程序动态更改内容,而无需重新加载整个页面。 要实现这一点,您需要对应用程序的客户端和服务器端部分进行更改。在使用Spring MVC时,只需将@ResponseBody注释添加到控制器方法中即可:

可以放在方法上,表示返回类型应直接写入HTTP响应正文中(而不是放置在模型中或解释为视图名称)。

http://docs.spring.io/spring/docs/current/spring-framework-reference/html/mvc.html#mvc-ann-responsebody

因此,例如,要在Ajax响应中返回一个简单的字符串,我们可以执行以下操作(如果没有@ResponseBody,则框架将尝试查找名为“some status”的视图,这显然不是我们想要的):
@RequestMapping(value="/start")
@ResponseBody 
    public String startCheckingStatus(Model model){
    return "some status"; 
}

对于客户端部分,您需要添加一些JavaScript代码,使用XMLHttpRequest对象从控制器中检索数据。

虽然有各种框架可以简化此过程(例如JQuery),但以下示例使用原始的JavaScript编写,值得先查看一些示例以了解实际情况:

http://www.w3schools.com/ajax/ajax_examples.asp

如果我们以这个具体的例子为例:

http://www.w3schools.com/ajax/tryit.asp?filename=tryajax_callback

并且 [1] 复制 <button/><script/> 元素到您的 JSP,[2] 将 URL 更改为指向您的控制器,并且 [3] 在您的 JSP 中创建一个元素 <div id="demo"></div>,然后,在单击页面中的按钮时,此 <div/> 应更新以显示您的控制器返回的字符串。

如上所述,这是一个动作的大量代码,因此您可以使用一些 JS 框架来抽象出很多内容。


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