Spring Boot:重定向和刷新模型和页面



我有一个spring-boot应用程序,其中包含theyemleaf。我反复更新页面,并将其重定向到同一页面,因此我希望页面的元素得到更新:

@GetMapping("/suggested-events/vote/{eventId}")         
public String voteForEvents(Model model,
@PathVariable("eventId") Long eventId,
@RequestParam(value = "message", required = false) String message ) {
log.info("The message is: "+message);
SuggestedEvent event = suggestedEventService.findSuggestedEventById(eventId);
ArrayList<SuggestedEvent> events = suggestedEventService.findSuggestedEventsByArea(event.getArea());
model.addAttribute("mainEvent",event);
model.addAttribute("events",events);
model.addAttribute("message",message);
return "/suggested-event/vote";
}

当视图中的按钮被按下时,它会触发以下张贴方法:

@PostMapping("/suggested-events/vote")
public String voteForASuggestedEvent(RedirectAttributes redirectAttributes){
log.info("You have made a vote");
redirectAttributes.addAttribute("message", "Success");
return "redirect:/suggested-events/vote/1";
}

该第二控制器方法执行操作并生成message,并将其重定向到第一方法。因此,它成功地重定向到第一个方法,并记录

log.info("The message is: "+message);

但它不会刷新我的页面,我没有得到消息作为模型

当我重定向到第一个方法时,我希望它将message添加到我的模型中:

model.addAttribute("message",message);

但它没有添加到我的页面

,当视图中的按钮被按下时,它会触发下面的帖子方法:

听起来这个触发器使用的是AJAX,而不是表单提交。这样做会符合你描述的症状。

如果使用AJAX从POST/suggested-events/vote,服务器将返回一个302,浏览器将跟随它。但是,该302的响应仍然是AJAX调用的结果。您可以在成功回调中访问它,但浏览器不会为您呈现它。

但它不会刷新我的页面

如果302没有导致您的页面重新呈现,这也表明您正在使用AJAX。

如果您实际使用表单提交,浏览器将使用成功重定向返回的标记重新渲染。

这可以通过使用vote.html:中的以下两个按钮进行验证

<form action="http://localhost:8080/suggested-events/vote" method="POST">
<input type="submit" text="Submit" />
</form>
<button onclick="postmessage();" >Button</button>
<script>
function postmessage() {
$.ajax({
method: 'POST',
data: {},
url: 'http://localhost:8080/suggested-events/vote'
});
}
</script>

第一个按钮将按预期工作,第二个按钮与您描述的症状相匹配。

如果您已经使用表单,请用它更新问题(或者更好的是,更新整个Thymelaf模板)。

我遇到了与OP描述的问题相同的问题,Mike的解释使我朝着正确的方向前进。

我正在读取一个数据库表,并使用th:each用thymelaf填充它。我想在删除项目之前添加一个javascript确认。在没有事件侦听器的情况下发送ajax GET并重新加载location.reload(true)没有到达控制器中的@GetMapping("/delete/{id}")

这个SO线程为我提供了ajax调用的答案。

<a class="btn btn-danger" href="#" th:onclick="|confirmDeletion('${u.id}')|"></a>
<script th:inline="javascript">
function confirmDeletion(id) {
if (confirm("Delete this id? " + id)) {
var http = new XMLHttpRequest();
http.open("GET", "/delete/" + id, true);
http.addEventListener("readystatechange", function() {
if (http.readyState === 4 && http.status === 200) {
window.location.reload(true);
}
});
http.send();
}
}
</script>

在Spring中有很多重定向页面的方法,但请确保模型属性off消息是否正确传递到FrontEnd或将类似参数传递到另一个处理程序,您可以看到以下文档:http://javainsimpleway.com/spring-mvc-redirecting-model-attributes-from-one-controller-to-other-controller/,希望这是有用的!!

最新更新