目录
一、什么是MVC?
MVC是模型(Model)、视图(View)、控制器(Controller)的简写,是一种软件设计规范。是将业务逻辑、数据、显示分离的方法来组织代码。
MVC主要作用是降低了视图与业务逻辑间的双向偶合。
MVC不是一种设计模式,MVC是一种架构模式。当然不同的MVC存在差异。
Model(模型):数据模型,提供要展示的数据,因此包含数据和行为,可以认为是领域模型或JavaBean组件(包含数据和行为),不过现在一般都分离开来:Value Object(数据Dao) 和 服务层(行为Service)。也就是模型提供了模型数据查询和模型数据的状态更新等功能,包括数据和业务。
View(视图):负责进行模型的展示,一般就是我们见到的用户界面,客户想看到的东西。
Controller(控制器):接收用户请求,委托给模型进行处理(状态改变),处理完毕后把返回的模型数据返回给视图,由视图负责展示。也就是说控制器做了个调度员的工作。
最典型的MVC就是JSP + servlet + javabean的模式。
(1)JSP Model1
在web早期的开发中,通常采用的都是Model1。
Model1中,主要分为两层,视图层和模型层。
优点:架构简单,比较适合小型项目开发;
缺点:
- JSP职责不单一,职责过重,不便于维护;
- JSP页面身兼View和Controller两种角色,将控制逻辑和表现逻辑混杂在一起,从而导致代码的重用性非常低,增加了应用的扩展性和维护的难度
(2) JSP Model2
视图View JSP:负责生成动态网页
控制器Controller Servlet:负责流程控制
模型Model JavaBean:负责业务逻辑处理
执行流程:
用户发请求
Servlet接收请求数据,并调用对应的业务逻辑方法
业务处理完毕,返回更新后的数据给servlet
servlet转向到JSP,由JSP来渲染页面
响应给前端更新后的页面
优点:
1. 多视图共享一个模型,大大提高代码的可重用性
2.MVC三个模块相互独立,松耦合结构
3.控制器提高了应用程序的灵活性和可配置性
4.有利于软件工程化管理
缺点:
1.原理复杂
2.增加了系统结构和实现的复杂性
3.视图对模型数据的低效率访问
二、什么是SpringMVC?
Spring MVC是Spring Framework的一部分,是基于Java实现MVC的轻量级Web框架。
Spring MVC特点:
- 清晰的角色划分
- 灵活的功能配置
- 提供了大量控制器接口和实现类
- 真正做到了与View层的实现无关
- 国际化支持
- 面向接口编程
- Spring提供了Web应用开发的一整套流程,不仅仅MVC,他们之间可以很方便的结合一起
三、Spring MVC框架搭建步骤
(1)创建项目,添加Web支持
(2)导入Spring MVC所需的Jar包,添加依赖
(3)配置文件
(3.1)在web.xml中配置Servlet
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc-servlet.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>*.action</url-pattern>
</servlet-mapping>
contextConfigLocation的作用
在web.xml中通过contextConfigLocation配置spring,contextConfigLocation参数定义了要装入的 Spring 配置文件。
如果不写任何参数配置,默认的是在/WEB-INF/applicationContext.xml
如果指定了要加载的文件,则会去加载相应的xml,而不会去加载/WEB-INF/下的applicationContext.xml。如果没有指定的话,默认会去/WEB-INF/下加载applicationContext.xml。
如果想要自定义文件名,需要在web.xml中加入contextConfigLocation这个context参数
springmvc的默认配置文件是放在WEB-INF下的,并且要命名为*-servlet.xml,*为servlet—name,即上文中的"Springmvc"。
我们可以在web.xml中配置<init-param>来自定义文件名称和位置。
load-on-startup标签的作用
load-on-startup标签可以设置servlet的加载优先级别和容器是否在启动时加载该servlet,如下设置:
<load-on-startup>1</load-on-startup>
当值为0或者大于0时,代表容器启动时加载该servlet。正数的值越小,启动时加载该servlet的优先级越高。如果为负数,则容器启动时不会加载该servlet,只有该servlet被选择时才会加载。
(3.2)创建SpringMVC的配置文件(springmvc-servlet.xml)
- 配置扫描器
- 配置注解驱动
- 配置视图解析器
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!-- 配置扫描器-->
<context:component-scan base-package="com.etc.controller"></context:component-scan>
<!-- 配置注解驱动 -->
<mvc:annotation-driven></mvc:annotation-driven>
<!-- 配置视图解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
</beans>
(4)创建Controller 处理请求的控制器
(5)创建View
(6)部署运行
四、Spring MVC的架构图
DispatcherServlet(前端控制器)
Spring MVC最核心的类
web.xml中配置
Handler(处理器):对应MVC中C(Controller)
类型:Object
作用:实际处理请求
标注了@RequestMapping的所有方法都可以看作是一个Handler
ModelAndView
逻辑视图名
模型对象
核心组件
HandlerMapping(处理器映射)
BeanNameUrlHandlerMapping(默认)
将请求URL映射到同名的控制器Bean上
DefaultAnnotationHandlerMapping
将请求映射到标注@RequestMapping注解的控制器和处理方法上 RequestMappingHandlerMapping
HandlerAdapter(适配器)
AnnotationMethodHandlerAdapter
RequestMappingHandlerAdapter
ViewResolver(视图解析器)
InternalResourceView