Java MVC视图和控制器通信的实现。(爪哇)

Java MVC视图和控制器通信的实现。(爪哇),java,model-view-controller,view,controller,communication,Java,Model View Controller,View,Controller,Communication,在我的课堂上,我们一直在学习不同的设计,比如MVC和MVP。我目前正在编写一个应用程序,它在JTable和自定义绘图中显示数据。我的问题是如何在视图和控制器之间进行通信 例如,我有一个按钮,可以将数据从文件导入模型。我想我想要的是视图通知控制器用户想要导入文件。然后,控制器执行必要的逻辑来执行此操作。视图应该如何做到这一点?我有几个选择。 1) 让控制器创建一个innerclass,每当用户点击import按钮时调用该innerclass。在这种情况下,控制器必须调用视图的方法来查看用户想要导入

在我的课堂上,我们一直在学习不同的设计,比如MVC和MVP。我目前正在编写一个应用程序,它在JTable和自定义绘图中显示数据。我的问题是如何在视图和控制器之间进行通信

例如,我有一个按钮,可以将数据从文件导入模型。我想我想要的是视图通知控制器用户想要导入文件。然后,控制器执行必要的逻辑来执行此操作。视图应该如何做到这一点?我有几个选择。 1) 让控制器创建一个innerclass,每当用户点击import按钮时调用该innerclass。在这种情况下,控制器必须调用视图的方法来查看用户想要导入的文件。 2) 让视图检测事件,然后在控制器中调用适当的方法,并将文件名传递给它


这就引出了一个更大的问题:视图是否知道控制器?我知道这些问题没有正确的答案,但最好的方法是什么?

正如您所知,控制器层在大多数情况下与视图层紧密耦合

在我作为架构师或程序员参与的项目中,我从不将业务逻辑放在控制器中。因为我从来没有见过任何技术可以将直接与视图通信的层移植到其中

控制器层应充当视图的服务层。所以是的。视图必须了解控制器。而且,如果前面的语句为真,那么控制器可以与视图通信就没有问题了

我在一个完全基于POJO的层中设计我的业务逻辑(我的@EJB或spring的@Service)。这是我的便携式业务层


控制器只是视图和业务规则层之间的桥梁。它调用业务方法,正确格式化它们的响应(有时)并发送回视图。在这种情况下,控制器可以是web服务、托管bean、测试套件等。

无论如何,视图必须了解控制器。根据我的经验,GUI生成的事件(如按钮单击、拖放等)最好在视图本身中处理,因为它们是您所使用的视图的特定类型(例如,如果您的UI是基于语音的,则会有显著差异)。控制器应该像这样公开API

importFile(String filePath)
使用1)方法,无论何时添加新视图/更改视图中的内容,都必须修改控制器。2) 方法更好。

我通常作为控制器的侦听器生成视图。通过这种方式,我可以拥有同一控制器的多个不同视图。所有视图都应该实现一些公共接口。我使用构造函数注入提供从视图到控制器的访问。所以它可以是这样的smt

InterfaceWithMethodThatViewCanCall controller = new ConcreteController(new Model);
SomeView view = new ConcreteSomeView(controller);
controller.addListener(view);
我目前尝试使用的另一种方式是通信总线。我建议您锁定GWT的哪些MVP使用示例


*不幸的是,我还没有读到任何关于这个主题的好的研究出版物。

谢谢您的回复。那么,你会说复杂的操作应该在控制器中进行,而简单的东西保留在视图中吗?这并不是真正的分界线。我想说,任何修改模型的东西都属于控制器。因此,“用户点击了一个按钮”不属于,但“用户输入了文件名”属于。那么,您认为该视图在操作流程方面更像是“领导者”吗?例如,视图需要显示一些复杂计算的结果。它将调用控制器,然后控制器对模型进行操作并返回结果?一点也不。你需要明白“模型”不是一个单一的层,它不仅仅是实体。模型是构建业务规则的组件集。视图要求模型执行一些操作。这绝对不是领导力。视图启动操作流。它调用控制器,然后控制器回答视图“这就是结果,只需显示它”。