【问题标题】:MVC - How to pass data from view to controllerMVC - 如何将数据从视图传递到控制器
【发布时间】:2013-05-20 21:58:43
【问题描述】:

我现在正在学习 MVC 模式,我有一个关于模型和视图的简短问题。我有以下型号:

class Person {
  private String name;
  private int age;
}

现在我想让我的视图请求一些输入来创建一个新的人:

public void askPerson() {
  System.out.println("Enter name:");
  //read with System.in
  System.out.println("Enter age:");
  //read with System.in
}

现在创建此模型的正确方法是什么。我应该:

1) 将用户输入保存在我的视图中的变量中,并通过 getter 将它们获取到我的控制器中,以便在控制器中创建模型(getName()、getAge())或

2) 我应该在视图中创建模型并将其作为 askPerson() 的结果返回吗?

一般而言,将此类数据从视图传递到控制器的最佳方式是什么?

谢谢!

【问题讨论】:

  • 您没有指定您正在使用哪个框架。尝试阅读 Spring MVC 或 JSF 教程。
  • 没有框架,只有模型、视图、控制器三个包。

标签: java model-view-controller view model


【解决方案1】:

最简洁的方法是让控制器监听视图。反过来,视图可以告诉控制器需要发生的事情。

Here is a fully functional example that can be compiled and run

简而言之就是这样。

在本例中,我们假设控制器已作为观察者添加到视图中。

将通知其观察者(控制器)的视图。

class CreatePersonView extends Observable implements View {
    public void display() {
        System.out.println("\nWelcome to the create person view!");
        System.out.println("----------------------------------");

        System.out.print("Name: ");
        String name = System.console().readLine().trim();

        System.out.print("Age: ");     
        int age = Integer.valueOf(System.console().readLine().trim());

        Map<String, Object> data = new HashMap<String, Object>();

        data.put("name", name);
        data.put("age", age);

        // generate the event
        setChanged();
        notifyObservers(data);
    }
}

将使用该事件的控制器。

class Controller implements Observer {

    PersonService service;

    public void setPersonService(PersonService service) {
        this.service = service;
    }

    // simplified version
    public void update(Observable sender, Object arg) {
        Map data = (Map)arg;
        Person p = service.create((String)data.get("name"), (Integer)data.get("age"));

        //debug
        System.out.println("Created new person: " + p);
    }
}

这里的主要好处是控制器对视图的实现一无所知,反之亦然。使它们松散耦合和可互换。 这就是 MVC 的全部目的

【讨论】:

  • @Bart 谢谢!这种模式真的很容易理解,而且看起来效果很好。但是你将如何在这个例子中实现另一个功能,例如如果你想删除一个人? view 方法获取一个 ArrayList 的 Persons 并且应该告诉控制器要删除哪个人。您将如何在给定示例中实现此场景?
  • @freakout 我知道这个实现有只触发update 方法的限制。如果您需要更复杂的东西,您可以添加更好的事件处理。我将把这部分留给你,因为它与 MVC 无关,如果你尝试自己弄清楚,你会学到更多。你可以再问一个问题,你发现自己在实施它时遇到了麻烦。这里有一篇文章可以让你继续前进en.wikibooks.org/wiki/Java_Programming/Event_Handling
【解决方案2】:

创建您的 bean 对象,填充它并将其从 View 发送到 Controller。类似的帖子可以帮助您编写代码。这是链接:

MVC sending data from View to Controller

好的,根据您的要求,让我在这里放一些代码。创建此代码仅用于您的理解。因此,请根据您的需要对其进行修改,并随时进行任何改进。

模型类

class MyModel {
      private String name;
      private int age;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    @Override
    public String toString() {
        return "MyModel [name=" + name + ", age=" + age + "]";
    }


}

查看类

类 MyView {

/**
 * Create view elements, take user inputs and  
 * set the in the model object. Finally send it
 * to the controller for processing
 */


private void onSomeViewEvent(Object myevent) {
    MyModel model = new MyModel();

    // take the properties from event and set in model
    model.setAge(25);
    model.setName("Yourname");

    // send to controller
    MyController controller = new MyController();
    controller.processRequest(model);
}

}

控制器类

class MyController {

    public void processRequest(MyModel model) {

        /**
         * Inspect the model and process it as per your need.
         */
    }
}

【讨论】:

  • 您能否为我的示例提供一个小代码 sn-p 以便更好地理解?谢谢!
  • 谢谢,但不幸的是我不明白这应该如何工作。我应该为每个模型创建一个视图并将整个视图对象返回给控制器吗?
  • @freakout 更新了分辨率以帮助您提供一些示例代码。
  • 谢谢,所以在视图中创建模型对象似乎没问题。我有点担心在这种情况下视图与模型紧密相关。
  • 模型用于传递信息。没有问题。您没有在视图中放置由控制器处理的任何处理逻辑。因此,所有层都在发挥作用。如果您愿意,您可以创建一个不同的类来传输信息并创建一个不同的类来保存信息。但一切都取决于需要。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多