2013-05-25 4 views
2

Я изучаю шаблон MVC прямо сейчас, и у меня есть короткий вопрос о моделях и просмотре. У меня есть следующие модели: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) сохранить введенные пользователем данные в переменных, на мой взгляд, и получить их в мой контроллер через добытчиками для того, чтобы создать модель в контроллере (GetName(), СеЬАде()) или

2) должен ли я создать модель в представлении и вернуть ее в результате askPerson()?

Что, в общем, лучший способ передать такие данные с точки зрения на контроллер?

Спасибо!

+0

Вы не указали, какую структуру вы используете. Попробуйте прочитать учебник Spring MVC или JSF. – Magnilex

+0

Без рамки, всего три пакета для модели, просмотра, контроллера. – freakout

ответ

0

Создайте свой объект bean, заполните его и отправьте его с View на Controller. Подобный пост может помочь вам написать код. Вот ссылка:

MVC sending data from View to Controller

Ok согласно вашему запросу, позвольте мне поставить код здесь. Этот код создается только для вашего понимания. Так измените его в соответствии с вашими потребностями и не стесняйтесь делать какие-либо улучшения.

класс Модель

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); 
} 

}

контроллер Clas s

class MyController { 

    public void processRequest(MyModel model) { 

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

Не могли бы вы предоставить небольшой фрагмент кода для моего примера для лучшего понимания? Спасибо! – freakout

+0

Резолюция обновлена! следуйте по ссылке и наслаждайтесь ;-) –

+0

Спасибо, но, к сожалению, я не понимаю, как это должно работать. Должен ли я создать одно представление для каждой модели и вернуть весь объект представления в контроллер? – freakout

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.

+3

@matcheek Спасибо за урок downvote и истории. – Bart

+0

@Bart Спасибо! Этот шаблон очень легко понять и, кажется, работает хорошо. Но как бы вы реализовали в этом примере еще одну функцию, например, если вы хотите удалить человека? Метод view получает ArrayList of Person и должен сообщить контроллеру, какой человек удалить. Как реализовать этот сценарий в данном примере? – freakout

+0

@freakout Я знаю, что эта реализация имеет ограничение только при запуске метода 'update'. Если вам нужно что-то более сложное, вы можете добавить лучшую обработку событий. Я оставлю эту часть вам, поскольку она не имеет ничего общего с MVC, и вы узнаете намного больше, если попытаетесь понять это сами. Вы можете снова задать вопрос о том, что вам не удается выполнить его. Вот статья, которая поможет вам перейти на http://en.wikibooks.org/wiki/Java_Programming/Event_Handling. – Bart

Смежные вопросы