SpringMVC入门以及工作流程详解
什么是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,其中规定了视图解析器的前后缀。