精华内容
下载资源
问答
  • 一个简单MVC模式范例

    万次阅读 2018-04-01 19:28:08
    MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制...

    MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。

    Model(模型)表示应用程序核心(比如数据库记录列表)。是应用程序中用于处理应用程序数据逻辑的部分。通常模型对象负责在数据库中存取数据。

    View(视图)显示数据(数据库记录)。是应用程序中处理数据显示的部分。通常视图是依据模型数据创建的。

    Controller(控制器)处理输入(写入数据库记录)。是应用程序中处理用户交互的部分。通常控制器负责从视图读取数据,控制用户输入,并向模型发送数据。

    MVC是一个框架模式,它强制性的使应用程序的输入、处理和输出分开。使用MVC应用程序被分成三个核心部件:模型、视图、控制器。它们各自处理自己的任务。最典型的MVC就是JSP +servlet+javabean的模式。

    下面做一个简单的示范,我们以添加一个学生的信息为例(某些顺序可以按照自己习惯进行调整):

    1.在数据库中创建一个学生表

    if exists (select * from sysdatabases where name='Test') drop database Test
    --建数据库
    go
    create database Test
    go
    use Test
    
    
    if exists (select * from  sysobjects where  name='students') drop table students
    create table students
    (
    	stuId int not null primary key identity(1,1),
    	stuName varchar(50) not null,
    	stuAge  int not null
    )
    

    2.在myeclips里添加一个javabean类

    public class Student {
    	private int stuId;//编号
    	private String stuName;//姓名
    	private int stuAge;//年龄
    	public int getStuId() {
    		return stuId;
    	}
    	public void setStuId(int stuId) {
    		this.stuId = stuId;
    	}
    	public String getStuName() {
    		return stuName;
    	}
    	public void setStuName(String stuName) {
    		this.stuName = stuName;
    	}
    	public int getStuAge() {
    		return stuAge;
    	}
    	public void setStuAge(int stuAge) {
    		this.stuAge = stuAge;
    	}
    	
    	
    }
    

    3.连接数据库和操作方法(有一个增删改的方法和查询的方法)

    注意!不要忘记sqljdbc.jar,否则为无法连接数据库

    public class Basedao {
    
    		private static final String DRIVER="com.microsoft.sqlserver.jdbc.SQLServerDriver";
    		private static final String URL="jdbc:sqlserver://localhost:1433;DatabaseName=Test";
    		private static final String USERNAME="sa";
    		private static final String PASSWORD="sa";
    		private Connection conn;//连接对象
    		protected PreparedStatement pst;//预编译的preparedstatement对象
    		protected ResultSet rs;结果集resultset对象 
    		
    		//获取数据库的连接
    		public void getConnection(){
    			try {
    				Class.forName(DRIVER);
    				conn=DriverManager.getConnection(URL,USERNAME,PASSWORD);
    			} catch (ClassNotFoundException e) {
    				e.printStackTrace();
    			} catch (SQLException e) {
    				e.printStackTrace();
    			}
    		}
    		
    		//释放资源
    		public void closeConnection(){
    			//释放结果集
    			if(rs!=null){
    			try {
    				rs.close();
    			} catch (SQLException e) {
    				e.printStackTrace();
    			}
    			}
    			释放预编译的对象
    			if(pst!=null){
    			try {
    				pst.close();
    			} catch (SQLException e) {
    				e.printStackTrace();
    			}
    			}
    			//释放连接
    			if(conn!=null){
    			try {
    				conn.close();
    			} catch (SQLException e) {
    				e.printStackTrace();
    			}
    			}
    		
    		}
    
    		//增删改
    		public int executeUpdate(String sql,String []paras){
    			int count=0;
    			try {
    				this.getConnection();//连接数据库
    				pst=conn.prepareStatement(sql);//基于sql语句创建预编译对象
    				//如果paras不为空或者长度大于0 就赋值
    				if(paras!=null && paras.length>0){
    					for (int i = 0; i < paras.length; i++) {
    						pst.setString(i+1, paras[i]);
    					}
    				}
    				count=pst.executeUpdate();
    			} catch (SQLException e) {
    				e.printStackTrace();
    			}finally{
    				closeConnection();
    			}
    			return count;
    		}
    		
    		
    		//查询
    		public ResultSet executeQuery(String sql,String[]paras){
    			try {
    				this.getConnection();//连接数据库
    				pst=conn.prepareStatement(sql);//基于sql语句创建预编译对象
    				//如果paras不为空或者长度大于0 就赋值
    				if(paras!=null && paras.length>0){
    					int index=1;
    					for (String para : paras) {
    						pst.setString(index,para);
    						index++;
    					}
    				}
    				rs=pst.executeQuery();
    			} catch (SQLException e) {
    				e.printStackTrace();
    			}
    			return rs;
    		}
    }
    4.编写具体的添加方法
    public int stuAdd(Student stu) {
    		int count=0;
    		String sql="insert into student values (?,?)";
    		String [] paras={stu.getStuName(),String.valueOf(stu.getStuAge())};
    		count=super.executeUpdate(sql, paras);
    		return count;
    	}

    5.编写jsp页面,包含非空验证,验证成功后跳入sevlet类,用jQuery注意导入jquery-1.7.1.min.js


    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
    <%
    String path = request.getContextPath();
    String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
    %>
    
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
      <head>
        <base href="<%=basePath%>">
        <script type="text/javascript" src="<%=path %>/jquery/jquery-1.7.1.min.js"></script>
        <script type="text/javascript">
        function onSubmit(){
    		var name=$("#stuName").val();
    		if(name==""){
               alert("姓名不能为空");
               return false;  // 返回false,不跳转
            }else{
               return true;   // 返回true,跳转
            }
    		
    	}
        </script>
        <title>添加</title>
      </head>
      
      <body>
        <form action="ServletAddStu" method="post">
        	<p>姓名:<input type="text" name="stuName" id="stuName"/></p>
        	<p>年龄:
        		<select name="stuAge">
        		<option value="18">18</option>
        		<option value="19">19</option>
        		<option value="20">20</option>
        		<option value="21">21</option>
        		<option value="22">22</option>
        		</select>
        	</p>
        	<p><input type="submit" value="提交" onClick="return onSubmit()"></p>
        </form>
      </body>
    </html>

    6.编写servlet类

    public void doGet(HttpServletRequest request, HttpServletResponse response)
    			throws ServletException, IOException {
    
    		this.doPost(request, response);
    	}
    public void doPost(HttpServletRequest request, HttpServletResponse response)
    			throws ServletException, IOException {
    		PrintWriter out = response.getWriter();
    		//设置编码格式
    		request.setCharacterEncoding("utf-8");
    		response.setCharacterEncoding("utf-8");
    		//得到姓名和年龄.封装到student类中
    		String name=request.getParameter("stuName");
    		int age=Integer.valueOf(request.getParameter("stuAge"));
    		Student student=new Student();
    		student.setStuName(name);
    		student.setStuAge(age);
    		//调用调价方法
    		StudentDao stuDao=new StudentDao();
    		stuDao.stuAdd(student);
    	}

    7.在数据库中查看一下是否添加成功
    展开全文
  • 他们的工作原理大家应该也比较感兴趣,下面我说说一个mvc框架长什么样。 路由机制 在互联网我们都是通过url提供服务,因此不同的url有不同的服务。用户访问不同的页面也就获得了不同的服务。那么我们的服务是如何...
  • MVC设计模式范例

    2014-06-26 17:12:26
    本文要实现的Java应用程序是当用户在图形化用户界面输入一个球体的半径时,程序将显示该球体的体积与表面积。我们首先利用基本MVC模式实现以上程序,然后利用不同数量的模型、视图、控制器结构来扩展该程序。
  • java MVC模式范例

    2009-05-10 18:37:29
    java MVC模式范例 MVC DAO
  • 并更新显示存取款后的余额 3】存取款的数额通过编辑框进行输入 程序的处理流程: 第一步】构造model实例,用于存放和处理数据 第二步】构造view实例,在构造实例的过程中使用makeController函数为界面创建一个对应的...

    程序完成功能:

    1】显示存款余额

    2】具有存取款的功能,并更新显示存取款后的余额

    3】存取款的数额通过编辑框进行输入

    程序的处理流程:

    第一步】构造model实例,用于存放和处理数据

    第二步】构造view实例,在构造实例的过程中使用makeController函数为界面创建一个对应的控制器,并将第一步构造的model实例句柄传入赋给obj.modelObj,并给这个model类的事件消息添加一个监听器,这个监听器监听到model实例中的事件信息(balanceChanged)后会调用View类的updateBalance()函数进行相应。

            function obj = View(modelObj)
                obj.viewSize = [100,100,300,200];
                obj.modelObj = modelObj;
                obj.modelObj.addlistener('balanceChanged',@obj.updateBalance);
                obj.buildUI();
                obj.controlObj = obj.makeController();
                obj.attachToController(obj.controlObj);
            end
           
    
            function controlObj = makeController(obj)
                controlObj = Controller(obj,obj.modelObj);
            end

    第三步】用View类的buildUI函数绘制主界面

    function buildUI(obj)
                obj.hfig = figure('pos',obj.viewSize);
                
                obj.drawButton = uicontrol('parent',obj.hfig,'string','withdraw','pos',[60,28,60,28]);
                obj.depositButton = uicontrol('parent',obj.hfig,'string','deposit','pos',[180,28,60,28]);
                
                obj.numBox = uicontrol('parent',obj.hfig,'style','edit','pos',[60,85,180,28],...
                    'tag','numBox');
                obj.balanceBox = uicontrol('parent',obj.hfig,'style','edit','pos',[180,142,60,28],...
                    'tag','balancebox');
                obj.text = uicontrol('parent',obj.hfig,'style','text','string','balance','pos',[60,142,60,28]);
                
                obj.updateBalance();
            end

     第四步】为主界面的按键添加控制器回调函数

            function attachToController(obj,controller)
                funcH = @controller.callback_drawbutton;
                set(obj.drawButton,'callback',funcH);
                funcH = @controller.callback_depositbutton;
                set(obj.depositButton,'callback',funcH);
            end

    第五步】按键后,对应的controller类回调函数被调用,并按照回调函数获取输入数据并对数据进行处理

            function callback_drawbutton(obj,src,event)
                obj.modelObj.withdraw(obj.viewObj.input);
            end
            function callback_depositbutton(obj,src,event)
                obj.modelObj.deposit(obj.viewObj.input);
            end

    其中回调函数调用了View类的dependent properties:obj.viewObj.input,这个变量是一个具有函数性质的变量,其具体的值取决于他的实现:实现中通过get方法获取变量input的值(get.input);这个变量input的值来源于传入的参数obj,通过获取obj.nuBox中的值赋值给get.input的返回参数input,实现变量input的确定。这里面返回参数input和成员变量input不是一回事儿,返回参数input只是个形式,在获取input的值的时候,调用的是成员变量input,也就说填入viewObj.input就相当于调用了函数get.input(),进而就获取了返回参数input的值,这个值就被赋给了viewObj.input,然后viewObj.input再作为model类obj.modelObj.withdraw函数的传入参数传了进去,进行下一步的处理。这样一圈就完成了从输入框中获取输入值的功能。

        properties(Dependent)
            input;
        end
    
            function input = get.input(obj)
                input = get(obj.numBox,'string');
                input = str2double(input);
            end
        

    第六步】 Model类中的数据处理函数响应 按键的回调函数,对数据进行处理,并触发model类的事件通知

        events
            balanceChanged
        end
    
    
            function deposit(obj,val)
                obj.balance = obj.balance + val;
                obj.notify('balanceChanged');
            end
            
            function withdraw(obj,val)
                obj.balance = obj.balance - val;
                obj.notify('balanceChanged');
            end

     第七步】因为第二步的时候再view类中给model类添加了一个事件监听器,现在发生了事件消息后,监听相应程序会根据事件做出下一步显示信息的更新,完成对事件信息的响应。

            function updateBalance(obj,scr,data)
                set(obj.balanceBox,'string',num2str(obj.modelObj.balance));
            end

     经过以上这样一套循环机制,就完成了按键的整个响应过程。

     

    以下是程序的完整代码:

    主程序

    clc
    clear 
    close all
    
    modelObj = Model(500);
    viewObj = View(modelObj);

    M(model)类

    classdef Model < handle
        properties
            balance
        end
        
        events
            balanceChanged
        end
        
        methods
            function obj = Model(balance)
                obj.balance = balance;
            end
            
            function deposit(obj,val)
                obj.balance = obj.balance + val;
                obj.notify('balanceChanged');
            end
            
            function withdraw(obj,val)
                obj.balance = obj.balance - val;
                obj.notify('balanceChanged');
            end
        end
    end

    V(view)类

    classdef View < handle
        properties
            viewSize;
            hfig;
            drawButton;
            depositButton;
            balanceBox;
            numBox;
            text;
            modelObj;
            controlObj;
        end
        properties(Dependent)
            input;
        end
        methods
            function obj = View(modelObj)
                obj.viewSize = [100,100,300,200];
                obj.modelObj = modelObj;
                obj.modelObj.addlistener('balanceChanged',@obj.updateBalance);
                obj.buildUI();
                obj.controlObj = obj.makeController();
                obj.attachToController(obj.controlObj);
            end
            function input = get.input(obj)
                input = get(obj.numBox,'string');
                input = str2double(input);
            end
            
            function buildUI(obj)
                obj.hfig = figure('pos',obj.viewSize);
                
                obj.drawButton = uicontrol('parent',obj.hfig,'string','withdraw','pos',[60,28,60,28]);
                obj.depositButton = uicontrol('parent',obj.hfig,'string','deposit','pos',[180,28,60,28]);
                
                obj.numBox = uicontrol('parent',obj.hfig,'style','edit','pos',[60,85,180,28],...
                    'tag','numBox');
                obj.balanceBox = uicontrol('parent',obj.hfig,'style','edit','pos',[180,142,60,28],...
                    'tag','balancebox');
                obj.text = uicontrol('parent',obj.hfig,'style','text','string','balance','pos',[60,142,60,28]);
                
                obj.updateBalance();
            end
            
            function updateBalance(obj,scr,data)
                set(obj.balanceBox,'string',num2str(obj.modelObj.balance));
            end
            
            function controlObj = makeController(obj)
                controlObj = Controller(obj,obj.modelObj);
            end
            
            function attachToController(obj,controller)
                funcH = @controller.callback_drawbutton;
                set(obj.drawButton,'callback',funcH);
                funcH = @controller.callback_depositbutton;
                set(obj.depositButton,'callback',funcH);
            end
        end
    end

    C(controller)类

    classdef Controller < handle
        properties
            viewObj;
            modelObj;
        end
        methods
            function obj = Controller(viewObj,modelObj)
                obj.viewObj = viewObj;
                obj.modelObj = modelObj;
            end
            
            function callback_drawbutton(obj,src,event)
                obj.modelObj.withdraw(obj.viewObj.input);
            end
            function callback_depositbutton(obj,src,event)
                obj.modelObj.deposit(obj.viewObj.input);
            end
        end
    end

     

    Context 类

    classdef Context < handle
        properties
            dataDictionary;
        end
        
        methods(Static)
            function obj = getInstance()
                persistent localObj;
                if(isempty(localObj)) || ~isvalid(localObj)
                    localObj = Context();
                end
                obj = localObj;
            end
        end
        methods (Access = private)
            function obj = Context()
                obj.dataDictionary = containers.Map();
            end
        end
        methods
            
            function register(obj,ID,data) %#ok<INUSD>
                expr = sprintf('obj.dataDictionary(\''%s\'') = data',ID);
                eval(expr);
            end
            
            function data = getData(obj,ID)
                if isKey(obj.dataDictionary,ID)
                    data = obj.dataDictionary(ID);
                else
                    error('ID NOT EXIST');
                end
            end
        end
    end

    Context 类的使用

    clc
    clear 
    close all
    
    obj1 = Model('ca');
    obj2 = Model('po');
    
    contextObj = Context.getInstance();
    contextObj.register('Camera',obj1);
    contextObj.register('PowerSource',obj2);
    
    disp(keys(contextObj.dataDictionary));
    disp(values(contextObj.dataDictionary));
    
    hCa = contextObj.getData('Camera')

    复合布局

    clc
    clear
    close all
    
    f = figure('Menubar','none','Toolbar','none','pos',[200,200,500,500]);
    % plot(1:9,[1,2,5,3,6,4,7,8,9])
    mainLayout = uiextras.HBox('Parent',f,'Spacing',10);
        leftLayout = uiextras.VBox('Parent',mainLayout,'spacing',10,'Padding',5);
            lUpperLayout = uiextras.VBox('Parent',leftLayout);
            lLowerLayout = uiextras.VBox('Parent',leftLayout);
        
        rightLayout = uiextras.VBox('Parent',mainLayout,'spacing',10);
        
    box = uicontrol('parent',lUpperLayout,'string','leftUpperButton');
    box2 = axes('parent',lLowerLayout);
    box3 = axes('parent',rightLayout);
    plot(box3,1:9,[1,2,5,3,6,4,7,8,9])
    plot(box2,1:9,[1,2,5,3,6,4,7,8,9])

     

    展开全文
  • MVC模式是设计模式中很著名的一个,理解mvc对于web开发有很好的启发作用,MVC模式范例是学习MVC的好实例。
  • mvc设计模式实例,范例

    热门讨论 2008-10-30 18:15:26
    mvc,mvc设计,mvc实例mvc,mvc设计,mvc实例
  • 本文给出它们各自在报表系统设计中的应用范例。关键字报表系统;设计模式;数据异构;多窗口支持;模型-视图-控制器1引言传统报表系统,通常是针对某个商业领域使用,其使用的报表格式往往在设计时由设计人员已经定...
  • MVC设计模式demo

    2016-03-18 13:14:36
    MVC for Android的设计模式范例,可以参考研究下,希望对大家有帮助
  • ASP.NET的mvc模式页面精美的简单模板,可以作为一个练手网站,数据库操作包含基本的增删改查,可以作为一个范例
  • ES6应用程序的最小MVC模式。 这应该为数据绑定和SOC提供接线,而没有其他功能。 为带有Sourcemap,Karma和Less的ES6模块进行设置。 设置 安装: npm install 构建: gulp (或gulp dev / gulp prod ) 测试: npm ...
  • 看了一些教程,大体搞清楚了M-V-C的大致意思,大致了解了下这个架构,但不得不承认有些具体的细节地方和WebFrm还是有差别的,这里只是简单一个实例,让它跑起来。看了一些实例,多数都是用的是LinqToSql,这里用的...

    http://www.cnblogs.com/lucky_hu/archive/2012/03/31/2426231.html

     久闻MVC的大名,只是一直没有去研究过。过去自己用的最多的还是.NET WebForm,比较习惯三层架构。由于最近公司将会使用到MVC框架做一些项目,所以自己也开始接触和学习。看了一些教程,大体搞清楚了M-V-C的大致意思,大致了解了下这个架构,但不得不承认有些具体的细节地方和WebFrm还是有差别的,这里只是简单做一个实例,让它跑起来。看了一些实例,多数都是用的是LinqToSql,这里用的是ADO的。感觉这样更顺手些,呵呵。

    由于之前做过PHP程序,所以对于前台页面的展示方式还是容易理解的。只是MVC框架里,有些默认的路由规则(当然是可以自定义的),这个规则比较特别

    好了,直接来个实例吧!

    首先,新建一个空的MVC项目,如图,这里是MVC 2.0版

    这里命名为"FirstMvc" ,自动添加好了项目的目录结构

    在"Controller"目录下面新建一个控制器,命名为"MemberController.cs"

    同时在"View"目录下添加相应的视图,这里添加一个Index

    数据逻辑的操作基本上是在控制器里面完成的,这里就是在MemberController.cs实现。

    为了更加真实,我们也在Model目录下面构建一个实体类,命名为Member.cs

    好了,准备工作做好,就开始吧

    前台——View

    复制代码
    <%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage<dynamic>" %>
    
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <style type="text/css">
            table
            {
                width: 50%;
                border-top: 1px solid #e5eff8;
                border-right: 1px solid #e5eff8;
                margin: 1em auto;
                border-collapse: collapse;
            }
            
            td
            {
                color: #678197;
                border-bottom: 1px solid #e5eff8;
                border-left: 1px solid #e5eff8;
                padding: .3em 1em;
                text-align: center;
            }
        </style>
        <script src="http://www.cnblogs.com/Scripts/jquery-1.4.1.min.js" type="text/javascript"></script>
        <title>Index</title>
        <script language="javascript" type="text/javascript">
            $(document).ready(function () {
                $("#Button1").click(function () {
                    var msg = "您好,用户" + $("#loginName").val() + ",\n"
                    + "请记好您的密码:" + $("#passWord").val() + ",\n"
                    + "你的用户编号为:" + $("#namelist").val();
                    alert(msg);
                })
            })
        </script>
    </head>
    <body>
        <div>
            <h2>
                完善下面的信息</h2>
            <table id="MemberArea">
                <thead>
                    <tr>
                        <td colspan="2">
                            <h3>
                                用户注册</h3>
                        </td>
                    </tr>
                </thead>
                <tbody>
                    <tr>
                        <td>
                            登录名
                        </td>
                        <td>
                            <%=Html.TextBox("loginName")%>
                        </td>
                    </tr>
                    <tr>
                        <td>
                            用户名
                        </td>
                        <td>
                            <%=Html.TextBox("userName")%>
                        </td>
                    </tr>
                    <tr>
                        <td>
                            密码
                        </td>
                        <td>
                            <%=Html.Password("passWord")%>
                        </td>
                    </tr>
                    <tr>
                        <td>
                            真实姓名
                        </td>
                        <td>
                            <%=Html.DropDownList("namelist")%>
                        </td>
                    </tr>
                    <tr>
                        <td colspan="2" align="center">
                            <br />
                            <input type="button" id="Button1" value="确定" />
                        </td>
                    </tr>
                </tbody>
            </table>
        </div>
    </body>
    </html>
    复制代码

    后台——Controller

    复制代码
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.Mvc;
    using System.Data;
    using System.Data.SqlClient;
    using System.Configuration;
    using FirstMvc.Models;//注意添加引用
    
    namespace FirstMvc.Controllers
    {
        /// <summary>
        /// 第一个MVC架构实例
        /// 最近接触MVC,看到大多数教程采用
        /// LinqToSql,这里写一个ADO方式的
        /// Author:LuckyHu
        /// Date:2012-03-30
        /// </summary>
        public class MemberController : Controller
        {
            //
            // GET: /Menber/
    
            //定义一些全局变量
            string connStr = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;
            SqlConnection conn = null;
            SqlCommand cmd = null;
            SqlDataReader sdr = null;
    
            public ActionResult Index()
            {
                Models.Member member = new Models.Member();
    
                sdr = GetData();
                int uid = 0;
                string name = "";
                IDictionary<int, string> nameList = new Dictionary<int, string>();
                if (conn.State == ConnectionState.Closed)
                {
                    conn.Open();
                }
                try
                {
                    while (sdr.Read())
                    {
                        uid = int.Parse(sdr["uid"].ToString());
                        name = sdr["name"].ToString();
                        nameList.Add(uid, name);
                    }
                }
                catch (SqlException ex)
                {
                    Response.Write("<script> var ex = " + ex.ToString() + "; alert(ex);</script>");
                }
                finally
                {
                    if (conn.State == ConnectionState.Open)
                    {
                        conn.Close();
                    }
                }
                SelectList selectNameList = new SelectList(nameList, "Key", "Value");//构造一个下拉列表的键值对
                ViewData["namelist"] = selectNameList;
                return View();
            }
            /// <summary>
            ///  构造测试数据
            /// </summary>
            /// <returns></returns>
            public SqlDataReader GetData()
            {
                conn = new SqlConnection(connStr);
                string sql = "select * from users";
                if (conn.State == ConnectionState.Closed)
                {
                    conn.Open();
                }
                try
                {
                    cmd = new SqlCommand(sql, conn);
                    sdr = cmd.ExecuteReader();
                }
                catch (SqlException ex)
                {
                    Response.Write("<script> var ex = " + ex.ToString() + "; alert(ex);</script>");
                }
                return sdr;
            }
        }
    }
    复制代码

     实体层——Model

    复制代码
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    
    namespace FirstMvc.Models
    {
        public class Member
        {
            //Fields
            private int uid_ = 0;
            private string name_ = "";
            private int jib_ = 0;
            private string email_ = "";
            private string qq_ = "";
            private DateTime rdage_;
            private DateTime ndate_;
    
    
    
            //Properties
            public int Uid_
            {
                get { return uid_; }
                set { uid_ = value; }
            }
    
            public string Name_
            {
                get { return name_; }
                set { name_ = value; }
            }
    
            public int Jib_
            {
                get { return jib_; }
                set { jib_ = value; }
            }
    
            public DateTime Rdage_
            {
                get { return rdage_; }
                set { rdage_ = value; }
            }
    
            public string Email_
            {
                get { return email_; }
                set { email_ = value; }
            }
            public string Qq_
            {
                get { return qq_; }
                set { qq_ = value; }
            }
    
            public DateTime Ndate_
            {
                get { return ndate_; }
                set { ndate_ = value; }
            }
    
            //Construcution
            public Member()
            {
    
            }
            //Function
            public Member(int uid, string name, int jib, string email, string qq, DateTime rdage, DateTime ndate)
            {
                this.uid_ = uid;
                this.jib_ = jib;
                this.email_ = email;
                this.qq_ = qq;
                this.rdage_ = rdage;
                this.ndate_ = ndate;
            }
        }
    }
    复制代码

     

    这里数据库访问使用的传统的ADO的,很多教程使用的LinqToSql的。

    MVC框架和WebFrom之间有差异,可能刚开始不是很好理解,但是它们之间确实也有很多公用的地方。

     

    这个时候,我们别忘了配置路由,在Global.asax文件中更改,

    效果

     

     

    实例下载

    http://download.csdn.net/download/sayesan/10051343
    展开全文
  • ASP.NET MVC 模式

    2018-08-05 19:54:48
    ASP.NET MVC一个全新的Web应用框架 ASP.NET 代表支撑应用框架的技术平台,表明ASP.NET MVC和传统的WebForm应用框架一样,都是建立在ASP.NET平台之上。 MVC 表示该框架背后的设计思想,意味着ASP.NET MVC采用了...

    ASP.NET MVC 是一个全新的Web应用框架

    • ASP.NET 代表支撑应用框架的技术平台,表明ASP.NET MVC和传统的WebForm应用框架一样,都是建立在ASP.NET平台之上。
    • MVC 表示该框架背后的设计思想,意味着ASP.NET MVC采用了MVC架构模式。

    MVC在20世纪70年代后期出现,产生于Xerox PARC施乐公司的帕洛阿尔托研究中心的Smalltalk项目,当时将其构想为早期GUI应用程序的一种组织方式。最初的MVC模型的某些细节依赖于Smalltalk特有的概念,如屏幕和工具等,但更广泛的概念仍然适用于现在的应用程序,特别适用于Web应用程序。

    与MVC应用程序的交互遵循着用户动作和视图更新的自然周期,在此周期中,假设视图是无状态的,这与支撑Web应用程序的HTTP请求和响应方式非常吻合。

    进一步地,MVC强制关注分离(Separation of Concerns) - 域模型与控制器逻辑与UI用户界面是松耦合关系。在一个Web应用程序中,这意味着凌乱的HTML与应用程序的其他部分是分离开来的,从而使维护与测试更加简单容易。这导致Ruby on Rails称为复兴的MVC主流,并使其称为MVC模型的实现模板。自MVC出现并显现出优势后,许多其他MVC框架也相继出现。

    从高级术语上说,MVC模式意味着一个MVC应用程序将被分离成至少3个部分。

    • 模型(Model)
      含有或表现用户进行操作的数据,模型可以是简单的视图模型(ViewModel),它们只表现视图与控制器之间传递的数据,也可以是域模型(Domain Model),它包含业务领域的数据,以及处理这些数据的操作、转换、规则。
      模型是对应用程序工作的定义,负责保持数据的整体状态和一致性。模型也由不是其职责的内容来定义:模型不涉及UI渲染或请求处理,那些是视图和控制器的职责。视图含有将模型元素显示给用户的逻辑,见此而已。它们不直接感知模型,也不以任何方式与模型直接通信。控制器是视图与模型之间的桥梁,请求来自客户端,并由控制器对其进行服务,而今选择一个相应的视图向用户进行显示,并在必要时执行模型上的相应操作。
      MVC应用程序最重要的部分是域模型,对于应用程序必须支持的业务或活动中存在的现实实体、操作、规则等,可以通过对它们进行标识的方法建立模型,这种模型被称为域(Domain)。
      为了实现ASP.NET MVC框架这一目的,域模型往往是一组C#类型(类、结构等),统称为域类型(Domain Type)。域中的操作类型中定义的方法来实现。而域规则表示成这些方法中的逻辑。或者通过运用C#的注解属性来实现。当创建一个域类型来表现特定的数据片段时,便创建了一个域对象(DomainObject)。域模型通常是持久化的,且一直处于活动状态,其实现由许多不同方式,但关系型数据库时最通常的选择。
      简言之,域模型是应用程序中有无数据及其处理的唯一和权威的定义,一个持久化的域模型也是域所表现的状态的权威定义。
      域模型方法解决了应用程序维护中出现的许多问题,如操纵模型中数据、添加新的过程或规则、域模型是应用程序必须修改的唯一地方。
    • 视图(View)
      用于将模型的某些部分渲染成用户界面
    • 控制器(Controller)
      处理传入的请求,执行模型上的操作,并选择渲染给用户的视图。

    MVC架构的每个部分都是定义良好和自包含的,这称为关注分离。模型中操作数据的逻辑仅包含在模型中,显示数据的逻辑仅包含着在视图中,处理用于请求和用户输入的代码仅包含在控制器中。利用各部分之间清晰的分离,无论应用程序有多大,在其整个生命周期中都会更易于维护和扩充。

    传统MVC模式

    对于面向最终用户的应用来说,需要具有一个与用户进行交互的可视化UI界面,又称为视图(View)。

    在早期倾向于将所有与UI相关的操作糅合在一起,这些操作包括UI界面呈现、用户交互操作的捕获与响应、业务流程的执行、对数据的存取等。这种设计模式被称为自治视图(Autonomous View,AV)。

    自治视图

    典型的人机交互应用具有3个主要的关注点:数据在可视化界面上的呈现、UI处理逻辑(用于处理用户交互式操作的逻辑)、业务逻辑。自治视图模式将三者混合在一起,势必带来问题。

    • 重用性

    业务逻辑是与UI无关的,应该最大限度地被重用。将业务逻辑定义在自治视图中,相当于将它完全与视图本身绑定在一起。若将UI的行为抽象出来,基于抽象化UI的处理逻辑也是可以被共享的,但是定义在自治视图中的UI处理逻辑也完全丧失了重用的可能。

    • 稳定性

    业务逻辑具有最强的稳定性,UI处理逻辑次之,可视化界面上的呈现最差。将不同稳定性的元素混合一体,具有最差稳定性的元素决定了整体的稳定性,这是“短板理论”在软件设中的体现。

    • 可测试性

    任何涉及UI的组件都不易测试,因为UI是呈现给人看的,并且会与人进行交互,用机器来模拟对组件实施自动化测试本身就不是一件容易的事。

    为了解决自治视图导致的问题,采用“关注点分离”(Seperation of Concerns, SoC)的原则将可视化界面呈现、UI处理逻辑、业务逻辑三者分离,并采用合理的交互方式将他们之间的依赖降到最低,即MVC。

    MVC 范例

    MVC的创建者挪威计算机专家,奥斯陆大学名誉教授 Trygve M. H. Reenskau。MVC是他在1979年访问施乐帕克研究中心(Xerox Palo Alto Research Center, Xerox PARC)期间提出的一种针对GUI应用的软件架构模式。

    MVC体现了“关注点分离”设计方针,将人机交互引用设计的功能分为Model、Controller、View三部分,各司其职。

    • Model

    Model是对应用状态和义务功能的封装,可理解为同时包含数据和行为的领域模型(Domain Model)。

    Model接受Controller的请求并完成相应的义务处理,在应用状态改变时向View发出相应的通知。

    • View

    View实现可视化界面的呈现并捕获最终用户的交互操作,View捕获到的用户交互操作后会直接转发给Controller,后者完成相应的UI逻辑。如果需要涉及业务功能的调用,Controller会直接调用Model。在完成UI处理之后,Controller会根据需要控制原View或创建新的View对用户交互操作予以响应。

    4933701-e210f2696c87558d.png
    MVC之间的交互

    传统的MVC很多人会认为Controller仅仅是View和Model之间的中介,实则不然,View和Model之间存在直接联系,View不仅可以直接调用Model查询其状态信息,当Model的状态发生改变的时候,也可以直接通知View。例如股价实时价位的应用中维护股价的信息的Model,在股价变化的情况下可直接通知相关的View改变其显示状态。

    从消息交互模式的角度来讲,无论是Model在应用状态发生改变时通知View,还是View在捕获到用户交互操作后通知Controller,消息都是以“单向(One-Way)”方式流动的,推荐采用事件机制来实现两种类型过的通知。

    从设计角度来讲,采用观察者模式(Observer)通过注册/订阅的方式来实现,具体来讲就是让View作为Model的观察者,通过注册相应的事件来检测状态的改变。让Controller作为View的观察者,通过注册相应的事件来处理用户的交互操作。

    MVC和所谓的“三层架构”两者没有什么可比性,MVC更不是分别对应UI、业务逻辑、数据存取三个层次。Trygve M. H. Reenskau提出MVC是将其作为构建整个GUI应用的架构模式,它更多地体现为一个领域模型。对于多层架构来说,MVC是被当成UI呈现层(Presentation Layer)的设计模式,Model则更多体现为访问业务层的入口(Gateway)。

    MVC 变体

    采用MVC范例将可视化UI元素的呈现、UI处理逻辑、业务逻辑分别定义在View、Controller、Model中。MVC并没有对三者之间的交互进行严格的限制,主要体现在它允许View和Model绕开Controller进行直接交互,不仅View可以通过调用Model获取需要呈现给用户的数据。Model也可以直接通知View让其感知到应用状态的变化。将MVC范例应用于具体的项目开发时,不论是基于GUI的桌面应用或是基于浏览器的Web应用,如果不多MVC之间的交互作更为严格的约束,编写的程序可能比自治视图更加难以维护。

    现在MVC被视为一种模式(Pattern),而最初的提出者却将其视为一种范例(Paradigm)。模式和范例的区别在于,模式可以直接在具体的应用上使用,范例仅仅提供基本指导方针。

    软件设计的发展历程中出现了MVC的变体(Variation),它们遵守定义在MVC中的基本原则,但对于三者之间的交互制定了更为严格的规范。

    MVP

    “模型-视图-呈现器(Model-View-Presenter, MVP)”是MVC的一种变异,以便更容易地适应状态化的GUI平台,如Windows Form或ASP.NET Web Form。

    MVP模式中,呈现器P具有与MVC控制器同样的职责,但它与状态化视图有更直接的关系,根据用户的输入和动作,直接管理着UI组件中显示的数据。

    该模式有以下两种实现:

    • 被动式视图(Passive View)实现:此种实现中,视图不包含逻辑,是UI控件的容器,由呈现器直接进行操纵。
    • 监管控制器(Supervising Controller)实现:此种实现中,视图可能要负责一些具有表现逻辑的元素,如数据绑定,并给出对域模型数据源的引用。

    这两种实现之间的差别涉及视图如何智能化,任何一种方式,呈现器与GUI框架都解耦的,这使得呈现器逻辑简单且易于单元测试。

    MVP是一种广泛使用的UI架构模式,适用于基于事件驱动的应用框架,比如ASP.NET Web Forms和Windows Forms应用。

    MVP中的M和V分别对应于MVC的Model和View,而P(Presenter)则自然代替了MVC中的Controller。MVP并非仅仅体现在从Controller到Presenter的转换,更多地体现在Model、View、Presenter之间的交互上。

    MVC范例中三元素之间混乱的交互主要体现在允许View和Model绕开Controller进行单独交流,这个问题在MVP中得到了彻底解决。

    4933701-078dcebef7cba97d.png
    MVP三者交互

    能够与Model直接进行交互的仅限于Presenter,View只能通过Presenter间接地调用Model。Model的独立性在这里得到了真正的体现,它不仅仅与可视化元素的呈现(View)无关,与UI处理逻辑(Presenter)也无关。使用MVP的应用是用户驱动而非Model驱动的,所以Model无需主动通知View以提醒状态发生了改变。

    MVP不仅避免了View和Model之间的深度耦合,更进一步降低了Presenter对View的依赖。Presenter依赖的是一个抽象化的View,即具体View实现的接口IView,这带来的最直接的好处就是使定义在Presenter中的UI处理逻辑变得更易于测试。由于Presenter对View的依赖行为定义在接口IView中,仅需Mock一个实现了该接口的View就能对Presenter进行测试。

    MVP三要素的交互主要体现在:View与Presenter、Presenter与Model之间的交互。Presenter和Model之间的交互很清晰,仅仅体现为Presenter对Model的单向调用。View和Presenter之间采用怎样的交互式整个MVP的核心。MVP针对关注点分离的初衷能否体现在具体的应用中,很大程序上取决于两者之间的交互方式是否正确。

    按照View和Presenter之间的交互方式,以及View本身的职责范围,Martin Folwer将MVP分为PV(Passive View)和SC(Supervising Controller)两种模式。

    MVVM

    “模型-视图-视图模型(MVVM, Model-View-View Model)”模式是MVC的最新变异,源于微软并被应用于WPF。在MVVM模型中,模型和视图具有与MVC同样的作用。所不同的是MVVM中关于视图模型的概念,是用户界面的一种抽象表示 -- 典型地是一个C#类,它即暴露了视图中待显示数据的模型属性,也暴露了能够通过UI进行调用的对数据的操作。与MVC的控制器不同,MVVM视图模型没有视图或任何特定UI技术的观念。MVVM视图使用WPF的绑定(Binding)特性,将视图控件所暴露的属性与视图模型所暴露的属性双向地关联在一起。

    Model2

    MVC最初作为桌面应用的架构模式并不太适合Web,Web应用于桌面应用的主要区别在于用户是通过浏览器与应用进行交互,交互请求和响应是通过HTTP请求和响应来完成的。

    为了让MVC能够为Web应用提供原生的支持,Java阵营提出了Model2的Web架构模式。JavaWeb具有两种基于MVC的架构模式,分别称之为Model1和Model2,Model1类似自治视图模式。

    为了让开发者采用相同的编程模式进行桌面应用和Web应用开发,微软通过ViewState和Postback对HTTP请求和响应机制进行了封装,能够像编写WindowsForms应用一样采用事件驱动的方式进行ASP.NET Web Forms应用的编程。Models则采用完全不同的设计,让开发者直接面向WEB,关注HTTP的请求和响应,所以Model2提供对Web引用原生的支持。

    对于Web应用来说,和用户直接交互的UI界面由浏览器来呈现,用户交互请求通过浏览器以HTTP请求的方式发送到Web服务器,服务器对请求进行相应的处理并最终返回一个HTTP回复对请求予以响应。

    Model2中一个HTTP请求的目标是Controller中某个Action,具体体现为定义在Controller类型的某个方法,所以对请求的处理最终体现在对目标Controller对象的激活和对目标Action方法的执行。一把来说,Controller的类型和Action方法的名称及作为Action方法的部分参数可直接通过请求的URL解析出来。

    4933701-f014a9879c44858c.png
    Model2的交互流程

    通过拦截器(Interceptor)对抵达Web服务器的HTTP请求进行拦截,Web应用框架都提供了这样的拦截机制。对于ASP.NET来说,通过HttpModule的形式来定义这样的拦截器。拦截器根据当前请求解析出目标Controller的类型和对应的Action方法的名称,随后目标Controller被激活,相应的Action方法被执行。

    目标Action方法被执行过程中,可调用Model获取相应的数据或改变其状态。在Action方法执行的最后阶段一般会创建一个View,后者最终被转换成HTML以HTTP响应的形式返回到客户端并呈现在浏览器中,绑定在View上的数据来源于Model或基于显示要求进行简单逻辑计算,有时将其称为VM(View Model),即基于View的Model。

    ASP.NET MVC 与 Model2

    ASP.NET MVC是根据Model2模式设计的,对HTTP请求进行拦截以实现对目标Controller和Action名称的解析式通过一个自定义HttpModule来实现的,目标Controller的激活和Action方法的执行是通过一个自定义HttpHandler来完成的。

    MVC的Model主要体现为维持应用状态并提供业务功能的领域模型,或者是多层架构中进入业务层的入口合伙业务服务的代理,但是ASP.NET MVC中的Model还是这个Model吗?ASP.NET MVC的Model仅仅是绑定到View上的数据而已,和MVC中的Model并不是一回事儿。由于ASP.NET MVC中的Model是服务于View的,可见其成为ViewModel。

    由于ASP.NET MVC只是View Model,所以ASP.NET MVC应用框架本身仅仅关注View和Controller,真正的Model以及Model和Controller直接的交互体现在如何来设计Controller。

    MVC的ASP.NET实现

    在MVC中,控制器是C#类,派生自System.Web.Mvc.Controller类。从这个Controller派生而来的类中,每个public方法都称为一个动作方法(Action Method),这种动作方法通过ASP.NET的路由系统与一个可配置的URL相关联。当一个请求被发送给一个动作方法相关联的URL时,便会执行控制器中的语句,以进行域模型上的一些操作,然后选择一个视图显示给客户端。

    4933701-d2fe6438fe0a2d58.png
    MVC应用程序中的交互

    ASP.NET MVC框架使用视图引擎(ViewEngine), 该引擎是负责处理视图的组件,以便为浏览器生成响应。MVC的早期版本使用标准的ASP.NET视图引擎,使用改进的WebForm标记语法来处理ASPX页面。

    MVC与其他模式比较

    1. 智能UI模式
      智能用户界面(Smart User Interface, Smart UI,智能UI)如Windows Form或ASP.NET Web Form。为建立智能UI应用程序,开发者需构建一个用户界面,通常是将一组组件(Component)或控件(Control)拖放到设计界面或画布上。控件通过对单击按钮、按钮、鼠标移动等发送事件的报告来与用户进行交互。开发者将代码添加到一系列事件处理程序(Event Handler)中,以便对事件作出响应。
    4933701-193bb61f147d92f8.png
    智能UI模式

    智能UI最大的缺点是难以维护和扩展,域模型与带有用户界面代码的业务逻辑混搭在一起,导致了重复。在MVC中,智能UI被认为是一种抵抗模式(Anti-pattern),是不屑一切代价应该避免的。

    2.模式-视图架构

    模型-视图(Model-View)架构提供了一种改进智能UI的方法,将事务逻辑才抽取形成能独立的域模型。数据、过程、规则被自己集中在应用程序的部件中。不过带来的问题是:UI与域模型结合得十分紧密,对每部分的单元测试都和困难,其次问题来自于实际情况而非模式的定义。模型含有大量数据访问代码,这意味着,数据模型并不仅仅只包含事务数据、操作和规则。

    4933701-8c3f78ba6d955615.png
    模型-视图架构
    1. MVC
      三级(Three-tier)或三层(Three-Layer)模式将持久化代码从域模型中分离出来,并将其放入一个叫做“数据访问层(DAL, Data Access Layer)”的新组件中。
    4933701-5756774b262d1fea.png
    MVC

    三层架构是事务性应用能程序使用最广泛的模式,对如何实现UI没有约束,并提供了较好的关注分离且又不太复杂。某些情况下DAL能够使单元测试相对容易。

    展开全文
  • 以上的实现就属于MVCMVC有三组成部分: M(Model 模型层):指可以重复执行的Java程序类,在进行远程开发设计的时候,就是将模型层的部分内容单独抽取出来(业务、数据层); V(view 视图层):进行用户界面展示...
  • 浅谈什么是MVC设计模式

    万次阅读 多人点赞 2017-02-23 23:51:51
    什么是MVC?  MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务...MVC被独特的发展起来用于映射传统的输入、处理和输出功能在一个逻辑的图形
  • 我理解的软件 架构模式MVC和分层

    千次阅读 2016-12-03 00:22:11
    缘起:作为程序员,很容易天天被业务追逐着,抽不开时间修炼...有天突然停了一下,忽地就会有种怅然的感觉,过去的那些日子我学到了什么? 有人很认真地说自己有10年经验,有人笑说你不过是一年经验用了10年而已。
  • MVC模式是iOS编程中提到的最多次的设计模式,也是使用最频繁的设计模式之。网络上有很多的MVC模式的分析文章,但都是从原理上来解释,很少能找到配套的案例来说明到底在实际的项目中要如何的使用这种模式。小编在...
  • Android MVC Demo范例参考,基本上很清晰和标准 ...这里给出一个自己写的Android MVC参考的规范: 项目结构: 布局XML(activity_main.xml): <RelativeLayout xmlns:android="h
  • 可以供想做留言板的朋友方便查找 本章通过完整的MVC+DAO范例的讲解,充分阐述了J2EE中核心设计模式的应用
  • 创建项目 ...之前小项目中一般会存在一个module下面会有若干控制器,若干自定义指令,若干自定义服务。但是在大项目中,我们这样操作会给开发以及后期维护带来诸多不便,主要是耦合度太高,全部揉在一...
  • 前言 之所以说是再战,是因为在没有学习设计模式之前已经基于MVC体系结构做过一些项目,主要是小项目,当初理解MVC有一些困难。现在已经把Gof所说的相对简单但是最常见的这些设计模式: Abstract Factory Adapter ...
  • 创建了一个示例网站,演示了如何使用建立客户博客。 您可以使用以下Heroku按钮在几秒钟内在Heroku上部署带有MySQL的自己的CakePHP版本: 您可以在观看现场演示 提供了构建和部署面向客户的应用程序所需的工具和...
  • MVC模式

    2017-03-05 16:39:00
     这样,我们让每一个层次去关注并做好一件事情,层与层之间保持松耦合,我们可以对每一个层次单独做好测试工作。如此,我们可以让代码更具可维护性。  因此,借鉴于后端的这种MVC设计思想...
  • 返回上一个页面 16   response.sendRedirect(request.getHeader( " Referer " )); 17 } 数据库(模型):   1 public class DBUtil { 2 private static String username = " ...
  • 简单聊天软件CS模式 2个目标文件 一个简单的CS模式的聊天软件,用socket实现,比较简单。 凯撒加密解密程序 1个目标文件 1、程序结构化,用函数分别实现 2、对文件的加密,解密输出到文件 利用随机函数抽取幸运数字 ...
  • 浅谈什么是MVC设计模式

    千次阅读 2018-08-20 20:25:09
    什么是MVCMVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,...MVC被独特的发展起来用于映射传统的输入、处理和输出功能在一个逻辑的图形化用户界面...
  • Java Web mvc概念及范例

    2015-10-21 16:31:27
    模型1是页面中心,适用于小应用开发,而模型2基于MVC模式,是Java Web应用的推荐框架。 模型概念:  模型1:通过链接方式进行jsp页面间的跳转,但在中型和大型应用中,这种方式会带来维护上的问题,修改一个JSP...
  • Servlet:MVC设计模式

    2018-10-21 14:28:00
    模型二:JSP+Servlet+JavaBean,MVC设计模式。 如果使用JSP+DAO的开发最大的问题有如下几点: JSP之中需要编写大量的Java代码,对于程序的美工维护不利。 代码的安全性不高,因为所有的业务的核心逻辑都暴露在外面了...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 5,145
精华内容 2,058
关键字:

一个简单的mvc模式范例