【发布时间】:2015-01-06 23:22:42
【问题描述】:
快速概览:
我有一个飞行员和船舶实体。一名飞行员可以拥有几艘船,但一次只能激活一艘。
现在,假设一名飞行员想要激活另一艘船。在这种情况下,提交了一个包含船舶 ID 的表单,我必须显示一条带有结果的消息(激活或未激活)。
假设用户更改了 html 中的船 id(更改为不存在的船或另一用户的船),这两种可能性中哪一种更“合适”?
选项 1:
在负责激活船的服务层功能中执行检查,如果出现问题则抛出异常。然后由控制器处理异常并将适当的消息添加到模型中。
选项 2:
在控制器内部执行验证并调用服务层函数,仅当数据正确时才激活船。
我认为第二种选择一开始似乎更好,但缺点是我必须进行两次精确的数据库查询才能找到这艘船。一个在控制器中用于验证目的,然后另一个在服务层中以实际激活它。服务方法是@Transactional,所以如果我将找到的控制器作为参数传递,Hibernate 无论如何都会从数据库中检索它,所以现在我选择了选项 1 以避免重复数据库调用,因为这看起来很糟糕。
我还在学习,所以我很想听听更有经验的用户在这种情况下怎么说。如果有更好的方法,我也愿意接受建议。提前致谢。
【问题讨论】:
-
不要将您的数据库 ID 暴露给最终用户。在Controller中,创建一个列表,在表单上,迭代列表并使用列表中的迭代次数(索引)。
-
例如,如果用户有 3 艘船的 id: 5,8,11 我应该创建一个列表并将其索引添加到 html 表单中,因此 1 代表 5、2 -> 8 和 3 -> 11. 我理解正确吗?
-
是的。然后,您只需根据列表验证表单返回的索引。
-
这是一个非常好的建议。谢谢你。
-
这个方法我有点问题。假设我在 GET 控制器中使用船舶填充列表,将列表添加到模型中,一切都很好。但是,如何在 POST 控制器中检索此列表?经过一番谷歌搜索后,我发现@SessionAttributes 可以用来实现这一点。问题是:有没有更好的方法?另外,我猜会话属性保存在服务器上,因此用户无权访问它们,因此将 ID 放在那里是安全的。如果我错了,请纠正我。
标签: java spring hibernate model-view-controller