繁体   English   中英

Spring MVC:如何在一个表中连接两个模型

[英]Spring MVC: how to connect two models in one table

我正在准备一个有两个关系表的项目。 关系类型-一对多。 这是一个图书馆系统。 我有一张桌子用来放书,一张桌子用来给客户。

租-form.jsp:

<h1>${book.title}</h1>

        <form:form action="rentBook" modelAttribute="book" method="POST">
        <!--  need to associate this data with customer id -->
        <form:hidden path="id" />

        <table>
            <tbody>
                <tr>
                    <td><label>Rental Date:</label></td>
                    <td><spring:bind path="book"><form:input path="rentalDate" /></spring:bind></td>
                </tr>

                <tr>

                    <td><label>Return Date:</label></td>
                    <td><spring:bind path="book"><form:input path="returnDate" /></spring:bind></td>
                </tr>

                <tr>
                    <td><label>Client:</label></td>
                    <td>
                    <form:select path="client">
                        <form:option value="NONE" label="--- Select ---" />
                        <c:forEach var="tempClient" items="${client}">
                         <form:option value="${tempClient.id}">${tempClient.id} ${tempClient.firstName} ${tempClient.lastName}</form:option>
                        </c:forEach>
                    </form:select>
                    </td>
                </tr>


                <tr>
                    <td><label></label></td>
                    <td><input type="submit" value="Save" class="save" /></td>
                </tr>
            </tbody>
        </table>        
        </form:form>

BookController.java:

@RequestMapping("/showFormForRent")
public String showFormForRent(@RequestParam("bookId") int theId, Model theModel) {

    List<Client> theClients = bookService.getClients();

    theModel.addAttribute("client", theClients);

    Book theBook = bookService.getBook(theId);

    theModel.addAttribute("book", theBook);


    return "rent-form";
}
@PostMapping("/rentBook")
public String rentBook(@ModelAttribute("book") Book theBook, @ModelAttribute("client") Client theClient) {

    theBook.setClient(theClient);
    bookService.saveBook(theBook);

    return "redirect:/book/list-books";
}

我想做的是,我想从钻取中获取客户,然后我要选择(我在钻取菜单中选择),并使用theBook.setClient(theClient)将客户添加到书中。 在这种情况下,“书”表中应该有一个客户ID。 而且,在此表格中,我要添加租赁日期和返回日期。

数据库图:

在此处输入图片说明

我不确定我的方法是否正确,现在我收到了错误消息:

HTTP Status 400 – Bad Request

The server cannot or will not process the request due to something that is perceived to be a client error (e.g., malformed request syntax, invalid request message framing, or deceptive request routing).

我想它以一种形式与模型有关。 也许Spring不知道客户模型在书本形式中的作用。 你们对我有什么建议吗?

您需要创建并注册一个转换器。

您正在绑定选择

<form:select path="client">

到书中的client财产。 浏览器仅发送ID,因此您需要告诉Spring如何将该ID转换为Client实例。

请参阅https://docs.spring.io/spring/docs/4.0.x/spring-framework-reference/html/validation.html中的 6.5.1转换器SPI

包org.springframework.core.convert.support;

final class StringToClient implements Converter<String, Client> {

    //wire in repository

    public Client convert(String source) {
        return clientRepo.find(Integer.valueOf(source));
    }

}

有了该代码,您的控制器代码将如下所示,即,转换器返回的客户端将由MVC框架自动绑定到该书。

@PostMapping("/rentBook")
public String rentBook(@ModelAttribute("book") Book theBook) {

    bookService.saveBook(theBook);

    return "redirect:/book/list-books";
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM