什么是MVC
MVC是一种分层方法,其三层分别是模型(Model),视图(View)和控制器(Controller)。是一种软件设计规范。MVC可以将软件的逻辑、数据和业务相分离,其主要作用是消除视图和业务逻辑之间的双向耦合
模型Model:指数据模型,提供了需要展示的数据,可以认为是JavaBean。模型会提供模型数据查询和模型数据状态更新等功能。
控制器Controller:接收用户请求,委托给模型进行处理,处理完毕后将处理完成的数据传输给视图
视图View:负责进行模型的展示,也就是用户可以看到的东西
MVC框架需要做什么
- 将url映射到java类或java类的方法
- 封装用户提交的数据
- 处理请求–调用相关的业务处理–封装响应数据
- 将响应的数据进行渲染 jsp / html 等表示层数据
什么是SpringMVC
SpringMVC是Spring框架的一部分,是基于Java实现的轻量级Web框架。
SpringMVC的核心是DispatchServlet(调度Servlet),在一个web应用中,会有多个dao和多个数据库表进行映射,而一个dao又和一个service以及一个servlet联系在一起。如下图
用户不需要逐个管理servlet,而是通过dispatch统一管理,dispatch的职责包括:调度servlet,处理请求,适配URL和跳转页面。dispatchServlet使用的是适配器模式(一种设计模式)
基本流程如下:
我们具体来分析下SpringMvc的执行流程:
图中实线为SpringMVC帮我们解决的流程,虚线是我们需要自行编码实现的。
- 用户将请求(Request)发送到DispatchServlet,DispatchServlet会对请求进行拦截并且处理
- HandlerMapping根据用户请求的url寻找对应的Handler(Handler一般会在springmvc-servlet.xml中注册)
- HandlerExecution会根据HandlerMapping找到的Handler寻找对应的处理器(Controller)
- HandlerExecution将对应的Controller返回给DispatchServlet
- HandlerAdapter是处理器适配器,会按照特定的规则执行Handler
- 调用具体的Controller
- Controller完成对对应请求的处理后,将处理完毕的数据封装在一个ModelAndView中,返回给Handler Adapter
- HandlerAdapter又将ModelAndView传给DispatchServlet
- DispatchServlet会调用视图解析器,将ModelAndView转化为视图,并且根据配置文件拼接视图名字,找到对应的视图。然后将视图渲染到视图上
- DispatchServlet将对应视图返回
那么我们具体到代码中看是如何使用DispatchServlet进行统一管理的。在以往,所有前端页面都需要配置在web.xml中,但是在SpringMVC中,web.xml只需要完成DispatchServlet的配置
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
<display-name>Archetype Created Web Application</display-name>
<!--配置DispatchServlet-->
<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>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>\</url-pattern>
</servlet-mapping>
</web-app>
接着在resource文件夹下新建一个springmvc-servlet.xml用于规定DispatchServlet的配置。web.xml会读取该配置文件来完成对DispatchServlet的配置,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"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--处理映射器-->
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
<!--处理映射器-->
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
<!--视图解析器:DispatcherServlet给他的ModelAndView-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="InternalResourceViewResolver">
<!--前缀-->
<property name="prefix" value="/WEB-INF/jsp/"/>
<!--后缀-->
<property name="suffix" value=".jsp"/>
</bean>
<!--Handler-->
<bean id="/hello" class="com.hch.controller.HelloController"/>
</beans>
该配置中配置了DispatchServlet,其中规定了视图解析器的前后缀。