// Read received message
@GetMapping(value = "msgReadReceived")
public String readReceivedMessage(@RequestParam("msg_no") Long msgNo, Model model) {
// Retrieve the message using msgNo
Message receivedMessage = msgService.getReceivedMessageById(msgNo);
// If the read date is 'null', perform an update
if (receivedMessage.getMsg_readdate() == null) {
// Update msg_readdate when the message is clicked
msgService.updateReadDate(msgNo);
// Retrieve the message again after the update
receivedMessage = msgService.getReceivedMessageById(msgNo);
}
model.addAttribute("receivedMessage", receivedMessage);
// Redirect to the message reading page
return "kdw/msgReadReceived";
}
我有一个用 @GetMapping 注释的 Spring MVC 方法,在其中检索并显示收到的消息。如果读取日期为空,我会在单击消息时更新它,然后在更新后再次检索消息。我很好奇在 Spring MVC 中的 @GetMapping 方法中执行更新操作是否被认为是可接受的。如果不鼓励这种做法,我尝试分离逻辑,但由于我的知识有限,目前面临挑战。我非常感谢有关在 Spring MVC 中处理此类场景的最佳实践的指导。如果不推荐这种方法,那么任何实现适当分离的帮助都是非常宝贵的。
HTTP 使用
@GetMapping
或 GET
方法有一些原理。
GET
旨在实现安全且幂等,这意味着它不应更改服务器的状态,并且多个相同的请求应产生相同的结果结果。
这个原则是 Web 开发实践之一。
您在访问消息时更新消息的读取日期,此操作不是幂等的,因为它会更改消息的状态(从未读到已读),更合适的是使用不同的 HTTP 方法来表示消息的更改服务器的状态,例如
POST
、PUT
或 PATCH
。
接下来,您可以使用两种方法:一种用于获取消息(使用
GET
),另一种用于将消息标记为已读(使用 POST
或 PUT
)。
@GetMapping(value = "msgReadReceived")
public String readReceivedMessage(@RequestParam("msg_no") Long msgNo, Model model) {
Message receivedMessage = msgService.getReceivedMessageById(msgNo);
model.addAttribute("receivedMessage", receivedMessage);
return "kdw/msgReadReceived";
}
@PostMapping(value = "msgMarkAsRead")
public String markMessageAsRead(@RequestParam("msg_no") Long msgNo, Model model) {
Message receivedMessage = msgService.getReceivedMessageById(msgNo);
if (receivedMessage.getMsg_readdate() == null) {
msgService.updateReadDate(msgNo);
receivedMessage = msgService.getReceivedMessageById(msgNo);
}
model.addAttribute("receivedMessage", receivedMessage);
return "redirect:/msgReadReceived?msg_no=" + msgNo;
}
readReceivedMessage
方法仍然是GET
请求,遵循不修改服务器状态的原则。
markMessageAsRead
方法是 POST
请求,适用于将消息标记为已读的操作。
这个逻辑遵循RESTful服务的原则,其中每个方法都有不同的含义。
最后,如果您使用此逻辑,请在整个应用程序中保持一致,而不仅仅是其中的一部分。