一、SpringMVC基本说明
SpringMVC是基于Spring的,它是Spring的一个模块,用来做web开发的。
SpringMVC叫做Spring Web MVC,通过Spring的核心技术,采用MVC(Model View Controller)架构,做Web开发。
SpringMVC 是一个容器,管理对象的,使用IOC核心技术,SpringMVC管理界面层中的控制器对象;SpringMVC底层也是Servlet,以Servlet为核心,接收请求,处理请求,显示处理结果给用户。
二、SpringMVC中的核心组件
核心组件 | 组件描述 |
---|---|
DispatcherServlet | 中央调度器(也叫前端控制器):负责调度其他组件的执行,可降低不同组件之间的耦合性,是整个 Spring MVC 的核心模块;其实就是一个Servlet对象。 |
Handler | 处理器:handler相当于是平常业务代码中每个请求对应的的controller类以及方法信息 |
HandlerMapping | 映射关系:提供根据url 查询Handler的服务;根据url查询到Controller,由DispatcherServlet 调用 |
HandlerInterceptor | 处理器拦截器:是一个接口,拦截的是请求地址,可以针对请求地址做一些验证、预处理等操作 |
HandlerExecutionChain | 处理器执行链:包括两部分内容,即 Handler 和 HandlerInterceptor(系统会有一个默认的 HandlerInterceptor,如果需要额外拦截处理,可以添加拦截器设置) |
HandlerAdapter | 处理器适配器:HandlerAdapter是一种适配器,对于某种类型的Handler,都有一种对应的Adapter,用来完成对Handler的调用(数据类型的转换、将表单数据封装到 POJO 等操作) |
ModelAndView | 数据结果:装载了模型数据和视图信息,作为 Handler 的处理结果,返回给 DispatcherServlet。model负责参数,view就是视图 |
ViewResolver | 视图解析器:DispatcherServlet 通过它将逻辑视图解析成物理视图,最终将渲染结果响应给客户端。 |
三、SpringMVC执行流程
1 | 浏览器提交请求(http://localhost:8080/SpringMVC01/some.do)到DispatcherServlet(中央调度器) |
2 | DispatcherServlet(中央调度器)直接将请求转给 HandlerMapping(处理器映射器) |
3 | HandlerMapping(处理器映射器)会根据请求,找到处理该请求的Handler(处理器),并将其封装为HandlerExecutionChain(处理器执行链)返回给 DispatcherServlet(中央调度器) |
4 | DispatcherServlet(中央调度器)根据HandlerExecutionChain(处理器执行链)中的Handler(处理器),找到能够执行该Handler(处理器)的HandlerAdapter(处理器适配器) |
5 | HandlerAdapter(处理器适配器)执行Handler(处理器) |
6 | Handler(处理器)将处理结果及要跳转的视图封装到对象ModelAndView 中,并将其返回给HandlerAdapter(处理器适配器) |
7 | HandlerAdapter(处理器适配器)直接将结果返回给DispatcherServlet(中央调度器) |
8 | DispatcherServlet(中央调度器)调用ViewResolver(视图解析器),将ModelAndView中的视图名称封装为视图对象 |
9 | ViewResolver(视图解析器)将封装的视图对象返回给DispatcherServlet(中央调度器) |
10 | DispatcherServlet(中央调度器)调用视图对象,让其自己进行渲染,形成响应对象 |
11 | DispatcherServlet(中央调度器)响应浏览器 |
四、简单注解的SpringMVC项目
简述:项目只有Controller层,做简单演示,无数据库连接,业务处理等操作。
1、项目目录结构
2、新建Maven Web 项目
3、pom依赖
<dependencies>
<!--SpringMVC-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.5.RELEASE</version>
</dependency>
<!--Servlet-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
</dependency>
<!--Junit-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
</dependencies>
4、Spring MVC 配置文件
SpringMVC.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: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 https://www.springframework.org/schema/context/spring-context.xsd">
<!--SpringMVC的配置文件-->
<!--声明注解组件扫描器-->
<context:component-scan base-package="com.dgs" />
<!--声明视图解析器,帮助处理视图-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!--前缀-->
<property name="prefix" value="/WEB-INF/view/" />
<!--后缀-->
<property name="suffix" value=".jsp" />
</bean>
</beans>
5、DispatcherServlet
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4"
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<!--声明SpringMVC的核心对象DispatcherServlet-->
<servlet>
<servlet-name>SpringMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<!--
DispatcherServlet继承的类FrameworkServlet中有个contextConfigLocation属性
作用:用于设置 SpringMVC 配置文件的路径及文件名
默认:<servlet-name>标签里面的值 加 -servlet.xml:/WEB-INF/SpringMVC-servlet.xml
-->
<param-name>contextConfigLocation</param-name>
<param-value>classpath:SpringMVC.xml</param-value>
</init-param>
<!--
表示服务器tomcat创建对象的顺序,是个整数值,大于等于0;数值越小,创建对象的时间越早
作用:标记是否在 Web 服务器(这里是 Tomcat)启动时会创建这个 Servlet 实例,即是否在 Web 服务器启动时调用执行该 Servlet 的 init()方法,而不是在真正访问时才创建
-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>SpringMVC</servlet-name>
<!--url-pattern 作用:把一些请求交给指定的Servlet处理,可以写为 / -->
<url-pattern>*.do</url-pattern>
</servlet-mapping>
</web-app>
六、Controller
MyController.java
package com.dgs.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
/*
* @Controller:创建控制器(处理器)对象
* 控制器:后端控制器,自定义的类处理请求
* */
@Controller
public class MyController {
/*
* @RequestMapping:请求映射
* 属性:value 请求中的url地址,唯一值,以“/”开头
* 位置:1、在方法的上面(必须的) 2、在类的上面(可选)
* 作用:把指定的请求,交给指定的方法处理,等同于url-pattern
* */
@RequestMapping(value = "/some.do")
public ModelAndView doSome(ModelAndView model){
//存放数据
model.addObject("msg","1111");
model.addObject("fun","2222");
//要返回的前端界面
model.setViewName("show");
return model;
}
/**
* 当框架调用完doSome()方法后,得到返回中ModelAndView
* 框架会在后续的处理逻辑值,处理mv多选里面的数据和视图
* 对数据执行request.setAttribute("msg","处理了some.do请求");把数据放入到request作用域
* */
}
七、前端界面
show.jsp
<%--
Created by IntelliJ IDEA.
User: 15015
Date: 2022/5/27
Time: 11:21
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
${msg}
${fun}
</body>
</html>