Model–View–Controller

From Wikipedia, the free encyclopedia
  (Redirected from Model–view–controller)
Jump to: navigation, search
Model-View-Controller concept. The solid line represents a direct association, the dashed an indirect association (via an observer for example).

Model–View–Controller (MVC) is a software architecture,[1] currently considered an architectural pattern used in software engineering. The pattern isolates "domain logic" (the application logic for the user) from input and presentation (UI), permitting independent development, testing and maintenance of each.

The model is used to manage information and notify observers when that information changes. The model is the domain-specific representation of the data upon which the application operates. Domain logic adds meaning to raw data (for example, calculating whether today is the user's birthday, or the totals, taxes, and shipping charges for shopping cart items). When a model changes its state, it notifies its associated views so they can be refreshed.

Many applications use a persistent storage mechanism such as a database to store data. MVC does not specifically mention the data access layer because it is understood to be underneath or encapsulated by the model. Models are not data access objects; however, in very simple apps that have little domain logic there is no real distinction to be made. Active Record is an accepted design pattern which merges domain logic and data access code - a model which knows how to persist itself.

The view renders the model into a form suitable for interaction, typically a user interface element. Multiple views can exist for a single model for different purposes. A viewport typically has a one to one correspondence with a display surface and knows how to render to it.

The controller receives input and initiates a response by making calls on model objects. A controller accepts input from the user and instructs the model and viewport to perform actions based on that input.

An MVC application may be a collection of model/view/controller triads, each responsible for a different UI element.

MVC is often seen in web applications where the view is the HTML or XHTML generated by the app. The controller receives GET or POST input and decides what to do with it, handing over to domain objects (i.e. the model) that contain the business rules and know how to carry out specific tasks such as processing a new subscription.

Contents

[edit] History

MVC was first described in 1979[2] by Trygve Reenskaug, then working on Smalltalk at Xerox PARC. The original implementation is described in depth in the influential paper "Applications Programming in Smalltalk-80: How to use Model–View–Controller".[3]

There have been several derivatives of MVC. For example, Model View Presenter is used with the .NET Framework[4], and the XForms standard uses a "model-view-controller-connector architecture"[5]. However, standard MVC remains popular.[citation needed]

[edit] Overview

Though MVC comes in different flavors, control flow is generally as follows:

  1. The user interacts with the user interface in some way (for example, presses a mouse button).
  2. The controller handles the input event from the user interface, often via a registered handler or callback and converts the event into appropriate user action, understandable for the model.
  3. The controller notifies the model of the user action, possibly resulting in a change in the model's state. (For example, the controller updates the user's shopping cart.)[6]
  4. A view queries the model in order to generate an appropriate user interface (for example, the view lists the shopping cart's contents). The view gets its own data from the model. In some implementations, the controller may issue a general instruction to the view to render itself. In others, the view is automatically notified by the model of changes in state (Observer) which require a screen update.
  5. The user interface waits for further user interactions, which restarts the cycle.

Some implementations such as the W3C XForms also use the concept of a dependency graph to automate the updating of views when data in the model changes.

The goal of MVC is, by decoupling models and views, to reduce the complexity in architectural design and to increase flexibility and maintainability of code.

[edit] Selected frameworks

[edit] GUI frameworks

VCL, CLX, Cocoa, CocoaTouch

Controllers.
The controller is represented by the visual forms created either in the form designer or via code.

[edit] Combined frameworks

[edit] Java: Java Platform, Enterprise Edition (Java EE)

Simple Version implementing Java Servlets and JavaServer Pages from Java EE:

Model
The model is a collection of Java classes that form a software application intended to store, and optionally separate, data. A single front end class that can communicate with any user interface (for example: a console, a graphical user interface, or a web application).
View
The view is represented by a JavaServer Page, with data being transported to the page in the HttpServletRequest or HttpSession.
Controller
The Controller servlet communicates with the front end of the model and loads the HttpServletRequest or HttpSession with appropriate data, before forwarding the HttpServletRequest and Response to the JSP using a RequestDispatcher.

The Servlet is a Java class, and it communicates and interacts with the model but does not need to generate HTML or XHTML output; the JSPs do not have to communicate with the model because the Servlet provides them with the information—they can concentrate on creating output.

Unlike the other frameworks, Java EE defines a pattern for model objects.

Model
The model is commonly represented by entity beans, although the model can be created by a servlet using a business object framework such as Spring.
View
The view in a Java EE application may be represented by a Pages|JavaServer Page]], which may be currently implemented using a web framework, such as Adobe Flex, Struts 2, or JavaServer Faces (JSF). Alternatively, the code to generate the view may be part of a servlet.
Controller
The controller in a Java EE application may be represented by a servlet, which may be currently implemented using JavaServer Faces (JSF).

[edit] XForms

XForms is an XML format for the specification of a data processing model for XML data and user interface(s) for the XML data, such as web forms.

Model

XForms stores the Model as XML elements in the browser. They are usually placed in the non-visible <head> elements of a web page.

View

The Views are XForms controls for screen elements and can be placed directly in the visible section of web page. They are usually placed in the <body> elements of a web page.

The model and views are bound together using reference or binding statements. These binding statements are used by the XForms dependency graph to ensure that the correct views are updated when data in the model changes. This means that forms developers do not need to be able to understand either the push or pull models of event processing.

Controller

All mouse events are processed by XForms controls and XML events are dispatched.

[edit] Implementations of MVC as GUI frameworks

Smalltalk's MVC implementation inspired many other GUI frameworks, such as the following:

[edit] Implementations of MVC as web-based frameworks

In the design of web applications, MVC is implemented by web template systems as a "View for web" component.

MVC is typically implemented as a "Model 2" architecture in Sun parlance. Model 2 focuses on efficiently handling and dispatching full page form posts and reconstructing the full page via a front controller. Complex web applications continue to be more difficult to design than traditional applications because of this "full page" effect. More recently "View for web" AJAX driven frameworks that focus on firing focused UI events at specific UI Components on the page are emerging. This is causing MVC to be revisited for web application development using traditional desktop programming techniques.[citation needed]

[edit] ABAP Objects

[edit] Actionscript

[edit] ASP

[edit] C++

[edit] CFML - Adobe ColdFusion, Railo, and Open BlueDragon

[edit] Flex

[edit] Groovy

[edit] Java

MVC web application frameworks:

Java Stand-alone Application Toolkit:

[edit] JavaScript

MVC web application frameworks:

[edit] Informix 4GL

[edit] Lua

[edit] .NET

[edit] Perl

[edit] PHP

[edit] Python

[edit] Ruby

[edit] Smalltalk

[edit] XML

[edit] See also

[edit] References

[edit] External links

Personal tools
Namespaces
Variants
Actions
Navigation
Interaction
Toolbox
Print/export
Languages