【问题标题】:How do I access values from forms on different JSP pages in the same controller in Spring MVC?如何在 Spring MVC 中的同一控制器中访问不同 JSP 页面上的表单中的值?
【发布时间】:2020-12-30 11:29:29
【问题描述】:

我正在尝试制作一个图书管理项目,其中 home.jsp 页面上有三个按钮。每个按钮重定向到一个单独的页面,每个页面都有一个表单。我有一个 Controller 类,它具有三种方法来处理来自每个页面的每个表单提交,但是当我尝试在 JSP 页面中为任何表单使用 @ModelAttribute 时,我无法获得添加到模型中的值。

这里是 home.jsp:

<body>

  <div class="container">

    <div>
      <h1>Spring Boot Web JSP Example</h1>
      <h2>Name: ${book.name}</h2>
      <h2>Author: ${book.author}</h2>
      <h2>ISBN: ${book.isbn}</h2>
    </div>

  </div>

  <form:form method="POST" action="/get" modelAttribute="newBook">
    <div class="form-group">
      <label for="authorInput">Author</label>
      <form:input path="author" cssClass="form-control" id="authorInput"></form:input>
    </div>
    <div class="form-group">
      <label for="dateInput">Date</label>
      <form:input path="date" cssClass="form-control" id="dateInput"></form:input>
    </div>
    <button type="submit" class="btn btn-primary">Get Book</button>
  </form:form>
  <a href="../add.jsp"><button type="submit" class="btn btn-primary">Add Book</button></a>
  <a href="../update.jsp"><button type="submit" class="btn btn-primary">Update Book</button></a>
</body>

这是控制器类:

@控制器 公共类 MainController {

@GetMapping(value = "/")
public String welcome(Map<String, Object> model) {
    model.put("newBook", new Book());
    model.put("updateBook", new Book());
    model.put("addBook",new Book());
    return "home";
}

@PostMapping(value = "/get")
public String change(@RequestParam("author") String author, Model model,
                     @ModelAttribute("newBook")Book book) {
    System.out.println(author);
    Book b = BookDao.getBook(book.getAuthor(), book.getDate());
    if(b == null){
        return "home";
    }
    model.addAttribute("book", b);
    model.addAttribute("newBook", new Book());
    return "home";
}
@RequestMapping(value = "/add")
public String addBook(@RequestParam("author") String author, @RequestParam("isbn") int isbn, Model model,
                      @ModelAttribute("addBook") Book book){
    System.out.println("Author: "+author + " ISBN: "+isbn);
    model.addAttribute("addBook", new Book());
    Book b= new Book(book.getName(), author,isbn, book.getDate());
    model.addAttribute("add", book);
    boolean result = BookDao.addBook(b);
    if(result)
        return "home";
    else
        return "error";
}
@RequestMapping( value = "/update")
public String updateBook(@RequestParam("author") String author, @RequestParam("isbn") int isbn, Model model,
                         @ModelAttribute("updateBook") Book book){
    System.out.println("Author: "+author + " ISBN: "+isbn);
    Book b= new Book(book.getName(), author,isbn, book.getDate());
    model.addAttribute("updateBook", new Book());
    model.addAttribute("update",b);
    BookDao.updateBook(isbn, b);
    return "home";
}

}

下面是另外两个jsp页面: 添加.jsp:

<body>

<h1>Add a Book</h1>

<form:form method="POST" action="/add" modelAttribute="addBook">
        <div class="form-group">
            <label for="nameInput">Name</label>
            <form:input path="name" cssClass="form-control" id="nameInput"></form:input>
        </div>
    <div class="form-group">
        <label for="authorInput">Author</label>
        <form:input path="author" cssClass="form-control" id="authorInput"></form:input>
    </div>
    <div class="form-group">
        <label for="isbnInput">ISBN</label>
        <form:input path="isbn" cssClass="form-control" id="isbnInput"></form:input>
    </div>
    <div class="form-group">
        <label for="dateInput">Date</label>
        <form:input path="date" cssClass="form-control" id="dateInput"></form:input>
    </div>

    <button type="submit" class="btn btn-primary">Add</button>
</form:form>


</body>

更新图书 JSP 页面:

<body>
<form:form method="POST" action="/update" modelAttribute="third">
    <div class="form-group">
        <label for="authorInput">ISBN</label>
        <form:input path="isbn" cssClass="form-control" id="authorInput"></form:input>
    </div>
    <div class="form-group">
        <label for="nameInput">Name</label>
        <form:input path="name" cssClass="form-control" id="nameInput"></form:input>
    </div>
    <div class="form-group">
        <label for="authorInput">Author</label>
        <form:input path="author" cssClass="form-control" id="authorInput"></form:input>
    </div>
    <div class="form-group">
        <label for="dateInput">Date</label>
        <form:input path="date" cssClass="form-control" id="dateInput"></form:input>
    </div>
    <button type="submit" class="btn btn-primary">Update Book</button>
</form:form>
</body>

问题是 add.jsp 页面和 update.jsp 页面中的 modelAttribute="addBook" 和 modelAttribute="third" 行抛出错误。 IDE 显示“无法解析符号 'addBook/third'”。不过,这些值在 home.jsp 页面中可用。

【问题讨论】:

    标签: java spring spring-mvc jsp


    【解决方案1】:

    既然我找到了答案,我会发布它以防其他人被它卡住。 为了访问另一个 JSP 页面上的表单,我们不能直接重定向到 MVC 设计中的页面。 为此,我们需要为每个 JSP 表单 @PostMapping 注释创建一个 @GetMapping 注释方法,然后首先重定向到 @GetMapping 方法,@GetMapping 将重定向到 JSP 页面。应该这样做:

    控制器类:

    @控制器 公共类 MainController {

    @GetMapping(value = "/")
    public String welcome(Map<String, Object> model) {
        model.put("newBook", new Book());
        return "home";
    }
    
    @PostMapping(value = "/get")
    public String change(@RequestParam("author") String author, Model model,
                         @ModelAttribute("newBook")Book book) {
        System.out.println(author);
        Book b = BookDao.getBook(book.getAuthor(), book.getDate());
        if(b == null){
            return "home";
        }
        model.addAttribute("book", b);
        model.addAttribute("newBook", new Book());
        return "home";
    }
    
    @GetMapping("/add")
    public String show(Model model) {
        model.addAttribute("addBook", new Book());
        return "add";
    }
    
    @PostMapping(value = "/add")
    public String addBook(@RequestParam("author") String author, @RequestParam("isbn") int isbn, Model model,
                          @ModelAttribute("addBook") Book book){
        System.out.println("Author: "+author + " ISBN: "+isbn);
        model.addAttribute("addBook", new Book());
        Book b= new Book(book.getName(), author,isbn, book.getDate());
        model.addAttribute("add", book);
        boolean result = BookDao.addBook(b);
        if(result)
            return "home";
        else
            return "error";
    }
    
    @GetMapping("/update")
    public String showUpdate(Model model) {
        model.addAttribute("updateBook", new Book());
        return "update";
    }
    
    @PostMapping( value = "/update")
    public String updateBook(@RequestParam("author") String author, @RequestParam("isbn") int isbn, Model model,
                             @ModelAttribute("updateBook") Book book){
        System.out.println("Author: "+author + " ISBN: "+isbn);
        Book b= new Book(book.getName(), author,isbn, book.getDate());
        model.addAttribute("updateBook", new Book());
        model.addAttribute("update",b);
        BookDao.updateBook(isbn, b);
        return "home";
    }
    

    Home.jsp页面的JSP页面应该如下:

    <form:form method="POST" action="/get" modelAttribute="newBook">
        <div class="form-group">
            <label for="authorInput">Author</label>
            <form:input path="author" cssClass="form-control" id="authorInput"></form:input>
        </div>
        <div class="form-group">
            <label for="dateInput">Date</label>
            <form:input path="date" cssClass="form-control" id="dateInput"></form:input>
        </div>
        <button type="submit" class="btn btn-primary">Get Book</button>
    </form:form>
    <a  href ="/add"><button type="submit" class="btn btn-primary">Add Book</button></a>
    <a  href ="/update"><button type="submit" class="btn btn-primary">Update Book</button></a>
    </body>

    因此 href 映射到 @GetMapping 方法以获取 ModelAttributes。其他 JSP 页面照样正常。

    另外,我可能建议的另一个好的做法是使用服务层/包来执行所有操作。因此,我们不是在 Controller 中执行它,而是将诸如 CRUD 操作之类的任务委托给 Service 层,后者又与 DAO 层交互。

    【讨论】:

      猜你喜欢
      • 2015-09-15
      • 2013-04-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多