从Spring MVC中的JSP按钮调用控制器方法

时间:2016-01-20 10:00:28

标签: java spring jsp spring-mvc

我想在Spring MVC中使用JSP页面上的按钮来调用控制器方法,但我希望它保留在当前页面上,不要重新加载它或任何东西,只需调用一个方法。我发现很难。我的按钮位于cars.jsp页面上。为了留在这个页面,我必须做这样的事情:

@RequestMapping(value="/start")
public String startCheckingStatus(Model model){
    System.out.println("start");
    model.addAttribute("cars", this.carService.getCars());
    return "car\\cars";
}

按钮:

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

但这不是一个好的解决方案,因为我的页面实际上是重新加载的。我可以在没有任何刷新,重定向或其他任何内容的情况下调用controller方法吗?当我删除返回类型时:

@RequestMapping(value="/start")
public void startCheckingStatus(Model model){
    System.out.println("start");
}

我得到了404。

2 个答案:

答案 0 :(得分:1)

在按钮上添加onclick事件,并从您的javascript调用以下代码:

 $("#yourButtonId").click(function(){
    $.ajax({
        url : 'start',
        method : 'GET',
        async : false,
        complete : function(data) {
            console.log(data.responseText);
        }
    });

});

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

答案 1 :(得分: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响应中返回一个简单的String,我们可以执行以下操作(没有@ResponseBody,框架会尝试找到一个名为&#39;某些状态的视图&#39;这显然不是什么我们想要):

@RequestMapping(value="/start")
@ResponseBody 
    public String startCheckingStatus(Model model){
    return "some status"; 
}

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

虽然有各种各样的框架可以简化这个(例如JQuery),但下面有一些使用vanilla 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]创建一个元素<div id="demo"></div> in然后,在单击页面中的按钮时,应更新此<div/>以显示控制器返回的字符串。

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