Spring MVC 是 Spring 提供的一个基于 MVC 设计模式的轻量级 Web 开发框架,本质上相当于 Servlet; 拥有结构最清晰的 Servlet+JSP+JavaBean 的实现,是一个典型的教科书式的 MVC 构架;Spring MVC 框架采用松耦合可插拔的组件结构,具有高度可配置性,比起其它 MVC 框架更具有扩展性和灵活性
流程:
Spring MVC 框架中,Controller 替换 Servlet 来担负控制器的职责,用于接收请求,调用相应的 Model 进行处理,处理器完成业务处理后返回处理结果,Controller 调用相应的 View 并对处理结果进行视图渲染,最终客户端得到响应信息
特点:
- 轻量级,简单易学
- 高效,基于请求响应的MVC框架
- 同Spring兼容性好,无缝结合
- 约定大于配置
- 功能强大:RESTful、数据验证、格式化、本地化、主题……
- 简介灵活
MVC模式
M(模型);实体类,数据的封装和数据的传输 V (视图):GUI组件,用于数据的展示 C (控制):事件,用于流程的控制
- Model(模型):dao、service
- View(视图):jsp
- Controller(控制器):servlet
环境搭建
- 导入依赖
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>org.example</groupId> <artifactId>SpringMVC_Projects</artifactId> <packaging>pom</packaging> <version>1.0-SNAPSHOT</version> <modules> <module>SpringMVC-01-servlet</module> </modules> <properties> <maven.compiler.source>8</maven.compiler.source> <maven.compiler.target>8</maven.compiler.target> </properties> <!--导入依赖--> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.1.9.RELEASE</version> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> <version>2.5</version> </dependency> <dependency> <groupId>javax.servlet.jsp</groupId> <artifactId>jsp-api</artifactId> <version>2.2</version> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency> </dependencies> </project>
新建一个web项目
导入相关jar包
编写web.xml , 注册DispatcherServlet
编写springmvc配置文件
接下来就是去创建对应的控制类 , controller
最后完善前端视图和controller之间的对应
测试运行调试
SpringMVC中心控制器
1.当发起请求被前端控制器(DispatcherServlet)拦截到请求,通过servlet-mapping匹配拦截
2.根据请求参数生成代理请求,找到请求对应的处理器控制器(Controller)
3.创建数据模型,访问数据库
4.返回模型数据到页面处理器控制器(Controller)
5.返回ModelAndView,Model(封装数据)View(跳转到目标),将模型响应给中心控制器(DispatcherServlet)
6.中心控制器(DispatcherServlet)使用模型与视图渲染结果
7.渲染完成将结果返回给中心控制器(DispatcherServlet)
8.中心控制器(DispatcherServlet)再将结果响应给请求者
DispatcherServlet是前端控制器,Spring的web框架围绕DispatcherServlet设计,DispatcherServlet是整个SpringMVC的控制中心;DispatcherServlet的作用是将请求分发到不同的处理器;用户发出请求,DispatcherServlet接受请求拦截请求
Springmvc中 / 和 /* 的区别
/ :只匹配所有请求,不会匹配jsp页面 /* :匹配所有请求,包括jsp页面
配置版Hello SpringMVC
- 新建Moudle,添加web支持
- 确定导入springmvc依赖
- 配置web.xml,注册DispatcherServlet
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0"> <!--配置DispatcherServlet:这个是SpringMVC的核心:请求分发器,前端控制器--> <!-- Springmvc中 / 和 /*的 区别 /:只匹配所有请求,不会匹配jsp页面 /*:匹配所有请求,包括jsp页面 --> <servlet> <servlet-name>springmvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!--DispatcherServlet要绑定Spring的配置文件--> <init-param> <param-name>contextConfigLocation</param-name> <!--在所有包中查找Spring配置文件--> <param-value>classpath:springmvc-servlet.xml</param-value> </init-param> <!--启动级别:1,跟随服务器启动--> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>springmvc</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> </web-app>
- 编写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"/> <!--视图解析器:模板引擎Thymeleaf,Freemarker……--> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver"> <!--前缀--> <property name="prefix" value="/WEB-INF/jsp/"/> <!--后缀--> <property name="suffix" value=".jsp"/> </bean> <!--BeanNameUrlHandlerMapping:bean--> <bean id="/hello" class="com.wei.controller.HelloController"/> </beans>
- 创建对应的控制类HelloController类
package com.wei.controller; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.mvc.Controller; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class HelloController implements Controller { @Override public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception { ModelAndView mv = new ModelAndView(); //业务代码 String result = "HelloSpringMVC"; mv.addObject("msg",result); //视图跳转 mv.setViewName("test"); return mv; } }
- 完善前端视图和HelloController之间的对应,在WEB-INF/jsp目录下创建test.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> ${msg} </body> </html>
SpringMVC原理分析
三大核心要素:
- 处理器映射器(HandlerMapping)
- 处理器适配器(HandlerAdapter)
- 视图解析器(ViewResolver)
1.DispatcherServlet表示前端控制器,是整个SpringMVC的控制中心,用户发出请求,DispatcherServlet接受请求并拦截请求
假设请求url为:http://localhost:8080/SpringMVC/hello
- http://localhost:8080 服务器域名
- SpringMVC 部署在服务器上的web站点
- hello 控制器
- url表示为:请求位于服务器http://localhost:8080上的SpringMVC站点的hello控制器
2.HandlerMapping为处理器映射器,DispatcherServlet调用HandlerMapping;HandlerMapping根据请求url查找Handler
3.HandlerExecution表示具体的Handler,其主要作用是根据url查找控制器,如上url被查找控制器为hello
4.HandlerExecution将解析后的信息传递给DispatcherServlet,解析控制器映射……
5.HandlerAdapte表示处理器适配器,其按照特殊的规则去执行Handler
6.Handler让具体的Controller执行
7.Controller将具体的执行信息返回给HandlerAdapter,如ModelAndView
8.HandlerAdapter将视图逻辑名或模型传递给DispatcherServlet
9.DispatcherServlet调用视图解析器(ViewResolver)来解析HandlerAdapter传递的逻辑视图
10.视图解析器将逻辑视图传递给DispatcherServlet
11.DispatcherServlet根据视图解析器解析的视图结果,调用具体的视图
12.最终将视图呈现给用户
代码实现
- 新建Moudle,添加web支持
- 确定导入SpringMVC依赖
- 配置web.xml,注册DispatcherServlet(web.xml)
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0"> <!--配置DispatcherServlet:这个是SpringMVC的核心:请求分发器,前端控制器--> <servlet> <servlet-name>springmvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!--DispatcherServlet要绑定Spring的配置文件--> <init-param> <param-name>contextConfigLocation</param-name> <!--在所有包中查找、绑定的Spring配置文件--> <param-value>classpath:springmvc-servlet.xml</param-value> </init-param> <!--启动级别:1,跟随服务器启动--> <load-on-startup>1</load-on-startup> </servlet> <!-- Springmvc中 / 和 /*的 区别 /:只匹配所有请求,不会匹配jsp页面 /*:匹配所有请求,包括jsp页面 --> <servlet-mapping> <servlet-name>springmvc</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> </web-app>
- 编写绑定Spring配置文件(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 1.获取ModelAndView数据 2.解析ModelAndView视图名字 3.拼接视图找到对应的视图 /WEB-INF/jsp/test.jsp 4.将数据渲染到视图 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver"> <!--前缀--> <property name="prefix" value="/WEB-INF/jsp/"/> <!--后缀--> <property name="suffix" value=".jsp"/> </bean> <!--BeanNameUrlHandlerMapping:bean--> <bean id="/hello" class="com.wei.controller.HelloController"/> </beans>
- 编写Controller控制器(HelloController)
package com.wei.controller; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.mvc.Controller; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class HelloController implements Controller { @Override public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception { ModelAndView mv = new ModelAndView(); //业务代码 String result = "HelloSpringMVC"; mv.addObject("msg",result); //视图跳转 mv.setViewName("test"); return mv; } }
- 创建跳转的视图(test.jsp)
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> ${msg} </body> </html>
注解版Hello SpringMVC
- 配置web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0"> <!--注册servlet--> <servlet> <servlet-name>SpringMVC</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!--通过初始化参数指定springmvc配置文件的位置,进行关联--> <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> <!--所有请求都会被springmvc拦截--> <servlet-mapping> <servlet-name>SpringMVC</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> </web-app>
- 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:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop https://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd"> <!--自动扫描包,让指定包下的注释生效,由IOC容器统一管理--> <context:component-scan base-package="com.wei.controller"/> <!--让springmvc不处理静态资源(.css .js .html .mp3 ……类似静态资源),默认资源过滤--> <mvc:default-servlet-handler/> <!-- 支持mvc注解驱动 spring中采用@RequestMapping注解完成映射关系 使@RequestMapping注解生效,必须向上下文中注册HandlerMapping和HandlerAdapter实例 而annotation-driven配置帮助我们自动完成上述实例的注入 --> <mvc:annotation-driven/> <!--视图解析器--> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver"> <!--前缀--> <property name="prefix" value="/WEB-INF/jsp/"/> <!--后缀--> <property name="suffix" value=".jsp"/> </bean> </beans>
- 编写控制器HelloController
package com.wei.controller; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; @Controller public class HelloController { @RequestMapping("/h1") public String hello(Model model){ //封装数据,向模型添加属性msg与值,可以在jsp页面取出、渲染 model.addAttribute("msg","Hello,SpringMVC"); //返回视图,会被视图解析器处理 return "hello"; } }
- 编写视图hello.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> ${msg} </body> </html>