处理用户操作表单数据的正确方法是什么?

时间:2015-01-06 23:22:43

标签: java spring hibernate model-view-controller

快速概述:

我有一个试验和船舶实体。一名飞行员可以拥有很少的船只,但一次只有一艘可以活动。
现在,让我们说一名飞行员想激活另一艘船。在这种情况下,提交包含船舶ID的表格,我必须显示带有结果的消息(激活或未激活)。

假设用户在html中更改了船舶ID(到另一个用户的非现有船舶或船舶),这两种可能性中哪一种更合适?

选项1:
在负责激活船舶的服务层功能中执行检查,如果出现问题则抛出异常。然后由控制器处理该异常,并将相应的消息添加到模型中。

选项2:
在控制器内部执行验证并调用仅在数据正确时激活船舶的服务层功能。

我认为第二种选择在开始时似乎更好,但缺点是我必须进行两次确切的数据库查询才能找到这艘船。一个在控制器中用于验证目的,然后另一个在服务层中实际激活它。服务方法是@Transactional所以如果我将控制器发现的船作为参数传递,Hibernate无论如何都要从数据库中检索它,所以现在我选择了1以避免重复数据库调用,因为这看起来很糟糕。
/> 我还在学习,所以我很想知道在这种情况下更有经验的用户会说些什么。如果有更好的方法,我也愿意接受建议。提前谢谢。

2 个答案:

答案 0 :(得分:1)

您的业务逻辑应该在实体或服务类中,或者使用Hibernate Validator之类的东西。 Spring不是DDD,所以服务是正常的路线。

尽可能保持控制器中的逻辑。如果切换到不同类型的用户界面(如REST API),这会使您的模型更有用。

顺便提一下,只要你使用像Spring Security ACL这样的东西来向不正确的用户公开数据,就可以公开数据库密钥了。

答案 1 :(得分:1)

  1. GET Controller从数据库构建List,它存储在会话中,并传递给视图。
  2. 查看迭代并显示列表。 HTML表单按列表索引(从0开始)
  3. 引用每个项目
  4. POST控制器根据会话列表验证返回的表单数据。如果无效,表单将重新显示相同的列表。如果有效,所选项目的数据库ID将是列表中的一个基准,列表将从会话中删除,流程将继续...