如何在 H2 数据库中存储表单数据(目前使用 POSTman,但不是网站表单)

How to store Form data in a H2 Database (currently works using POSTman, but not the website form)

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

表单提交尝试1:

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

表单提交尝试2:

工作 POST 请求使用 POSTman 3:

工作 POST 请求使用 POSTman 4:

下面的代码片段:

其中包含 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>

控制器 class 中的

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;
    }

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

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

<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;
    }

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

这是我的购物篮class如果有用的话:

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 文件中使用的变量名称相同。

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

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

    return "basket/list";
}

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