百度
360搜索
搜狗搜索

mvc框架的执行流程,MVC工作流程是什么?详细介绍

th td { text align: center; } 本文目录一览: 如何利用Node.js实现MVC框架的简单实例分析

下面小编就为大家带来一篇使用Node.js实现简易MVC框架的方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧在使用Node.js搭建静态资源服务器一文中我们完成了服务器对静态资源请求的处理,但并未涉及动态请求,目前还无法根据客户端发出的不同请求而返回个性化的内容。单靠静态资源岂能撑得起这些复杂的网站应用,本文将介绍如何使用Node处理动态请求,以及如何搭建一个简易的 MVC 框架。因为前文已经详细介绍过静态资源请求如何响应,本文将略过所有静态部分。一个简单的示例先从一个简单示例入手,明白在 Node 中如何向客户端返回动态内容。假设我们有这样的需求:当用户访问/actors时返回男演员列表页当用户访问/actresses时返回女演员列表可以用以下的代码完成功能:const http = require('http');const url = require('url');http.createServer((req, res) => { const pathName = url.parse(req.url).pathname; if (['/actors', '/actresses'].includes(pathName)) { res.writeHead(200, { 'Content-Type': 'text/html' }); const actors = ['Leonardo DiCaprio', 'Brad Pitt', 'Johnny Depp']; const actresses = ['Jennifer Aniston', 'Scarlett Johansson', 'Kate Winslet']; let lists = []; if (pathName === '/actors') { lists = actors; } else { lists = actresses; } const content = lists.reduce((template, item, index) => { return template + `

No.${index+1} ${item}

`; }, `

${pathName.slice(1)}

`); res.end(content); } else { res.writeHead(404); res.end('

Requested page not found.

') }}).listen(9527);上面代码的核心是路由匹配,当请求抵达时,检查是否有对应其路径的逻辑处理,当请求匹配不上任何路由时,返回 404。匹配成功时处理相应的逻辑。上面的代码显然并不通用,而且在仅有两种路由匹配候选项(且还未区分请求方法),以及尚未使用数据库以及模板文件的前提下,代码都已经有些纠结了。因此接下来我们将搭建一个简易的MVC框架,使数据、模型、表现分离开来,各司其职。搭建简易MVC框架MVC 分别指的是:M: Model (数据)V: View (表现)C: Controller (逻辑)在 Node 中,MVC 架构下处理请求的过程如下:请求抵达服务端服务端将请求交由路由处理路由通过路径匹配,将请求导向对应的 controllercontroller 收到请求,向 model 索要数据model 给 controller 返回其所需数据controller 可能需要对收到的数据做一些再加工controller 将处理好的数据交给 viewview 根据数据和模板生成响应内容服务端将此内容返回客户端以此为依据,我们需要准备以下模块:server: 监听和响应请求router: 将请求交由正确的controller处理controllers: 执行业务逻辑,从 model 中取出数据,传递给 viewmodel: 提供数据view: 提供 html创建如下目录:-- server.js-- lib -- router.js-- views-- controllers-- modelsserver创建 server.js 文件:const http = require('http');const router = require('./lib/router')();router.get('/actors', (req, res) => { res.end('Leonardo DiCaprio, Brad Pitt, Johnny Depp');});http.createServer(router).listen(9527, err => { if (err) { console.error(err); console.info('Failed to start server'); } else { console.info(`Server started`); }});先不管这个文件里的细节,router是下面将要完成的模块,这里先引入,请求抵达后即交由它处理。router 模块router模块其实只需完成一件事,将请求导向正确的controller处理,理想中它可以这样使用:const router = require('./lib/router')();const actorsController = require('./controllers/actors');router.use((req, res, next) => { console.info('New request arrived'); next()});router.get('/actors', (req, res) => { actorsController.fetchList();});router.post('/actors/:name', (req, res) => { actorsController.createNewActor();});总的来说,我们希望它同时支持路由中间件和非中间件,请求抵达后会由 router 交给匹配上的中间件们处理。中间件是一个可访问请求对象和响应对象的函数,在中间件内可以做的事情包括:执行任何代码,比如添加日志和处理错误等修改请求 (req) 和响应对象 (res),比如从 req.url 获取查询参数并赋值到 req.query结束响应调用下一个中间件 (next)Note:需要注意的是,如果在某个中间件内既没有终结响应,也没有调用 next 方法将控制权交给下一个中间件, 则请求就会挂起__非路由中间件__通过以下方式添加,匹配所有请求:router.use(fn);比如上面的例子:router.use((req, res, next) => { console.info('New request arrived'); next()});__路由中间件__通过以下方式添加,以 请求方法和路径精确匹配:router.HTTP_METHOD(path, fn)梳理好了之后先写出框架:/lib/router.jsconst METHODS = ['GET', 'POST', 'PUT', 'DELETE', 'HEAD', 'OPTIONS'];module.exports = () => { const routes = []; const router = (req, res) => { }; router.use = (fn) => { routes.push({ method: null, path: null, handler: fn }); }; METHODS.forEach(item => { const method = item.toLowerCase(); router[method] = (path, fn) => { routes.push({ method, path, handler: fn }); }; });};以上主要是给 router 添加了 use、get、post 等方法,每当调用这些方法时,给 routes 添加一条 route 规则。Note:Javascript 中函数是一种特殊的对象,能被调用的同时,还可以拥有属性、方法。接下来的重点在 router 函数,它需要做的是:从req对象中取得 method、pathname依据 method、pathname 将请求与routes数组内各个 route 按它们被添加的顺序依次匹配如果与某个route匹配成功,执行 route.handler,执行完后与下一个 route 匹配或结束流程 (后面详述)如果匹配不成功,继续与下一个 route 匹配,重复3、4步骤 const router = (req, res) => { const pathname = decodeURI(url.parse(req.url).pathname); const method = req.method.toLowerCase(); let i = 0; const next = () => { route = routes[i++]; if (!route) return; const routeForAllRequest = !route.method && !route.path; if (routeForAllRequest || (route.method === method && pathname === route.path)) { route.handler(req, res, next); } else { next(); } } next(); };对于非路由中间件,直接调用其 handler。对于路由中间件,只有请求方法和路径都匹配成功时,才调用其 handler。当没有匹配上的 route 时,直接与下一个route继续匹配。需要注意的是,在某条 route 匹配成功的情况下,执行完其 handler 之后,还会不会再接着与下个 route 匹配,就要看开发者在其 handler 内有没有主动调用 next() 交出控制权了。在__server.js__中添加一些route:router.use((req, res, next) => { console.info('New request arrived'); next()});router.get('/actors', (req, res) => { res.end('Leonardo DiCaprio, Brad Pitt, Johnny Depp');});router.get('/actresses', (req, res) => { res.end('Jennifer Aniston, Scarlett Johansson, Kate Winslet');});router.use((req, res, next) => { res.statusCode = 404; res.end();});每个请求抵达时,首先打印出一条 log,接着匹配其他route。当匹配上 actors 或 actresses 的 get 请求时,直接发回演员名字,并不需要继续匹配其他 route。如果都没匹配上,返回 404。在浏览器中依次访问 http://localhost:9527/erwe、http://localhost:9527/actors、http://localhost:9527/actresses 测试一下:network 中观察到的结果符合预期,同时后台命令行中也打印出了三条 New request arrived语句。接下来继续改进 router 模块。首先添加一个 router.all 方法,调用它即意味着为所有请求方法都添加了一条 route:router.all = (path, fn) => { METHODS.forEach(item => { const method = item.toLowerCase(); router[method](path, fn); }) };接着,添加错误处理。/lib/router.jsconst defaultErrorHander = (err, req, res) => { res.statusCode = 500; res.end();};module.exports = (errorHander) => { const routes = []; const router = (req, res) => { ... errorHander = errorHander || defaultErrorHander; const next = (err) => { if (err) return errorHander(err, req, res); ... } next(); };server.js...const router = require('./lib/router')((err, req, res) => { console.error(err); res.statusCode = 500; res.end(err.stack);});...默认情况下,遇到错误时会返回 500,但开发者使用 router 模块时可以传入自己的错误处理函数将其替代。修改一下代码,测试是否能正确执行错误处理:router.use((req, res, next) => { console.info('New request arrived'); next(new Error('an error'));});这样任何请求都应该返回 500:继续,修改 route.path 与 pathname 的匹配规则。现在我们认为只有当两字符串相等时才让匹配通过,这没有考虑到 url 中包含路径参数的情况,比如:localhost:9527/actors/Leonardo与router.get('/actors/:name', someRouteHandler);这条route应该匹配成功才是。新增一个函数用来将字符串类型的 route.path 转换成正则对象,并存入 route.pattern:const getRoutePattern = pathname => { pathname = '^' + pathname.replace(/(\:\w+)/g, '\(\[a-zA-Z0-9-\]\+\\s\)') + '$'; return new RegExp(pathname);};这样就可以匹配上带有路径参数的url了,并将这些路径参数存入 req.params 对象: const matchedResults = pathname.match(route.pattern); if (route.method === method && matchedResults) { addParamsToRequest(req, route.path, matchedResults); route.handler(req, res, next); } else { next(); }const addParamsToRequest = (req, routePath, matchedResults) => { req.params = {}; let urlParameterNames = routePath.match(/:(\w+)/g); if (urlParameterNames) { for (let i=0; i < urlParameterNames.length; i++) { req.params[urlParameterNames[i].slice(1)] = matchedResults[i + 1]; } }}添加个 route 测试一下:router.get('/actors/:year/:country', (req, res) => { res.end(`year: ${req.params.year} country: ${req.params.country}`);});访问http://localhost:9527/actors/1990/China试试:router 模块就写到此,至于查询参数的格式化以及获取请求主体,比较琐碎就不试验了,需要可以直接使用 bordy-parser 等模块。现在我们已经创建好了router模块,接下来将 route handler 内的业务逻辑都转移到 controller 中去。修改__server.js__,引入 controller:...const actorsController = require('./controllers/actors');...router.get('/actors', (req, res) => { actorsController.getList(req, res);});router.get('/actors/:name', (req, res) => { actorsController.getActorByName(req, res);});router.get('/actors/:year/:country', (req, res) => { actorsController.getActorsByYearAndCountry(req, res);});...新建__controllers/actors.js__:const actorsTemplate = require('../views/actors-list');const actorsModel = require('../models/actors');exports.getList = (req, res) => { const data = actorsModel.getList(); const htmlStr = actorsTemplate.build(data); res.writeHead(200, { 'Content-Type': 'text/html' }); res.end(htmlStr);};exports.getActorByName = (req, res) => { const data = actorsModel.getActorByName(req.params.name); const htmlStr = actorsTemplate.build(data); res.writeHead(200, { 'Content-Type': 'text/html' }); res.end(htmlStr);};exports.getActorsByYearAndCountry = (req, res) => { const data = actorsModel.getActorsByYearAndCountry(req.params.year, req.params.country)
Spring mvc执行流程图-1

阅读更多 >>>  java常用的框架(java常用的框架有哪些)

1.1 Spring mvc的执行流程图

Spring mvc的执行流程大致如下: 1)所有请求被DispatcherServlet控制器拦截。 2)被拦截的请求去handlerMappings中寻找对应的HandlerMapping对象并得到请求对应的Handler对象。 3)把获取到的Handler对象以及根据请求查找跟请求对应的拦截器作为入参,封装成一个HandlerExectionChain对象,返回到DispatcherServlet控制器。 4)把HandlerExecutionChain对象作为入参,去handlerAdapters集合中寻找对应的HandlerAdapter对象。 5)把HandlerExectionChain对象作为入参调用HandlerAdapter对象的handle方法,执行完毕将返回ModelAndView对象到DispatcherServlet控制器中。 6)从viewResolvers集合中查找对应的View对象,并返回给到DispatcherServlet控制器。 7)View视图渲染成具体的文件格式并返回给客户端。
View视图渲染
render具体源码
View的类型如下图(ctrl+h可查看类的所有子类)

