我正在开发一个基于MVC的应用程序。我有一个包含客户端名称的数组。该数组是从数据库填充的。
控制器(Java)将此数组传递给视图(JSP),视图呈现它。客户列表需要按升序显示。此外,如果存在名为XYZ的客户端,则应始终首先在列表中显示该XYZ客户端。还有其他这样的规则。
问题是,从设计的角度来看,排序应该在哪里发生?它应该发生在控制器(Java)还是视图(JSP)中?
另外需要注意的是,我还需要提一下,使用Java编程比使用JSP / JavaScript更方便。如果没有“正确”或“错误”的方式,那么我肯定更喜欢在控制器本身中对其进行排序。
另外,从性能角度来看,哪个更好?
答案 0 :(得分:3)
从设计角度来看,控制器应该控制排序规则,但不应该自己进行排序。相反,它应该将此任务委托给模型。在理想的世界中,控制器不应对数据进行任何修改,只能告诉模型它希望如何修改数据。
不幸的是,现实经常会干扰理想的设计:当允许用户控制排序时,例如通过单击列标题,通常会采用允许视图对数据进行排序的快捷方式来减少到模型的往返次数(通常实现为数据库)从而卸载RDBMS。这个决定的一个不幸的副作用是缺乏与分页的一致性:在视图中排序对当前页面上的数据进行排序,忽略应该在当前显示的内容之前或之后的其他页面中的数据。这个缺点通常作为“特征”呈现给用户。
在您的情况下,订单显示为“业务规则”的一部分:“XYZ”记录必须保留在顶部,并且存在“其他此类规则”的事实表明排序不纯粹的视觉关注。考虑设计一种可以保存关于排序的“元数据”的某种“排序描述符”。您的控制器应创建此“排序描述符”的实例,并将其传递给模型进行处理。模型应该“解释”描述符的内容,并以正确的顺序生成数据。
答案 1 :(得分:0)
排序可以在SQL Query本身中完成(如果排序不复杂),然后你可以通过控制器将数据传递给视图。
但是,如果你有一大堆规则无法在SQL语句中实现,我只想在控制器中完成。
你总是可以创建一个存储过程并且只是调用它,在我看来它确实是一个偏好。
为了MVC模式,我喜欢将它放在控制器中,因为控制器就是为了这种东西。
答案 2 :(得分:0)
从设计的角度来看,我会说控制器应该不知道视图如何显示数据;它被排序并具有其他规则的事实纯粹是一种显示约束;哎呀,日期根本不需要在控制器中订购,它可能是HashMap
或类似的。
话虽如此,在控制器中订购东西可能更有效。
答案 3 :(得分:0)
默认排序顺序应在数据库中处理。如果数据库设计还负责将正确的索引放在适当的位置(就像正在进行默认排序的列上的聚簇索引一样),它就会进行高度优化。但是,即使在最糟糕的情况下,它也会在不迟于代码所需的时间内进行排序。
辅助排序顺序应该在视图层处理,因为这是它的工作 - 处理数据的显示方式。理想情况下,视图可以使用Comparator
来支持不同的排序顺序。如果您有表格数据的视图,并且用户请求对其他列进行排序;它应该按视图(而不是控制器或模型)进行排序。
控制器与它无关。它只是简单地编排流程或将数据移出模型;识别正确的视图并使其可供视图使用。 Controller 不处理数据;这是模型的工作。
但是,排序不是关于处理;它是关于以某种顺序呈现的,它应保持灵活性并依赖于视图。通过在模型中执行此操作,您将强调它将如何显示数据,并根据应用程序的类型(Web或桌面)进行两次排序。
我可以看到在模型中进行排序的唯一用例是在数据源根本没有排序时提供默认排序顺序(例如,它不是一个数据库,它是一个Web服务),或者,当你想要覆盖一组视图共享的订单时(它们不是自己对数据进行排序)。