我正在学习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()的结果返回吗?
一般来说,将这些数据从视图传递到控制器的最佳方法是什么?
谢谢!
答案 0 :(得分: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的全部目的。
答案 1 :(得分:0)
创建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.
*/
}
}