精华内容
下载资源
问答
  • MVC+三层架构模型是这样的 首先把数据,数据处理,客户端显示分离,这就是三层架构。 MVC负责把客户端分离,再分成三个部分分别是,针对数据处理的接口,连接数据处理和页面显示的出口入口控制,以及用户界面三个...
    MVC+三层架构模型是这样的
    首先把数据,数据处理,客户端显示分离,这就是三层架构。
    MVC负责把客户端分离,再分成三个部分分别是,针对数据处理的接口,连接数据处理和页面显示的出口入口控制,以及用户界面三个部分。这样做的最大的好处就是大型网站开发中,无论未来网站庞大到何种程度,都可以无限的扩展。举个例子说吧,三层架构,把网站页面开发和数据库以及数据处理开发分离,让不同的人可以同时工作,最后把各个部件组装起来就行了,将来要更换部件就像,组装汽车,组装电脑那样简单。
    我这些日子也愁这个问题。分享一下心得吧:
    三层架构就像是一个苹果,外层果皮ui,中间果肉bll,里面果核dal。一层一层的剥离,才能看到里面。也像是糖葫芦,吃掉最顶端的你才可以吃到第二个球。当然如果你是虫子,你可以钻到里面从果核开始吃。
    然后MVC就像是一个三个相互用线链接一起的球,三个球你都可以当作顶端。mvc 只是用来做三层架构的ui层。
    根据我以往经验来说,没有什么架构是可以解决技术进步的问题的。不论你用什么都无法避免的当遇到新的技术,就要替换掉旧的技术的。
    相对来说三层架构和MVC都是最新的架构技术,分别解决的问题不同,三层架构的层次更高,而mvc是三层中第三层ui层的细化。三层架构和mvc都不利于开发,一个简单的程序要这么分累死了,不过是利于二次开发,甚至多次开发。适合于很多人合作的情况下。当然,如果你只是独立开发,去他什么的架构,只要面向对象就足够了。
    mvc最让人心动的就是将网址和文件的对应关系分离了。这对于网站安全来说是一大进步。三层架构最大的好处是,将外皮和数据分离了。
    做大型网站来说,这么做是对的,三层架构和mvc同时上场才会最大程度的利于开发,但是对于中小网站,完全没必要分得太清楚。
                                             
    展开全文
  • MVC你是怎样理解的?

    2014-09-30 20:07:00
    近期的学术交流会议都在研究MVC,秉着好好学习,天天向上的心理,时不时的就去蹭会。说实话,原来也有看过MVC的一些相关资料,可是仅仅是浅尝辄止。并且,由于先学了三层,所以再看MVC的时候,潜意识里的就觉得它们...

     近期的学术交流会议都在研究MVC,秉着好好学习,天天向上的心理,时不时的就去蹭会。说实话,原来也有看过MVC的一些相关资料,可是仅仅是浅尝辄止。并且,由于先学了三层,所以再看MVC的时候,潜意识里的就觉得它们是一个东西。可是MVC是MVC,三层是三层。以下就将昨晚学术交流会议讨论的结果以及讨论方式展现给大家。 如有不足之处,还望批评指正!


    三层划分为U(界面层)、B(业务逻辑层)、D(数据訪问层),这是我们最先接触过的分层思想。在学了三层之后,我们又接触到了MVC ,这时候我们自然而然的会拿MVC与三层来做比較。可是比較之后,出现了以下的两种结果,下图所看到的:


         

    错误观点一:

             有部分人直接把三层的U层等同于MVC的View + Controller。 BLL层 + DAL层 等同于 Model。 


    正确观点一:

             BLL层中包括两部分:一是IBLL,即抽象出来接口部分,定义了要做什么?二是BLL,即详细实现部分,定义怎么做?而Controller是控制器的意思,它负责的是转发到哪个视图和指挥要干什么(业务)?详细怎么干不用它管。所以实际上Controller = U的一部分 + IBLL。Model =【BLL(实现部分 )+ DAL】—> 容器:对象和操作。View仅仅负责展示数据结果。 


    错误观点二:

             业务划分上是正确的,错在MVC的调用关系与三层一样。      

    三层调用关系:

    1.U、B、D层自上而下依赖, 下层为上层服务;

              2.U、B、D平等关系,U层不能越级跳转到D层。 


    正确观点二:



    在MVC体系中提高了Controller(控制器)的地位。C是View与Model之间相互通信的中枢纽带。假设没有Controller的允许,View与Model是不可能进行通信的。换句话说,仅仅要Controller允许,View能够将数据给Model,Model发生了改变,也能通知给View。Controller掌握View节点间的变化和Model层中对象的操作。

     

    相应我们的java web 里面,C 相当于是Servlet、Model相当于java Bean、 View 相当于是Jsp。浏览器直接发送请求到Servlet,Servlet接受到数据转到Model层去处理,最后Servlet将保存的结果转发到JSP页面,再由JSP页面将数据展示出来。由此可见,Servlet能够相应多个JSP页面。 


    综上所诉:

           MVC在结构上发生了彻底的改变,并不同于三层。这样的变化在一定程度上带来了非常大的优点。 

    1. 效率提高了,三层是严格的调用关系,传输或是读取数据的时候,须要经过层层调用,才干获取到数据。效率大大减少了。 而View和Model能够进行通信,传输速度加快。 
    2. 解耦合,在Controller的统一管理下,用户和数据操作全然隔离。 
    3. 灵活性大大提高,Controller能够管理多个View ,这样当View发生改变时,能够任意的更换。 


    总结: 

             对事物的认识是一个一步一步加深的过程。每一步加深也许会让我们推翻自己,可是这并不代表前面我们就是错的。这一次认识的加深一定是建立在被我们推翻的观点之上。 所以,认识没有对错之分,仅仅是说在什么样的条件下,就会有什么样的认识。 


    转载于:https://www.cnblogs.com/gcczhongduan/p/4002631.html

    展开全文
  • mvc在底层又是怎样实现的呢?为什么它是如此智能呢? 原理: 当我们在浏览器中输入url点击回车键发送请求mvc页面时,请求的url会发送到服务器的iis上,然后提交给mvc.net处理机制来处理用户的请求,在...

         今天实现了在mvc平台下自定义插件,虽然功能比较简单,但是通过对反射的运用,更加明白了为什么我们在浏览器上输入友好的url时,mvc会智能的帮我们找到我们想要查找的页面呢?mvc在底层又是怎样实现的呢?为什么它是如此智能呢?

    原理:

      当我们在浏览器中输入url点击回车键发送请求mvc页面时,请求的url会发送到服务器的iis上,然后提交给mvc.net处理机制来处理用户的请求,在mvc.net处理机制中,会执行HttpRuntime对象的ProcessRequest方法执行两个操作:创建httpContext上下文对象和通过HttpApplicationFactory工厂创建一个HttpApplication对象;

    1. httpContext上下文对象:在创建httpcontext上下文的同时,创建了HttpRequestHttpResponseSessionRemapHandlerServer五大属性,其中的用户请求的请求报文信息存放在httpcontext上下文中的httpRequest属性中,
    2. httpApplication对象:创建httpApplication对象后,httpApplication对象会执行自己的ProcessRequest方法跑19个管道事件,在开始管道事件时,会注册路由、过滤器、webApi和自定义等信息(详细请看mvc根目录中的Global.asax文件),因为Global.asax文件在一运行时就执行,那么我们可以进行面向切面编程(AOP,然后注册到Global.asax文件中。当跑到第七个管道事件时,mvc.net机制会扫描路由集合RouteCollection中的所有路由规则和当前上下文中的Request中的url路径比较,发现存在相同控制器则创建一个mvcHandler对象存入到httpcontext上下文中的RemapHandler中。在第八个事件会判断当前httpcontext中的remapHandler是否为null,如果不为null则说明在第七个管道事件中创建mvcHandler对象成功。如果为null,则表示当前是aspx页面请求,在第1112个管道事件间调用请求url中的action方法,执行action方法中的逻辑操作,然后通过return view转到Razor视图引擎,最终在底层通过Excute方法将前台页面类中的字符串转为html保存到HttpContext上下文中的HttpResponse属性中返回给浏览器

     

     

     

    底层实现:两个mvc项目(Mvc.Plugin和MVC.Site)和一个类库(MVC.Plugs.Framework)

     

    1. Mvc.Plugin:在controllers文件夹中新建一个order控制器,代码如下:
       1   public string Index()//主要是在下面重写控制器验证使用
       2         {
       3             return "不知道怎么选择";
       4         }
       5   //添加一个视图
       6         public ActionResult List()//主要在下面重写Razor视图引擎验证使用
       7         {
       8             return View();
       9             }
      10 要点:将该项目bin目录中的Mvc.Plugin.dll复制到MVC.Site项目文件夹中的Plugin文件夹下的Order文件中,同时也要将该项目中的Views文件夹复制到Plugin文件夹下的Order文件中
    2. 在类库程序MVC.Plugs.Framework中添加两个类PluginControllerFactory.cs(重写控制器)和PluginViewsEngine.cs(重写视图), PluginControllerFactory.cs代码如下(通过反射实现):
       1    using System.Web.Mvc;
       2        using System.Reflection;
       3        public class PluginControllerFactory:DefaultControllerFactory
       4        {
      //重写DefaultControllersFactory工厂中的GetControllerType方法
      5     protected override Type GetControllerType(System.Web.Routing.RequestContext requestContext, string controllerName) 6     { 7     //返回值是一个Type类型的,所以先定义一个空的返回类型 8     Type controllerType = null; 9     10     //1.0获取当前运行网站的根目录 11     string phyPath=AppDomain.CurrentDomain.BaseDirectory; 12     13     //2.0获取当前运行网站中的插件目录 14     string pluginPhyPath = phyPath + "Plugin"; 15     16     //3.0根据请求的controller拼接为完整的带后缀controller控制器名,如homeController 17     string fullName = controllerName + "Controller"; 18     19     //4.0根据插件的物理路径获取插件文件夹中所有带有.dll后缀的程序集 20     string[] dllFiles = System.IO.Directory.GetFiles(pluginPhyPath, "*.dll", System.IO.SearchOption.AllDirectories); 21     22     //5.0判断获取到的程序集是否为空 23     if (dllFiles != null && dllFiles.Length > 0) 24     { 25     //遍历所有的插件程序集 26     foreach (string item in dllFiles) 27     { 28     //把插件文件夹中的所有插件程序集加入到Assembly中 29     Assembly ass = Assembly.LoadFile(item); 30     //然后通过ass的GetType方法检查是否存在Mvc.Plugn.dll,最后赋值给controllerType 31     controllerType = ass.GetType("Mvc.Plugin.Controllers." + fullName); 32     //判断是否存在该插件程序集 33     if (controllerType != null) 34     { 35     //不为空,那么就直接跳出循环,然后controllerType就有值了 36     break; 37     } 38     } 39     } 40     //6.0再判断controllerType是否为空,如果不为空,那么调用父类的GetControllerType方法 41     if (controllerType != null) 42     { 43     return controllerType; 44     } 45     else 46     { 47     return base.GetControllerType(requestContext, controllerName); 48     } 49 }

      3.PluginViewsEngine.cs代码如下:

    3.  1    using System.Web.Mvc;
       2        using System.Web.WebPages.Razor;
       3        using System.Reflection;
       4       public class PluginViewsEngine:RazorViewEngine
       5        {
       6            //1.0定义自己希望razor视图引擎查询的目录
       7           public string[] ViewLocationFormats = {
       8                                                         "~/Plugin/Order/Views/{1}/{0}.cshtml",
       9                                                         "~/Plugin/Order/Views/Shared/{1}/{0}.cshtml",
      10                                                         "~/Views/{1}/{0}.cshtml",
      11                                                         "~/Views/Shared/{1}/{0}.cshtml"
      12                                                            };                                                    
      13    
      14           //2.0重写Razor视图中的FindView方法,查询自己定义的视图目录
      15           public override ViewEngineResult FindView(ControllerContext controllerContext, string viewName, string masterName, bool useCache)
      16           {
      17              //3.0将自定义的视图覆盖mvc自带的搜索视图
      18               base.ViewLocationFormats = this.ViewLocationFormats;
      19    
      20               //4.0重写视图引擎,将视图引擎编译成前台页面类的方法
      21               RazorBuildProvider.CodeGenerationStarted += RazorBuildProvider_CodeGenerationStarted;        
      22    
      23               return base.FindView(controllerContext, viewName, masterName, useCache);
      24           }
      25    
      26          //5.0重写视图引擎开始的方法
      27           void RazorBuildProvider_CodeGenerationStarted(object sender, EventArgs e)
      28           {
      29               //将sender强转为RazorBuildProvider
      30               RazorBuildProvider provider=sender as RazorBuildProvider;
      31               //获取当前网站的运行目录
      32               string phyPath = AppDomain.CurrentDomain.BaseDirectory;
      33               //获取当前网站下插件Plugin的物理路径
      34               string pluginPhyPath = phyPath + "Plugin";
      35               //获取插件文件夹中所有带有.dll的程序集
      36              string[] dllPhyPath=System.IO.Directory.GetFiles(pluginPhyPath, "*.dll", System.IO.SearchOption.AllDirectories);
      37               //因为只有一个插件dll,所以可以直接获取
      38              string mvcPlugdllPath = dllPhyPath[0];
      39               //直接加载进程序集中
      40              Assembly ass = Assembly.LoadFile(mvcPlugdllPath);
      41              //6.0将ass添加为视图前台页面类的引用程序集
      42              provider.AssemblyBuilder.AddAssemblyReference(ass);
      43        }
    4. 在MVC.Site主网站中的Global.asax文件中注入重写的控制器和自定义的视图即可,源码如下:
       1    // 注意: 有关启用 IIS6 或 IIS7 经典模式的说明,
       2        // 请访问 http://go.microsoft.com/?LinkId=9394801
       3        using MVC.Plugs.Framework;
       4        public class MvcApplication : System.Web.HttpApplication
       5        {
       6            protected void Application_Start()
       7            {
       8                AreaRegistration.RegisterAllAreas();
       9    
      10                WebApiConfig.Register(GlobalConfiguration.Configuration);
      11                FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
      12                RouteConfig.RegisterRoutes(RouteTable.Routes);
      13                BundleConfig.RegisterBundles(BundleTable.Bundles);
      14    
      15                //将创建控制器的任务由父类工厂转交给重写的工厂
      16                ControllerBuilder.Current.SetControllerFactory(new PluginControllerFactory());
      17    
      18                //将mvc默认的视图查找删除
      19                ViewEngines.Engines.Clear();
      20                //注册自己写的视图查询方案
      21                ViewEngines.Engines.Add(new PluginViewsEngine());
      22            }
      23   }

       

      新手上路,很多东西都不懂简化,只能累赘地写出来,通过该实例明白了mvc在底层是怎样智能识别浏览器的url请求(通过反射去读取根目录下的所有dll,然后遍历查出请求的controller)和如何去遍历Razor视图(通过findView方法去遍历视图集合),不喜勿喷。。。。。

     

    转载于:https://www.cnblogs.com/jean69/p/3644186.html

    展开全文
  • MVC模式 重新理解

    2014-12-02 20:10:53
    以前一直无法舒坦的理解MVC模式是怎样实际应用到一个程序上的。 这两天因为工作google出一幅图,然后恍然大悟。 图1.   问题就出在以前所看过的文章上根本没有提过browser这层。导致我无法正确理解view的责任...
    from 

    以前一直无法舒坦的理解,MVC模式是怎样实际应用到一个程序上的。

    这两天因为工作google出一幅图,然后恍然大悟。

    1.

     

    问题就出在以前所看过的文章上根本没有提过browser这层。导致我无法正确理解view的责任、controller的责任,以及两者明明是分层的,为什么却是循环依赖。

     

    我将browser介入其中,重新思考MVC模式究竟如何部署到程序结构上。

    2.

     

    计算机前的用户,只会和browser打交道,也就是整个应用程序的界面部署,各种窗口,包括菜单、按钮、子对话框等等。

    我把整个界面部署的代码,全部放置到browser模块下。此时无需modelviewcontroller,仅有browser的代码,我们就可以给用户显示这个界面。

     

    接下来我引入model模块,这个模块的代码和窗口无关、和控件无关、和HWND无关。就是一个后台运行的东西,不需要面向任何用户。

    model包含了业务的本质数据结构和逻辑流程。

     

    然后我引入view模块,view模块代码的责任就是,如何利用browser显示model的内容

    这个责任有两个潜在意义:

    1.       browser模块的代码不会去访问model模块的内容,并显示在browser相应的窗口上。

    2.       在没有controller的情况下——用户不能操作程序界面上的任何菜单、按钮,只能看不能摸,view模块能够在browser上给用户显示model的内容。

    因此,view模块在MVC模式中所能做的就是:

    1.       访问model模块,获取内容。

    2.       访问browser模块,修改窗口。

     

    最后引入controller模块。

    用户在计算机前看着browser,浏览业务数据,他肯定会做一些操作,比如按下按钮,选个菜单或者其他什么的。

    用户修改model模块的每一个决定性操作,就映射在controller模块的一个接口上。controller模块的责任是,代表用户的每一个动作,并分解为多个view做什么,model做什么的调用。这个动作必须有操作model或者view的代码,不然这个动作放在browser模块下就可以了。

     

    现在合起来分析个例子,用户通过browsermodel添加一个任务。

    按下确定按钮后,browser读取其他子窗口的输入数据,当做参数传递给controller模块对应的调用。

    l  controller模块不会主动的从browser中的控件中读取数据。如果用户的动作足够简单,controller有可能就仅仅作为一个中间层调用model模块。

     

    controller模块将用户的动作分解为一些更细致的调用:

    1.       让model添加新任务。(不关心model怎么做)

    2.       从model中获取新任务的信息。

    3.       将新任务的信息传递给view,让他在browser显示出来。(不关心view怎么做)

     

    controller的动作分解中可以看出:

    l  和之前view直接访问model获取数据不一样,这里controllermodel获取数据,并交给view。仅由controller访问model是有好处的,使得viewmodel没有了耦合。

    l  这里有一个微妙的循环依赖关系,browser依赖于controllercontroller依赖于viewview又依赖于browser

    l  解开这一依赖的方法1,提取一个view interface,让controller依赖于他,而不是依赖于view。提取controller interface也是同理。

    l  方法2controller不依赖于view,让view自己负责根据model的状态改变显示,即controller负责修改modelview负责读取model

    l  不过,viewmodel之间通过controller传递数据是有好处的,除了耦合之外,另一个关键的地方是,可以在controller中过滤数据,而不用修改model

    l  这两个方法没有最好,只有根据具体的情况选择最合适的做法。在程序足够小的情况下,其实是不需要把模块划分得那么清楚的。

     

    O(_)O

    展开全文
  • 最近想学习php的mvc结构,在网上...我对mvc理解是:c负责分配任务,协调m和v。用户发出请求时,c把请求分配给模型m,模型从数据库处理查询或者其他的一些数据操作,然后把数据返回给c,c再把数据传递给相应的v,再...
  • 这是微软MVC大会第二期的一个视频,本没有绝对链接,可从http://www.mvcconf.com/videos入口(这时候会播放第一个视频),按F3搜Performance,找到链接后点击,开始播放这个视频……虽然是英文的,但中间大部分时间...
  • 这是微软MVC大会第二期的一个视频,本没有绝对链接,可从http://www.mvcconf.com/videos入口(这时候会播放第一个视频),按F3搜Performance,找到链接后点击,开始播放这个视频……虽然是英文的,但中间大部分时间...
  • 前端mvc

    千次阅读 2018-05-21 20:29:12
    讲了些前端mvc的知识前端MVC变形记http://web.jobbole.com/84100/怎样深入了解和学习前端 MVC 架构?https://www.zhihu.com/question/20135390我对前端MVC理解https://www.cnblogs.com/macliu/p/5238734.html也许...
  • spring-mvc.xml 和 application-context.xml的配置与深入理解

    万次阅读 多人点赞 2018-09-06 16:31:21
    在java框架这个话题,前几篇文章是基于搭建ssm项目框架,以及web.xml的配置讲解,本篇主要就ssm框架的其他配置文件进行...回顾一下application-context.xml和spring-mvc.xml在web.xml中的配置是怎样的。 目录  (...
  • 阅读本教程后,你应当能够理解ASP.NET MVC应用程序的不同部分是怎样一同工作的。同时,你也能明白ASP.NET MVC应用程序架构与ASP.NET Web Forms应用程序或Active Server Pages应用程序是不同的。 ...
  • 怎样理解一个新项目?

    千次阅读 2016-12-16 10:03:43
    1,明确使用了什么框架?...Spring MVC和Struts2的区别 http://blog.csdn.net/fireofjava/article/details/45273615 2,我们一般都是一个web项目,部署在tomcat上 Tomcat 配置详解/优化方案 http://www.jia
  • MVC中的过滤器分四种分别为:IActionFilter(动作过滤器), IAuthorizationFilter(授权过滤器), IExceptionFilter(异常过滤器), IResultFilter(结果过滤器)字面翻译,凑合理解吧。 在此就那IActionFilter举例...
  • 设计页面的URL和设计页面中的文字、图片同样重要,最终网站用户很容易会注意到浏览器的地址栏,一个好的URL容易被用户记住和理解。 下面列出怎样设计一个友好的URL: 1、尽量使URL简洁、清晰易懂 首先我们要...
  • 怎样理解@ComponentScan注解

    万次阅读 2016-09-25 22:27:05
    在Spring mvc当中经常可以看到@ComponentScan这个注解, 那么怎么样去理解它呢? 配置视图控制器 package com.apress.prospringmvc.bookstore.web.config; import org.springframework.web.servlet.config....
  • 在你读完本教程后,你将理解控制器是怎样被用来控制访问者与ASP.NET MVC站点交互的方法的。 理解控制器 MVC控制器负责回应对ASP.NET MVC站点的请求。每个浏览器请求都被映射至一个特定的控制器。例如,设想你键入...

空空如也

空空如也

1 2 3 4 5 ... 10
收藏数 198
精华内容 79
关键字:

怎样理解mvc