当前位置: 首页 > 知识库问答 >
问题:

Spring MVC-重新加载相同的ModelAndView,但使用新的/不同的数据

巫煌
2023-03-14

试图在Spring中学习MVC的基础知识(我只使用Spring构建RESTAPI),但我很难理解如何将新数据返回到同一个视图,似乎我有很多重复的代码,HTML页面完全依赖于th:if语句。。。

发出POST请求,然后用新的/更新的数据加载同一ModelAndView的最佳方式是什么?代码如下:

控制器:

@Controller
public class ColorController {

  private ColorService colorService;

  @Autowired
  public ColorController(ColorService colorService) {
    this.colorService = colorService;
  }

  //homepage
  @GetMapping("/")
  public ModelAndView home(ModelAndView welcomeMAV) {
    welcomeMAV.setViewName("welcome");
    welcomeMAV.addObject("message", "What is your RGB color?");
    welcomeMAV.addObject("rgbcolor", new RGBColour());
    welcomeMAV.addObject("hexValue", null);
    return welcomeMAV;
  }

  @PostMapping("/color")
  public ModelAndView colorConvert(ModelAndView welcomeMAV, @ModelAttribute RGBColour rgbColour) {
    welcomeMAV.setViewName("welcome");
    welcomeMAV.addObject("message", "What is your RGB color?");
    welcomeMAV.addObject("rgbcolor", new RGBColour());
    welcomeMAV.addObject("hexValue",  colorService.convertRGBToHex(rgbColour));
    return welcomeMAV;
  }
}

欢迎html:

<!DOCTYPE HTML>
<html lang="en" xmlns:th="http://www.thymeleaf.org">

  <head th:insert="fragments/header.html">
    <!-- insert <head> html here -->
  </head>

  <body>

    <nav class="navbar navbar-expand-md navbar-dark bg-dark fixed-top">
      <a class="navbar-brand" href="#">The NavBar</a>
    </nav>

    <main role="main" class="container">

      <div class="starter-template">
        <br />
        <br />
        <br />
        <h1>Bytes and Bits</h1>
        <h2>
          Convert your colours
        </h2>
        <hr />

        <p th:if="${hexValue == null}" th:text="${message}" th:unless="${message == null}">No message</p>
      </div>

      <div class="row">
        <div class="col-md-6">
          <form th:if="${hexValue == null}" action="#" th:action="@{/color}" th:object="${rgbcolor}" method="post">
            <p>Red: <input id="red" placeholder="0" class="form-control" type="text" th:field="*{red}" onchange="getRed()" /></p>
            <p>Green: <input id="green" placeholder="0" class="form-control" type="text" th:field="*{green}" onchange="getGreen()" /></p>
            <p>Blue: <input id="blue" placeholder="0" class="form-control" type="text" th:field="*{blue}" onchange="getBlue()"/></p>
            <p><input class="btn btn-primary" type="submit" value="Submit" /> <input class="btn btn-danger" type="reset" value="Reset" /></p>
          </form>
          <p class="hex-color-text" th:if="${hexValue != null}">The hex value is: <span class="hex-color-text" id="hex-color-text" th:if="${hexValue != null}" th:text="${hexValue}"></span></p>
        </div>
        <div class="col-md-6">
          <div class="color-preview" id="color-preview">
            <p class="color-preview-text" id="color-preview-text"></p>
          </div>
        </div>
      </div>

      <a class="btn btn-primary" th:if="${hexValue != null}" href="/">Reset</a>

    </main>
    <!-- /.container -->

    <script type="text/javascript" th:src="@{/js/main.js}"></script>
  </body>
</html>

共有1个答案

周学义
2023-03-14

如果您想刷新页面而不重新加载,那么应该使用javascript或jquery

现在在你的情况下,一个控制器就足以完成所需的操作。调用同一个控制器并在道层中添加一些逻辑。

如果选择了颜色,则将其发送到jsp,否则返回null。

您可以使用mvc的所有层(控制器、服务、dao),而不是在jsp中使用逻辑

 类似资料:
  • 问题内容: 设法获得logstash(1.3.1)以将数据发送到elasticsearch(0.9.5)。 我的logstash conf文件设置是 数据存储在ES中的索引logstash-2013.12.xx下 但是,如果我重新启动logstash,请说第二天-将相同的数据重新加载到新索引中。即使我再次重新启动,索引中的文档计数也会加倍。 好像logstash重新读取数据,ES也在复制文档。 有

  • 问题内容: 我的.routing.ts文件中有这个 我的文件检查id参数并相应地加载数据。在路由器的早期版本中,如果我从/ page / 4转到/ page / 25,则该页面将“重新加载”并且组件将更新。 现在,当我尝试导航到/ page / X时,其中X是id,它只会第一次加载,然后url会更改,但是组件不会再次“重新加载”。 是否需要传递某些内容以强制重新加载组件并调用ngOnInit事件?

  • 这是我的适配器类。 当添加片段并将它们添加到适配器中的不同arraylist时,我传递了不同的arraylist,当调用get item时,我从arraylist中获取条目并将其作为参数传递给该片段,但当我运行此操作时,我最初只获得所有参数,当我更改选项卡时不会发生任何事情。我试着调试,发现getitem最初只被调用了8次,当我改变viewpager选项卡时,什么也不会发生。我也尝试了fragme

  • 问题内容: 目标:实施标准的“设置” GUI窗口。类别位于 ListView左侧,而相应选项位于Pane右侧。 (请忽略具有重复类别的明显错误;仍在处理) 在此处输入图片说明 我有一个用于整体“设置”窗口的主窗口,其中包含 ListView带有所有类别的设置。窗口的右侧 具有AnchorPane, 当从列表中选择一个类别时,用于为每个类别加载单独的FXML文件。 当用户选择类别时,我需要他们能够编

  • 我有一个用于总体设置窗口的主窗口,其中包含一个和所有设置类别。窗口的右侧有一个,用于在从列表中选择每个类别时为每个类别加载单独的FXML文件。 当一个用户选择一个类别,我需要他们能够编辑右边的设置,切换到另一个类别,并作出更多的改变。然而,如果他们回到第一类,那里所做的改变会持续下去。 我的明显问题是,每次用户更改类别时,都会重新加载FXML文件和控制器,将其中的所有控件重置为它们的默认值。 研究

  • 问题内容: 我的单页应用程序加载一个主页,我想显示一系列想法。每个创意都显示在动画Flash容器中,并显示动画以在创意之间循环。 使用$ http加载提示: 但是,为了从历史记录导航和UX中受益,我希望更新地址栏以使用$ location为每个提示显示正确的url: 我在这里调用$ apply,因为此事件来自AngularJS上下文(即Flash)。我希望保留当前的控制器/视图,并且不重新加载视图