本文主要参考了 imooc-SpringMVC 起步 视频教程和 SpringMVC 从入门到精通 系列 - HansonQ ,还有自己的一些总结。
主要内容:MVC 简介、前端控制器模式、SpringMVC 基本概念、SpringMVC 配置、SpringMVC 中的注解、SpringMVC 数据绑定。
MVC 简介
1、MVC 是一种架构模式
程序分层,分工合作,既相互独立,又协同工作,分为三层:模型层、视图层和控制层
2、MVC 是一种思考方式
- View:视图层,为用户提供 UI,重点关注数据的呈现,为用户提供界面
- Model:模型层,业务数据的信息表示,关注支撑业务的信息构成,通常是多个业务实体的组合
- Controller:控制层,调用业务逻辑产生合适的数据(Model),传递数据给视图用于呈现
MVC 设计模式在 B/S 下的应用:
①:浏览器发送请求到控制器(这里要知道控制器的作用)
②:控制器不能处理请求必须交给模型层来处理接着去访问数据库
③:模型层将处理好的结果返回给控制层
④:控制层将逻辑视图响应给浏览器(浏览器显示的是渲染过的视图)
MVC 本质:MVC 的核心思想是业务数据抽取同业务数据呈现相分离;分离有利于程序简化,方便编程
前端控制器模式
前端控制器模式(Front Controller Pattern)是用来提供一个集中的请求处理机制,所有的请求都将由一个单一的处理程序处理。该处理程序可以做认证/授权/记录日志,或者跟踪请求,然后把请求传给相应的处理程序。
- 前端控制器(Front Controller)- 处理应用程序所有类型请求的单个处理程序,应用程序可以是基于 web 的应用程序,也可以是基于桌面的应用程序。
- 调度器(Dispatcher) - 前端控制器可能使用一个调度器对象来调度请求到相应的具体处理程序。
- 视图(View) - 视图是为请求而创建的对象。
前端控制器的主要作用:
- 指前端控制器将我们的请求分发给我们的控制器去生成业务数据
- 将生成的业务数据分发给恰当的视图模版来生成最终的视图界面
SpringMVC 基本概念
对组件说明:
- DispatherServlet:前端控制器 用户请求到达前端控制器,相当于 MVC 中的 C,而 DispatherServlet 是整个流程的核心,它来调用其他组件来处理用户的请求,前端控制器的存在降低了其他组件之间的耦合度。
- HandlerMapping:处理器映射器 它的作用就好比去看电影要拿着电影票根据电影票上面的座位号找到座位其中座位就是 Handler,电影票以及上面的座位号就是 URL HandlerMapping 负责根据用户请求找到 Handler 即处理器,SpringMVC 提供了不同的映射器实现不同的映射方式,例如:配置文件方式,实现接口方式,注解方式等。
- Handler:处理器 Handler 是后端控制器,在前端控制器的控制下后端控制器对具体的用户请求进行处理,Handler 涉及到具体的用户业务请求,所以一般情况下需要程序员根据业务需求开发。
- HandlerAdapter:处理器适配器 通过 HandlerAdapter 对处理器进行执行,这是适配器模式的应用,通过适配器可以对更多类型的处理器进行执行。播放的电影是 3D 的你看不清楚,因此电影院跟你说你要想看清电影就必须戴 3D 眼镜。也就是说 Handler 满足一定的要求才可以被执行。
- ViewResolver:视图解析器 ViewResolver 负责将处理结果生成 View 视图,ViewResolver 首先根据逻辑视图名解析成物理视图名即具体的页面地址,再生成 View 视图对象,最后对 View 进行渲染将处理结果通过页面展示给用户。
工作原理解释说明:
1、用户发送请求到 SpringMVC 框架提供的 DispatcherServlet 这个前端控制器(了解 struts2 的朋友也都知道其实 struts2 也有一个前端控制器 web.xml 中的 filter 标签就是)。
2、前端控制器会去找处理器映射器(HandlerMapping),处理器映射器根据请求 url 找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一并返回给 DispatcherServlet 。
3、根据处理器映射器返回的处理器,DispatcherServlet 会找“合适”的处理器适配器(HandlerAdapter)
4、处理器适配器 HandlerAdpater 会去执行处理器(Handler 开发的时候会被叫成 Controller 也叫后端控制器在 struts2 中 action 也是一个后端控制器)执行之前会有转换器、数据绑定、校验器等等完成上面这些才会去正在执行 Handler
5、后端控制器 Handler 执行完成之后返回一个 ModelAndView 对象 。
6、处理器适配器 HandlerAdpater 会将这个 ModelAndView 返回前端控制器 DispatcherServlet。前端控制器会将 ModelAndView 对象交给视图解析器 ViewResolver。
7、视图解析器 ViewResolver 解析 ModelAndView 对象之后返回逻辑视图。
8、前端控制器 DispatcherServlet 对逻辑视图进行渲染(数据填充)之后返回真正的物理 View 并响应给浏览器。
SpringMVC 配置
1、前端控制器需要在 web.xml 中配置
<!-- 配置前端控制器 --> |
2、在 spring/spring-web.xml
配置视图解析器
<!-- 配置视图解析器 --> |
3、在 spring/spring-web.xml
配置 注解模式
<!-- 自动加载RequestMappingHandlerMapping和RequestMappingHandlerAdapter, --> |
4、在 spring/spring-web.xml
配置 扫描 web 相关的 bean
<!-- 组件扫描器:可以扫描 @Controller、@Service、@Repository 等等 --> |
SpringMVC 中的注解
@Controller
@Controller 注解,用于标识这个类是一个后端控制器(类似 struts 中的 action),主要作用就是接受页面的参数,转发页面。
@Controller 源码:
// 表明只能定义在类上面 |
@RequestMapping
这个注解的作用目标就跟 @Controller 不一样了,这个注解可以定义在类上面也可以定义在方法上面。
/** |
代码实例
|
@RequestMapping 还支持 Ant 方格的请求
?:匹配文件中的一个字符 |
@PathVariable
@PathVariable 这个注解支持现在当下较为流行的 Restful 风格的 URL。 先说说这个注解的作用,支持将 url 中的占位符参数绑定到目标方法的参数上, 该功能也是 SpringMVC 实现 Restful 风格 url 的重要措施。
代码实例
// http://localhost:8080/demo/sss |
我们熟悉的请求应该是 POST 和 GET 请求,这两个请求也是最常用的而实际上 HTTP1.1 请求还有 PUT、DELETE 等 8 种来表名请求的动作。
在 SpringMVC 中要实现 PUT 和 DELETE 请求需要在 web.xml 额外配置一个过滤器,这个过滤器的作用就是把 POST 请求变为 PUT 和 DELETE 请求。
关于 Restful 的内容计划单独写。
@RequestParam
|
// http://localhost:8080/demo/para?slug=google |
另外还有一点要提示一下,参数没有加这个注解也能映射成功,这是应为 SpringMVC 框架支持请求参数和目标方法参数一致的时候可以省略这个注解。
@ResponseBody
/** |
代码
// http://localhost:8080/demo/json |
SpringMVC 数据绑定
简单说一下场景:
对于一个注册页面有很多信息譬如:用户名、密码、确认密码、邮箱、手机、兴趣等等。这时候就会想能不能将这些个参数包装在一个对象中(POJO),用这个 POJO 来做目标方法的形参上面。
可以说的是 SpringMVC 是支持将 POJO 作为目标参数的。当然也是要遵循一些规则的,就是表单的 name 属性值要和 POJO 的属性值要一致。当然了,这样又会有一个新的疑问支不支持级联属性答案是支持的。
public class Address { |
public class Persion { |
<form action="/demo/pojo"> |
|
SpringMVC 使用 Servlet API
可以使用 Servlet 原生的 API 作为目标方法的参数。具体支持以下类型:HttpServletRequest、HttpServletResponse、HttpSession、java.security.Principal、Locale、InputStream、OutputStream、Reader、Writer
// http://localhost:8080/demo/req?slug=facebook |