详解ASP.NET MVC应用程序请求生命周期

  当一个ASP NET MVC应用程序提出请求 为了响应请求 包含一些请求执行流程步骤! 在ASP NET MVC应用程序Http request
  和Http response 过程中 主要包含 个步骤:
   )RouteTable(路由表)的创建
   )UrlRoutingModule 请求拦截
   )Routing engine 确定route

   )route handler 创建相关的IHttpHandler实例
   )IHttpHandler实例确定Controller(控制器)
   )Controller执行
   )一个视图引擎创建
   ) 视图呈现
  主要流程图如下:
   )RouteTable的创建
  RouteTable的创建发生在mvc应用程序的启动 或者web应用程序池的重启!通常的程序 一个页面请求对应磁盘上的一个页面!如(x
  对应到服务器磁盘上的文件index aspx)index aspx实际上是一个类 由IHttpHandler创建实例化
  IHttpHandler包含一个
  ProcessRequest方法 负责响应页面输出!
  但是mvc application 是不同的 每一个请求映射到route route 定义在route table 在应用程序启动时创建!
  RouteTable的在应用程序的具体使用如下 public class MvcApplication : System Web HttpApplication { public static void RegisterRoutes(RouteCollection routes) { routes IgnoreRoute( {resource} axd/{*pathInfo} ); routes MapRoute( Default // Route name {controller}/{action}/{id} // URL with parameters new { controller = Home action = Index id = } // Parameter defaults ); routes MapRoute( Account // Route name {controller}/{action}/{id} // URL with parameters new { controller = Account action = LogOn id = } // Parameter defaults ); } protected void Application_Start() { RegisterRoutes(RouteTable Routes); } } )UrlRoutingModule 请求拦截
  每一个Http 请求 都被UrlRoutingModule拦截 UrlRoutingModule提供了当前的HttpContext的
  routingengine(路由引擎) HttpContext实例包含当前请求的所有数据 UrlRoutingModule控制着routing engine
  提供了HttpContext数据到routing engine! UrlRoutingModule实现了IHttpModule接口 在nfig 文件进行
  了注册!
  UrlRoutingModule 具体的数据结构如下
  public class UrlRoutingModule : IHttpModule { // 主要的 Methods protected virtual void Init(HttpApplication application); private void OnApplicationPostMapRequestHandler(object sender EventArgs e); private void OnApplicationPostResolveRequestCache(object sender EventArgs e); public virtual void PostMapRequestHandler(HttpContextBase context); public virtual void PostResolveRequestCache(HttpContextBase context); void IHttpModule Init(HttpApplication application); // Properties public RouteCollection RouteCollection { get; set; } } UrlRoutingModule 在WebConfig的注册

<add name="UrlRoutingModule" type="System" web routing urlroutingmodule
  System Web Routing Version= Culture=neutral PublicKeyToken= BF AD E />

   )Routing engine 确定route

  routing engine基于当前HttpContext确定Route的处理 routing engine 指出route table里面匹配的route 并

  在 IRouteHandler实例创建route处理!

   )route handler 创建相关的IHttpHandler实例在route table里 每一个route 都与一个IHttpHandler对应 IHttpHandler基于当前的HttpContext数据负责创建一个Controller(控制器)!IHttpHandler是由当前活动的

  IRouteHandler的GetHttpHandler所创建!

  具体的细节如下

  public interface IRouteHandler

  {

  // Methods IHttpHandler GetHttpHandler(RequestContext requestContext);

  }

   )IHttpHandler实例确定Controller(控制器)

  在MVC应用程序中 MvcHandler实现了IHttpHandler Controller实例 是基于所输入的HttpContext

  和Url参数 与route 对应的 ControllerFactory 创建一个controller ControllerContext包含上下文数据 传入到controller的Excute方法

  触发 controller的逻辑处理!

  MvcHandler主要有一个ControllerBuilder _controllerBuilder字段;

  具体细节如下

  public class MvcHandler : IHttpAsyncHandler IHttpHandler IRequiresSessionState { // 主要的Fields private ControllerBuilder _controllerBuilder; } ControllerBuilder类主要有一个方法GetControllerFactory public class ControllerBuilder { public IControllerFactory GetControllerFactory(); } 通过实现IControllerFactory 工厂 创建一个Controller

   )Controller执行

  所有的controller 逻辑调用执行时 actions请求被执行!当controller的逻辑被执行时 会返回一个

  ActionResult 一个ActionResult实例 会触发呈现一个View(视图) 当触发发生时 一个视图引擎被创建 进行进一

  步的处 理

   )一个视图引擎创建

  视图引擎实例会创建一个IView接口实例 返回一个ViewEngineResult实例

   ) 视图呈现

