Spring MVC 是 Spring 框架的一部分,和 Struts 一样都是属于 web 层框架,根据项目分层的思想,一个项目基本可以分为持久层,业务层和 web 层。而 Spring MVC 主要作用在 web 层,也叫表现层。

web 层核心的功能自然是处理用户的请求并返回数据,那我们就要介绍一下 Spring MVC 中是如何处理请求并返回数据的。首先来看一下它的大致流程。

上图是框架中的大致方向,从用户发出请求开始,前端处理器接收请求,但是自己不干活,会把请求发送到不同的处理器,处理器中会调用业务方法进行处理,得到结果返回给前端控制器,控制器再将结果发送给 JSP 来渲染页面,最终将含有结果的 HTML 页面返回给浏览器。

仔细说一下,首先你要告诉我处理什么样的请求,不能来个阿猫阿狗我全接收了,这就需要我们在 web.xml 文件中配置一下什么样的请求才能进入框架。

请求是进来了,但是那是一串 URL 呀,框架需要分析这个请求呀,分析请求这个活前端控制器依旧不干,而是由处理器映射器 HandlerMapping 来处理。这个对象是 Spring MVC 提供好的,我们只需要配置一下就好,不要忘了 Spring 中强大的 IoC 功能。

处理器映射器的作用就在于,你给我一串 URL ,我来分析 URL,然后找到处理这个请求的包名+类名+方法名返回给控制器。找不到就报 404 呗。而这种 URL 和方法的映射关系,我们一般使用注解@RequestMapping 在方法的上面配置。

你以为控制器知道具体的方法以后就会执行嘛,想太多,这时候处理器适配器就出现了,这就是控制器下面的二腿子啊,它也不干活,那谁来处理啊,那肯定是我们牛逼哄哄的程序员了。

你自己配的方法的 URL ,你不写方法你还想飞不成啊!

肯定是需要自己写处理 URL 的逻辑呀,有了包名+类名+方法名之后,前端控制器和处理器适配器说 “去看看这个方法在那里,处理一下”。处理器适配器一看,这不就是隔壁家的二狗子嘛,然后把二狗子叫来了,去处理一下请求吧。

好了,终于到找真正干活的人了,就是我们可爱的程序员啊,然后,不出意外的情况下,方法返回了一个结果给到前端控制器。这时候老大又发话了,“视图解析器你过来一下,给你个结果,去把结果渲染到页面上去。“

视图解析器拿到结果和页面(不一定是 JSP,但是常见的是 JSP)一顿操作,该填充的填充,就得到了一个 HTML 页面,然后这些完美的二进制通过网线就从远方的服务器传到了浏览器中供用户欣赏。

以上说的就是一个请求在 web 层中 Spring MVC 框架处理的逻辑,要注意呦,我们手写的处理器 Controller 中会调用 Service 层的东西,那就是业务层的范畴了。详细的还可以看看下面这张图。

但事情哪有那么顺利呢,总会出现异常啊,什么 404,500,为了使我们的用户大人蒙在鼓里,我们还可以配置一个全局的异常处理类。只需要实现 HandlerExceptionResolver 即可,当然,我们也要在 Spring 中注册一下实现类。

这样在发生异常的时候,我们可以设置跳转到一个卡哇伊的页面,殊不知其实是系统出现问题了……

正常的和不正常的 Spring MVC 都能处理,但你以为这样就够了嘛,不,它还为我们提供了许多其它的功能。

还有什么上传图片啊,简直就是逆天啊,直接把图片当成一个参数传到后台了,当然,肯定需要一定的条件,比方说前台 form 必须有 enctype,后台接收图片的参数时必须使用 MultipartFile 接口且形参名一致,而且实现类还是固定的,我们需要注入一下 CommonsMultipartResolver 类。

还有一个拦截器的概念,这就是 AOP 编程的一个体现呀,一夫当关,万夫莫开。而我们需要做的就是在配置文件中使用 <mvc:interceptor> 标签配置一下拦截器拦截的路径和拦截器类。

在拦截器类中我们就可以处理具体的逻辑了,比方说,验证用户是否登录呀。给用户分类呀,不用的用户跳转的页面不一致。

最后说一下 Spring MVC 和 Struts2 的区别。

1、Spring MVC 的入口是一个 Servlet 即前端控制器,而 Struts2 入口是一个 Filter 过滤器。

2、Spring MVC 是基于方法开发 (一个 url 对应一个方法),请求参数传递到方法的形参,可以设计为单例或多例(建议单例),Struts2 是基于类开发,传递参数是通过类的属性,只能设计为多例。

3、Struts2 采用值栈存储请求和响应的数据,通过 OGNL 存取数据, Spring MVC 通过参数解析器是将 request 请求内容解析,并给方法形参赋值,将数据和视图封装成 ModelAndView 对象,最后又将 ModelAndView 中的模型数据通过 request 域传输到页面。Jsp 视图解析器默认使用 jstl 表达式。

