簡體   English   中英

提交表單后,為什么模型不保存我的數據?

[英]Why doesn't model save my data after submitting a form?

我的Spring MVC項目是一種事務服務,您可以在其中獲得客戶和事務列表。 我也在使用Hibernate。 我有這個客戶面板,客戶可以在其中查看他的余額,以前的交易,並能夠進行新的交易。 這是我的.jsp文件的片段

傳遞數據可以很好地傳遞,但是“ loggedClient”屬性顯示為空對象,其中空值作為值傳遞。 這僅在單擊“ 提交”按鈕后發生,並且在刷新網站時不會發生。 解決此問題的關鍵可能是LoggedClint.toString(),它返回: Client [id=0, firstName=null, lastName=null, email=null, balance=0]任何想法為什么會這樣? 如何解決此問題,以便在提交事務后,我的“ loggedClient”屬性仍然充滿客戶數據?

<div id="wrapper">
    <div id="header">
        <h2>Welcome ${loggedClient.firstName} ${loggedClient.lastName}</h2>

    </div>
    <header><label class="balancelabel" > Balance: ${loggedClient.balance} </label></header>
</div>
<br><br>
    <fieldset>
        <legend>Transfer Money</legend>
            <form:form action="transferMoney" modelAttribute="transferData" >
                <table>
                    <tbody>
                        <tr>
                            <td><label>Recipients Email:</label></td>
                            <td><form:input path="mail" /></td>
                        </tr>
                        <tr>
                            <td><label>Amount :</label></td>
                            <td><form:input path="amount" /></td>
                        </tr>
                        <tr>
                            <td><label></label></td>
                            <td><input type="submit" value="Send Transfer" class="save" /></td>
                        </tr>
                    </tbody>        
                </table>
            </form:form>
    </fieldset><div id="container">

    <div id="content">

        <table>

            <tr>
                <th>From</th>
                <th>To</th>
                <th>Amount</th>     
                <th>Timestamp</th>
                <!-- <th></th> -->
            </tr>

            <c:forEach var="tempTransfer" items="${transferList}">

                <tr>
                    <td>${tempTransfer.sender.lastName}</td>
                    <td>${tempTransfer.receiver.lastName}</td>
                    <td>${tempTransfer.amount}</td>
                    <td>${tempTransfer.timestamp}</td>


                </tr>

            </c:forEach>

        </table>

    </div>

這是控制器代碼片段:

@PostMapping("/transferMoney")
public String processTransfer(@ModelAttribute("loggedClient") Client loggedClient, @ModelAttribute("transferData") TransferDataContainer transferData, Model model) {

    Client recipient = clientService.getClient(transferData.getMail());
    System.out.println(loggedClient.toString());
    if(transferData.getAmount() > loggedClient.getBalance()) {
        System.out.println("You cannot send more than you have");
        //System.out.println("You were trying to send : " + transferData.getAmount() +" but you have " +  loggedClient.getBalance());
    } else if(recipient==null) {
        System.out.println("Invalid recepient");
    } else {
        int amount = transferData.getAmount();
        // Updating data
        loggedClient.setBalance(loggedClient.getBalance()-amount);
        recipient.setBalance(recipient.getBalance()+amount);
        Transfer transfer = new Transfer(amount, new Timestamp(System.currentTimeMillis()) , loggedClient, recipient);

        clientService.saveClient(loggedClient);
        clientService.saveClient(recipient);
        transferService.saveTransfer(transfer);

    }
    return "client-logged";

}

我相信我現在看到了問題。 發生的情況是JSP中的loggingClient不在表單內,因此在提交表單時,僅發送transferData中的內容。 如果要發回LoggedClient片段,則需要將其折疊為transferData中的隱藏輸入字段。

例如,在您的JSP中:

<form...>
    <form:hidden path="loggedClient.firstName" value="${loggedClient.firstName"/> 
    <form:hidden path="loggedClient.lastName" value="${loggedClient.lastName"/>
...
</form>

然后在您的控件中,刪除loggingClient參數。 更新您的TransferData類以包括一個loggingClient屬性,您應該一切順利。

發生這種情況是因為您的表單只有一個modelAttribute。 提交表單時,僅傳遞一個對象,即transferData。 由於logedClient不屬於表單,因此您將永遠獲得另一個null。

無論如何,即使您嘗試將loggingClient作為表單輸入參數傳遞,它也不會填充@ModelAttribute Client,因為表單已經有一個modelAttribute,上面寫着“ transferData”,您不能在其中添加另一個。

如果要傳遞loggingClient信息,則必須更改方法。 我建議對sessionedClients使用會話,不要將表單逐頁傳遞給會話。

如果會話不是您的解決方案,那么您必須使用@ModelAttribute,而不是考慮在transferData內添加loggingClient的字段並將其作為輸入參數添加到表單中(說實話,這是很糟糕的設計,所以我不建議這樣做)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM