【问题标题】:Is there a way to only refresh a view in Spring MVC Controller?有没有办法只刷新 Spring MVC Controller 中的视图?
【发布时间】:2020-09-01 10:43:46
【问题描述】:

我有一个 Spring Boot 在线商店应用程序,我的购物车组件可以从几个不同的视图中访问。

我在 Thymeleaf 中发表我的观点,-+<a th:href="@{'/products/addToCart/'+${product.id}}">。现在在我的products 控制器中,我做了一些后端工作并返回一个redirect:home,但这会扼杀将这些-+ 放在那里的全部意义。我希望它返回发送请求的相同视图。可以以某种方式完成吗?我不喜欢为每个视图制作单独的控制器。

【问题讨论】:

  • 您希望在用户单击按钮时进行整页刷新,还是希望 JavaScript 发送 AJAX 请求?
  • @WimDeblauwe 无论如何,该请求将由控制器处理,因此它会重定向回/home,所以与现在的行为相同,还是我出错了?基本上我想要实现的是当用户点击+或-时,我希望后端处理购物车中的数量变化并刷新页面。 (返回与发出请求的视图相同的视图)

标签: java spring spring-boot spring-mvc thymeleaf


【解决方案1】:

您可以使用referer(是的,官方标头有错字)请求标头来了解您从哪里导航:

public String addProduct(@RequestHeader(value = HttpHeaders.REFERER, required = false) final String referrer) {
   // update cart

   // redirect to the referred
   return "redirect:" + referrer;
}

但是,这可能很脆弱。我不确定引荐来源网址是否会一直存在。

对于这样的事情,我可能会使用 JavaScript 向返回 JSON 的专用端点发出 AJAX 请求。您可以在控制器中的方法上添加 @ResponseBody,这样响应就不会被视为重定向或页面视图,而是 JSON 字符串。

@ResponseBody
public CartInfo updateCart(...) {
  // do update to cart here

  // return a CartInfo object. It will be serialized with Jackson to a JSON string
}

在您的 HTML 页面中,您需要添加一些 JavaScript 来使用纯 JS 或您选择的框架来处理 AJAX 调用。

【讨论】:

  • 推荐人的解决方案正是我一直在寻找的东西。它现在可以工作,我计划将来将此应用程序作为带有 React.js 前端的 REST API,但使用 MVC,我将保持它作为引用方式。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-09-30
  • 2015-01-15
  • 2018-05-26
  • 2018-06-12
  • 1970-01-01
  • 2013-08-22
  • 2014-06-21
相关资源
最近更新 更多