我想在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。
答案 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响应主体(而不是放在模型中, 或解释为视图名称。)
因此,例如,要在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框架来抽象掉它。