2013-05-25 165 views
2

我正在學習MVC模式,我有一個關於模型和視圖的簡短問題。我有以下型號:MVC - 如何將數據從視圖傳遞到控制器

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

現在我想我的看法提出一些輸入來創建一個新的Person:

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

現在什麼是創造這種模式的正確方法。我應該:

1)保存在我看來,在變量用戶輸入,並通過干將讓他們在我的控制器,以創造在控制器)模型(的getName(),getAge()或

2 )我應該在視圖中創建模型並將其作爲askPerson()的結果返回?

一般來說,將這些數據從視圖傳遞到控制器的最佳方式是什麼?

謝謝!

+0

您不指定您正在使用的框架。嘗試閱讀Spring MVC或JSF教程。 – Magnilex

+0

沒有框架,只有三個包的模型,視圖,控制器。 – freakout

回答

0

創建您的bean對象,填充它並將其從View發送到Controller。類似的帖子可以幫助您編寫代碼。這裏是鏈接:

MVC sending data from View to Controller

好按您的要求,讓我把一些代碼在這裏。此代碼僅用於您理解的目的而創建。所以請根據您的需要修改它,並隨時做出任何改進。

Model類

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

}

控制器柯樂s

class MyController { 

    public void processRequest(MyModel model) { 

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

你能否提供一個用於我的示例的小代碼片段以便更好地理解?謝謝! – freakout

+0

決議更新!按照鏈接和享受;-) –

+0

謝謝,但不幸的是我不unterstand這應該如何工作。我應該爲每個模型創建一個視圖並將整個視圖對象返回給控制器? – 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方法獲取Person的ArrayList,並告訴控制器要刪除哪個人。你如何在給定的例子中實現這個場景? – freakout

+0

@freakout我知道這個實現只有觸發'update'方法的限制。如果你需要更復雜的東西,你可以添加更好的事件處理。我將把這部分留給你,因爲它與MVC毫無關係,如果你試圖爲自己弄清楚,你將學到更多東西。您可以再次提出問題,發現自己在實施時遇到問題。這裏有一篇文章讓你去http://en.wikibooks.org/wiki/Java_Programming/Event_Handling。 – Bart

相關問題