如何在 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";
}
...那么您应该能够在您的购物篮存储库中看到您新存储的购物篮对象。
我正在自学 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>
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";
}
...那么您应该能够在您的购物篮存储库中看到您新存储的购物篮对象。