lishixinzhi/Article/program/net/201311/12318

阅读更多 >>>  mvc工作流程,ASP.NET MVC的工作流程

mvc开发模式?

MVC模式就是架构模式的一种,它对我的启发特别大。我觉得它不仅适用于开发软件,也适用于其他广泛的设计和组织工作。
下面是我对MVC模式的一些个人理解,不一定正确,主要用来整理思路。
2.
MVC是三个单词的首字母缩写,它们是Model(模型)、View(视图)和Controller(控制)。
这个模式认为,程序不论简单或复杂,从结构上看,都可以分成三层。
1)最上面的一层,是直接面向最终用户的"视图层"(View)。它是提供给用户的操作界面,是程序的外壳。
2)最底下的一层,是核心的"数据层"(Model),也就是程序需要操作的数据或信息。
3)中间的一层,就是"控制层"(Controller),它负责根据用户从"视图层"输入的指令,选取"数据层"中的数据,然后对其进行相应的操作,产生最终结果。
这三层是紧密联系在一起的,但又是互相独立的,每一层内部的变化不影响其他层。每一层都对外提供接口(Interface),供上面一层调用。这样一来,软件就可以实现模块化,修改外观或者变更数据都不用修改其他层,大大方便了维护和升级。
3.
图片
我用Windows的计算器小程序为例,解释一下MVC模式,虽然它不一定使用这个模式编写。
在这个计算器程序中,外部的那些按钮和最上面的显示条,就是"视图层",那些需要运算的数字就是"数据层",执行加减乘除的那些内部运算步骤就是"控制层"。每一层执行不同的功能,整个程序的结构非常清楚。
如果我们扩大一点想象,就会发现,很多程序本质上都是这种模式:对外提供一组触发器(本例中是按钮),然后执行一些内部操作,最后返回结果。因此,MVC模式的应用是非常广泛的。
4.
图片
在我看来,不仅编写程序可以用MVC模式,家用电器也可以用。
以家用微波炉为例,可以将它也理解成三层结构。最简单的情况下,微波炉的操作用两个转盘实现,一个控制温度,另一个控制时间。这两个转盘就是"视图层"(view),而其内部的微波产生装置则是"数据层"(Model),这里的"数据"需要理解成"核心功能"。至于将用户通过转盘输入的信息,转换成对微波产生器的操作,则用"控制层"来实现。
如果每一层都是独立的,那么微波炉外部更换一个新潮的外壳,或者内部更换更大功率的微波产生器,完全可以在不更改其他层的情况下实现。这就是MVC模式的

