![](/img/trans.png)
[英]How Spring MVC getting data from Model and why is modelAttribute object created everytime after submitting form?
[英]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.