【问题标题】:How to store Form data in a H2 Database (currently works using POSTman, but not the website form)如何在 H2 数据库中存储表单数据(目前使用 POSTman,但不能使用网站表单)
【发布时间】:2025-11-26 11:45:01
【问题描述】:

我只是在自学 Spring 框架,并试图制作一个简单的库应用程序,它将用户(书籍)输入以表单形式存储在 H2 数据库中,然后向用户显示来自 H2 数据库的新输入数据。

表单提交尝试1:

我现在有一个有效的 POST 方法,可以正确地将一本新书保存到 H2 存储库 - 但是当我尝试将此方法连接到提交表单时,不会发生这样的存储库存储。

表单提交尝试2:

使用 POSTman 3 处理 POST 请求:

使用 POSTman 4 处理 POST 请求:

代码 sn-ps 如下:

内含 Thymeleaf 表单的 HTML 文件:

    <h2> Enter a book below to add it to your basket: </h2>
    <form  action="/addToBasket" th:action="@{/addToBasket}" th:object="${book}" method="post">

        <p> Book Title: <input type="text" th:field="*{bookTitle}"></p>
        <p> Author: <input type="text" th:field="*{bookAuthor}"></p>
        <p> publicationYear: <input type="text" th:field="*{publicationYear}"></p>
        <p> price: <input type="text" th:field="*{price}"></p>
        <br>
    <!--    <input type="submit" value="Submit">-->
        <p><input type="submit" value="Submit" /> <input type="reset" value="Reset" /></p>
    </form>
    </body>
    </html>

控制器类中的 POST 方法适用于来自 POSTman 的 POST 请求,但无法以相同的方式存储表单数据:

   @PostMapping("/addToBasket")
    public Basket addToBasket(@RequestBody Basket newBook) {
 
        return basketRepository.save(newBook);
    }

篮子@实体:

@Entity
public class Basket {

    private @Id @GeneratedValue Long basketId;
    private String bookTitle;
    private String author;
    private String publisher;

    public Basket() {
    }

    public Basket( String bookTitle, String author, String publisher) {

        this.bookTitle = bookTitle;
        this.author = author;
        this.publisher = publisher;
    }

【问题讨论】:

  • 与您使用 Postman 的尝试不同,从浏览器发布表单不使用 JSON。 spring.io/guides/gs/handling-form-submission 可能会有所帮助。
  • 谢谢@AndyWilkinson 到目前为止,我实际上一直在使用本指南,但我对从浏览器发布表单实际使用的内容以及如何获取发布表单的属性并将它们保存到存储库感到困惑(作为一本书)。你知道这是如何实现的吗?
  • 别担心,安迪,我刚刚破解了它 :)

标签: java spring spring-boot thymeleaf h2


【解决方案1】:

对于任何想知道的人,这就是你的做法......

将表单设置如下,(它只需要指向控制器方法中的路径名称):

<form action="/addToBasket" method="post">
    B name:<input name="bookTitle" value="yosi"/><br>
    A name:<input name="author" value="lev"/><br>
    <input type="submit"/>
</form>

然后像这样在控制器中设置方法:

@RequestMapping(value = "/addToBasket", method = RequestMethod.POST)
    public @ResponseBody String test( Basket basket) {
        basketRepository.save(basket);
          return "Hello test : " + basket;
    }

^它将表单中的输入作为 Basket 对象接收,因此您只需将其保存到适当的存储库中,确保您在此 Basket 类中有一个 toString() 方法,以便在必要时打印出结果这样做

这是我的 Basket 课程,以防万一:

package springLibrary.domain;

import javax.persistence.*;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Objects;
import java.util.Set;

@Entity
public class Basket {

   // private Set<Book> bookBasket = new HashSet<>();
    private @Id @GeneratedValue Long basketId;
    private String bookTitle;
    private String author;
    private String publisher;
    public Basket() {
    }

    public Basket( String bookTitle, String author, String publisher) {

        this.bookTitle = bookTitle;
        this.author = author;
        this.publisher = publisher;
    }


    public Long getBasketId() {
        return basketId;
    }

    public void setBasketId(Long basketId) {
        this.basketId = basketId;
    }

    public String getBookTitle() {
        return bookTitle;
    }

    public void setBookTitle(String bookTitle) {
        this.bookTitle = bookTitle;
    }

    public String getAuthor() {
        return author;
    }

    public void setAuthor(String author) {
        this.author = author;
    }

    public String getPublisher() {
        return publisher;
    }

    public void setPublisher(String publisher) {
        this.publisher = publisher;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Basket basket = (Basket) o;
        return Objects.equals(basketId, basket.basketId);
    }

    @Override
    public String toString() {
        return "Basket{" +
                "basketId=" + basketId +
                ", bookTitle='" + bookTitle + '\'' +
                ", author='" + author + '\'' +
                ", publisher='" + publisher + '\'' +
                '}';
    }


    @Override
    public int hashCode() {
        return Objects.hash(basketId);
    }
}

^它与 HTML 文件中使用的变量名称相同。

当您运行本地托管网站时,如果您有合适的购物篮吸气剂,例如

@RequestMapping("/basket")
public String getBasket(Model model){
    model.addAttribute("basket", basketRepository.findAll());

    return "basket/list";
}

...那么您应该能够在您的购物篮存储库中看到您新存储的购物篮对象。

【讨论】: