如何在SpringMVC中访问同一控制器中不同JSP页面上表单的值



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

这是主页.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页面:Add.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>

问题是modelAttribute="addBook";并且modelAttribute=";第三个">在add.jsp页面和update.jsp页面中抛出错误。IDE说";无法解析符号"addBook/第三个";。不过,home.jsp页面中提供了这些值。

既然我找到了答案,我就会把它发布出来,以防其他人被它卡住。为了访问另一个JSP页面上的表单,我们不能在MVC设计中直接重定向到该页面。为了做到这一点,我们需要为每一个JSP表单创建一个@GetMapping注释方法@PostMapping注释,然后首先重定向到@GetMap方法,@GetMap将重定向到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页面也很好。

此外,我可能建议的另一个好做法是使用服务层/包来执行所有操作。因此,我们不在控制器中执行它,而是将CRUD操作等任务委派给服务层,服务层又与DAO层交互。

最新更新