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

为什么我在Spring提交表单后得到空对象?

洪伟兆
2023-03-14

我是新来的Spring,昨天我创建了一个简单的应用程序。我键入书名、作者和流派,它将其保存到List

所以,创建书籍并将其保存到列表中效果很好。我还可以查看我添加的所有书籍。所以它工作得很好。但现在我想创建和删除它们。所以我有图书服务。可以添加和删除书籍的java。

书籍ervice.java

private List<Book> allBooks = new ArrayList<>();

public List<Book> getAllBooks() {
    return allBooks;
}

public void addBook(String title, String author, String genre) {
    allBooks.add(new Book(title, author, genre));
}

public void deleteBook(Book book) {
    allBooks.remove(book);
}

这是我的控制器中用来删除书籍的东西

@GetMapping("/books/delete")
public String deleteBook(Model model) {
    model.addAttribute("BookList", bookService.getAllBooks()); // Works fine
    return "delete";
}

@PostMapping("/books/delete")
public String deletedBook(@ModelAttribute Book book, Model model) {
    System.out.println(book.getTitle()); // null

    bookService.deleteBook(book); // can't delete null so nothing happens to the list
    model.addAttribute("deletedBook", book);
    return "deletedBookResult";
}

删去html

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
  <meta charset="UTF-8"/>
  <title>Title</title>
</head>
<body>

<h2>Delete page</h2>

<div th:each="bookObj : ${BookList}"> <!-- BookList - all books I add using submit form -->
  <form action="#" th:action="@{/books/delete}" th:object="${bookObj}" method="post"> <!-- I SEND bookObj -->
    <input type="submit" th:value="${bookObj.title}"/> <!-- WORKS. I GET BOOK'S NAME ON THIS BUTTON-->
  </form>
</div>

</body>
</html>

我使用th:each=“bookObj:${BookList}”。所以bookObj就是我添加的每一本书。这就是为什么我使用th:object=${bookObj}。我后来添加的每本书都有一个表格。它在按钮上显示它的标题。但当我按下它的时候,我在IDEA的控制台和网页上得到空值。为什么?先谢谢你。

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
  <meta charset="UTF-8"/>
  <title>Title</title>
</head>
<body>

<h2 th:text=" 'You have just deleted' + ${deletedBook.title}"></h2>
<!-- You have just deleted null -->

</body>
</html>

共有1个答案

胡俊美
2023-03-14

您没有以您的表格发送任何内容。添加一些隐藏字段:

<div th:each="bookObj : ${BookList}"> 
    <form action="#" th:action="@{/books/delete}" method="post">
        <input type="hidden" th:name="genre" th:value="${bookObj.genre}"/>
        <input type="hidden" th:name="author" th:value="${bookObj.author}"/>
        <input type="hidden" th:name="title" th:value="${bookObj.title}"/>
        <input type="submit" th:value="${bookObj.title}"/>
    </form>
</div>

或者,如果您不想在html中公开数据,您可以尝试使用某种会话对象(可能有些过分,但有时可能很有用):

@GetMapping("/books/delete")
public String deleteBook(Model model, HttpSession session) {
    session.setAttribute("BookList", new Book[]{
            new Book("Title", "Tom","genre"),
            new Book("Title 2", "Jerry","genre2")}
    );
    return "delete";
}

@PostMapping("/books/delete")
public String deletedBook(HttpSession session, Integer id, Model model) {
    Book[] books = (Book[]) session.getAttribute("BookList");
    Book book = books[id];
    System.out.println(book); 
    model.addAttribute("deletedBook", book);
    return "deletedBookResult";
}

然后像这样使用它:

<div th:each="bookObj, iter : ${session.BookList}">
    <form action="#" th:action="@{/books/delete}" method="post">
        <input type="hidden" th:name="id" th:value="${iter.index}"/>
        <input type="submit" th:value="${bookObj.title}"/>
    </form>
</div>
 类似资料:
  • 问题内容: 我有以下表格,提交后结果为空这是我的HTML: 这是我的(一部分): 该工作正常。我得到一个空对象。 问题答案: 您以HTML POST的身份提交,这意味着您正在使用。 这意味着您需要添加,这样express可以解析该请求并将其放入

  • 这个问题看起来像是重复的,但实际上不是。只是一个不断重复的微小差异。git一直告诉我:“请告诉我你是谁”,即使在设置之后。当我运行时,这就是我得到的…… 但是当我运行时,它会给我所有的详细信息… 我已经更改了我的姓名、电子邮件和代理,但当我运行命令时,它们看起来很好,即使在.gitconfig文件中,我也可以看到设置的值。可能缺少什么,因为我根本无法promise。每次它总是问我是谁? @sheu

  • 最初是这样的http://localhost:8080/HomeBankingSystem/login提交表单url后http://localhost:8080/signup这是我的控制器 公共类 家庭银行控制器 {

  • 问题内容: public class Category { 在正在生成。 问题答案: 当您执行时,您称呼孩子们的。这里没有问题,只不过您在这里调用了父对象。这将称呼孩子,等等。 不错的无限循环。 摆脱它的最好方法是将您的方法更改为: 这样,您将不打印parentCategory,而仅显示其名称,不显示无限循环,不显示StackOverflowError。 编辑: 正如博洛在下面说的那样,您将需要检

  • 我看过几个关于这个问题的帖子,但没有一个能解决我的问题。我正在使用XAMPP,在同一个文件夹中有一个html和一个php。 我要发送给php的是使用JavaScript中的表单()创建的。由于按预期打印了,它们是字符串和输入文件,因此构造良好。 但不幸的是,在php中,命令只输出,命令也输出。因此表单的内容似乎没有传递给PHP。 这里是html表单: 这里是提交表单的javascript: 这里的

  • 我有以下方法调用层次结构 在上面的场景中,我的期望是Spring应该在线程从Method od1出来时提交事务,或者如果在层次结构中的任何位置发生异常,则回滚。 但是Spring在方法2中执行更新后立即提交事务。我不明白为什么? 更新:-即使我将事务更改为事务(传播=传播。需要\u NEW),它仍会提交事务。所以没有影响