mvc架构分析?

MVC设计模式一般指MVC框架,M(Model)指数据模型层,V(View)指视图层,C(Controller)指控制层。使用MVC的目的是将M和V的实现代码分离,使同一个程序可以有不同的表现形式。其中,View的定义比较清晰,就是用户界面。
在Web项目的开发中,能够及时、正确地响应用户的请求是非常重要的。用户在网页上单击一个URL路径,这对Web服务器来说,相当于用户发送了一个请求。而获取请求后如何解析用户的输入,并执行相关处理逻辑,最终跳转至正确的页面显示反馈结果,这些工作往往是控制层(Controller)来完成的。
在请求的过程中,用户的信息被封装在User实体类中,该实体类在Web项目中属于数据模型层(Model)。
在请求显示阶段,跳转的结果网页就属于视图层(View)。
像这样,控制层负责前台与后台的交互,数据模型层封装用户的输入/输出数据,视图层选择恰当的视图来显示最终的执行结果,这样的层次分明的软件开发和处理流程被称为MVC模式。

ASP.NET MVC简单编程篇

   ASP NET MVC概念
  ASP NET MVC 是微软官方提供的MVC模式 说白了 ASP NET MVC知识开发ASP NET Web
  应用程序的一个框架而已 而且其只是一个表示层框架 同时也是微软的第一个开源项目
  使用ASP NET开发web应用程序方式
   WebForm方式

   Asp Net MVC 方式
  注意 WebForm方式和Asp Net MVC方式是使用开发web应用程序的两种并行方式 mvc(以下简称mvc)的目的并不是取代WebForm 而是web开发的另外一种选择而已
   MVC模式简介
  MVC模式是一种表现模式 它将web应用程序分成三个主要组件 即 视图(View) 控制器(Controller)和模型(Model)
  M Model主要是存储或者是处理数据的组件
  Model其实是实现业务逻辑层对实体类相应数据库操作 如CRUD(Create/Retrieve/Update/Delete) 它包括数据 验证规则 数据访问和业务逻辑等应用程序信息
  V View是用户接口层组件 主要是将Model中的数据展示给用户
  C Controller处理用户交互 从Model中获取数据并将数据传给指定的View
   要点
   M和V的实现代码分离 从而使同一个程序可以使用不同的表现形式 C存在的目的则是确保M和V的同步 一旦M改变 V应该同步更新
   控制器隔离了业务逻辑和View耦合 使得业务逻辑和数据规则等很容易改变而不影响到前台页面
   View和Controller都可以直接请求Model 但是Model不依赖View和Controller
   Controller可以直接请求View来显示具体页面 View不依赖Controller
   第一个Asp Net MVC程序
  案例 下面我们通过向EFFirst数据库的Customer表中添加数据数据并且将所有用户信息展示到对应页面的方式 来书写第一个Asp Net MVC应用程序
   Customer表结构
  CustId(客户编号) 主键自动增长
  CustName(客户姓名)
  CustAddress(客户地址)
   首先创建MVC 的项目
  对解决方案点右键 新建项目 如下图
  将项目名称命名为MyMVC 然后点击确定 如下图
  选择否 点击确定
   接下来对项目的目录结构进行剖析
  App_Data;在该文件夹下的文件是不同通过URL访问的 起到保护文件的作用
  Content:项目用到的素材和样式等的文件夹 例如我们可以将Image文件夹和Css文件夹放到Content文件夹中
  Controllers:控制器存储文件夹
  Models 模型存放文件夹
  Scripts js(javascript)文件存储文件夹
  Views 视图存放文件夹
   创建控制器UserInfoController
   创建视图Register
  Register页面对Controller发起请求 请求可以分两种 get和post 所以我们写了两个action 为了方便后续操作 我们可以对action写一个重载 无参的Register()用来处理get请求 带参数的Register(FormCollection collection)用来处理post请求 如下图
  然后对无参的Register点右键 选择添加视图菜单项
  点击添加按钮 则在Views文件夹中会自动创建出一个名称为UserInfo(和action所在的控制器名称相同)的文件夹 并且在该文件夹下创建一个名称为Register的aspx文件 注意 这里的aspx文件没有后缀名为 cs的文件
  在Register中书写代码如下所示
  既然是注册页面 必须将用户输入的信息提交到服务器 此时我们可以使用form表单 为其action属性设置属性值为 /UserInfo/Register UserInfo代表的是UserInfoController Register代表UserInfoController下的action 也即是说我们将信息提交到了Register这个action
  用户填写完信息后 流程跳转到了UserInfoController 此时我们可以在接收Post请求的action中书写如下代码
  说明 return RedirectToAction( Index )作用是跳转到名称为Index的action继续执行
   创建action Index和视图Index
  用同样的方式对Index点右键 创建View Index