戏说 Spring MVC 框架的更多相关文章

  1. Spring MVC篇一、搭建Spring MVC框架

    本项目旨在搭建一个简单的Spring MVC框架,了解Spring MVC的基础配置等内容. 一.项目结构 本项目使用idea intellij创建,配合maven管理.整体的目录结构如图: 其中ja ...

  2. Spring MVC 框架的架包分析,功能作用,优点

    由于刚搭建完一个MVC框架,决定分享一下我搭建过程中学习到的一些东西.我觉得不管你是个初级程序员还是高级程序员抑或是软件架构师,在学习和了解一个框架的时候,首先都应该知道的是这个框架的原理和与其有关j ...

  3. 从零开始学 Java - 搭建 Spring MVC 框架

    没有什么比一个时代的没落更令人伤感的了 整个社会和人都在追求创新.进步.成长,没有人愿意停步不前,一个个老事物慢慢从我们生活中消失掉真的令人那么伤感么?或者说被取代?我想有些是的,但有些东西其实并不是 ...

  4. 【WEB】初探Spring MVC框架

    Spring MVC框架算是当下比较流行的Java开源框架.但实话实说,做了几年WEB项目,完全没有SpringMVC实战经验,乃至在某些交流场合下被同行严重鄙视“奥特曼”了.“心塞”的同时,只好默默 ...

  5. Spring mvc框架 controller间跳转 ,重定向 ,传参

     一.需求背景     1. 需求:spring MVC框架controller间跳转,需重定向.有几种情况:不带参数跳转,带参数拼接url形式跳转,带参数不拼接参数跳转,页面也能显示.   @Req ...

  6. spring mvc 框架搭建及详解

    现 在主流的Web MVC框架除了Struts这个主力 外,其次就是Spring MVC了,因此这也是作为一名程序员需要掌握的主流框架,框架选择多了,应对多变的需求和业务时,可实行的方案自然就多了.不 ...

  7. Spring MVC框架搭建

    Spring MVC篇一.搭建Spring MVC框架 本项目旨在搭建一个简单的Spring MVC框架,了解Spring MVC的基础配置等内容. 一.项目结构 本项目使用idea intellij ...

  8. Spring MVC框架下的第一个Hello World程序

    本程序是一个maven程序,使用maven方便管理jar包和程序,简化了操作步骤.本程序的目的是通过一个简单的程序,了解Spring MVC框架的基本工作流程,由简入繁的学习Spring MVC框架, ...

  9. spring MVC框架入门(外加SSM整合)

    spring MVC框架 一.什么是sping MVC Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面.Spring 框架提供了构建 W ...

随机推荐

  1. oracle数据库连接池查看

    select username , count(*), machine from v$session where username is not null group by username, mac ...

  2. 个推用户画像产品(个像)Android集成实践

    我们团队之前一直是个推推送的忠实用户,近期个推新推出了产品“个像·用户画像”,刚好非常契合我们的业务需求,于是我们也试用了一下.总的来说效果还不错,这篇文章就为大家介绍一下如何从零开始快速集成个像An ...

  3. OpenStack 计算服务 Nova介绍和控制节点部署(七)

    介绍 Nova是openstack最早的两块模块之一,另一个是对象存储swift.在openstack体系中一个叫做计算节点,一个叫做控制节点.这个主要和nova相关,我们把安装为计算节点nova-c ...

  4. node的path.join 和 path.resolve的区别

    直接上图: join resolve 明显可以看出,join只会帮你把路径连接起来,而resolve会以当前路径为父路径来把你提供的路径连接起来

  5. angular.module()参数问题

    var app = angular.module('myApp', []); 第二个参数是依赖的模块,因为这里不需要依赖其它模块,因此为空,但是[]不能省略.

  6. bzoj千题计划184:bzoj1261: [SCOI2006]zh_tree

    http://www.lydsy.com/JudgeOnline/problem.php?id=1261 dp[l][r][dep]  区间[l,r]内的节点,根在dep层的最小代价 枚举根i,dp[ ...

  7. C++的Enum hack

    从一个例子开始吧 class Game { private: static const int GameTurn = 10; int scores[GameTurn]; }; 对于支持类内初始化的C+ ...

  8. 【问题收集·中级】关于XMPP使用Base传送图片

    [问题收集·中级]关于XMPP使用Base传送图片 下面是我与博友的问答过程:并在最后链接附录了相应的文件: 博友问题:  16:35:38 他跟我说要 内容图片  base64编码 上传..博友问题 ...

  9. HDU 1229 还是A+B(A+B陶冶情操)

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1229 解题报告:A+B #include<cstdio> int main() { int ...

  10. 20165230 ch02 课上测试

    题目一 1.参考附图代码,编写一个程序 "week0201学号.c",判断一下你的电脑是大端还是小端. 2.提交运行结果"学号XXXX的笔记本电脑是X端"的运行 ...