微冷的雨 用户详细信息页面

由于顾客的数据肯定会出现多条 因此使用table显示

)ViewData[ Customer ]) {%>

<% foreach (var item in (IEnumerable

<%} %>

编号 用户姓名 用户地址
<%:item CustId %> <%:item CustName %> <%:item CustAddress %>

View Code 最终我们可以实现如下效果 lishixinzhi/Article/program/net/201311/12164


spring mvc的执行流程

程序运行的时候,这样的执行流程主要就是首先要进行数据统计,然后完成参数调试模式,最后进行数据的输出完成而流程操作。
确定流程选择时候,根据这样的逻辑分析进行相应的运算结果。
在流程执行过程中,需要利用spring进行数据处理之后,然后应用。
这是执行流程,可以通过一些代码来完成它的序列号的选择
他的行程和流程的话就是他匹配的一个数值吧,然后的话一种方式的意思。
基本相近,相等都一样,尺寸就扯不到,刹车是路。
经过启动容器之后,进入分发的dispatch,然后经过过滤器

MVC工作流程是什么?

Spring MVC工作流程描述:
1. 用户向服务器发送请求,请求被Spring 前端控制Servelt DispatcherServlet捕获;
2. DispatcherServlet对请求URL进行解析,得到请求资源标识符(URI)。然后根据该URI,调用HandlerMapping获得该Handler配置的所有相关的对象(包括Handler对象以及Handler对象对应的拦截器),最后以HandlerExecutionChain对象的形式返回;
3. DispatcherServlet 根据获得的Handler,选择一个合适的HandlerAdapter;
4. 提取Request中的模型数据,填充Handler入参,开始执行Handler(Controller)。
在填充Handler的入参过程中,根据你的配置,Spring将帮你做一些额外的工作:
HttpMessageConveter: 将请求消息(如Json、xml等数据)转换成一个对象,将对象转换为指定的响应信息。
数据转换:对请求消息进行数据转换。如String转换成Integer、Double等。
数据根式化:对请求消息进行数据格式化。 如将字符串转换成格式化数字或格式化日期等。
数据验证: 验证数据的有效性(长度、格式等),验证结果存储到BindingResult或Error中。
5. Handler执行完成后,向DispatcherServlet 返回一个ModelAndView对象;
6. 根据返回的ModelAndView,选择一个适合的ViewResolver(必须是已经注册到Spring容器中的ViewResolver)返回给DispatcherServlet ;
7. ViewResolver 结合Model和View,来渲染视图;
8. 将渲染结果返回给客户端。
Spring MVC是Spring Framework的一部分,是基于Java实现MVC的轻量级Web框架。Spring MVC的特点:1、轻量;2、高效;3、与Spring兼容性好;4、功能强大,RESTful、数据验证、格式化、绑定机制、本地化、主题等;5、简洁灵活。

阅读更多 >>>  struts2工作原理和mvc,struts2既然是优秀的mvc框架,那么还要mvc三层干什么,struts2不就全搞定了?

网站数据信息

"mvc框架的执行流程,MVC工作流程是什么?"浏览人数已经达到24次,如你需要查询该站的相关权重信息,可以点击进入"Chinaz数据" 查询。更多网站价值评估因素如:mvc框架的执行流程,MVC工作流程是什么?的访问速度、搜索引擎收录以及索引量、用户体验等。 要评估一个站的价值,最主要还是需要根据您自身的需求,如网站IP、PV、跳出率等!