- 一、SpringMVC简介
- 二、第一个注解的SpringMVC程序
- 1. 新建maven web项目
- 2. pom.xml
- 3. 注册中央调度器
- 4. 创建SpringMVC配置文件
- 5. 创建处理器
- 6. 声明组件扫描器
- 7. 定义目标页面
- 8. 修改视图解析器的注册
- 9. 修改处理器
- 10. 主页面
- 三、使用SpringMVC框架web请求处理顺序
- 四、SpringMVC执行流程
- 1. 流程图
- 2. 执行流程简单分析
一、SpringMVC简介
SpringMVC:是基于spring的一个框架, 实际上就是spring的一个模块, 专门是做web开发的,理解是servlet的一个升级
web开发底层是servlet , 框架是在servlet基础上面加入一些功能,让你做web开发方便
SpringMVC就是一个Spring
Spring是容器,ioc能够管理对象,使用
SpringMVC能够创建对象, 放入到容器中(SpringMVC容器), springmvc容器中放的是控制器对象,我们要做的是 使用@Contorller创建控制器对象, 把对象放入到springmvc容器中, 把创建的对象作为控制器使用这个控制器对象能接收用户的请求, 显示处理结果,就当做是一个servlet使用
- 使用@Controller注解创建的是一个普通类的对象, 不是Servlet。 springmvc赋予了控制器对象一些额外的功能
web开发底层是servlet, springmvc中有一个对象是Servlet : DispatherServlet(中央调度器)
DispatherServlet: 负责接收用户的所有请求, 用户把请求给了DispatherServlet, 之后DispatherServlet把请求转发给我们的Controller对象, 最后是Controller对象处理请求
二、第一个注解的SpringMVC程序
所谓 SpringMVC 的注解式开发是指,在代码中通过对类与方法的注解,便可完成处理器在 springmvc 容器的注册。注解式开发是重点
完成功能:用户提交一个请求,服务器处理器在接收到这个请求后,给出一条欢迎信息,在响应页面中显示该信息
1. 新建maven web项目
可以看之前写的完整建项目过程
https://www.cnblogs.com/mengd/p/13436355.html
创建成功:
由于文件目录有缺少,这时哦我们自己添加必要的目录,并转换为对应的
2. pom.xml
加入Servlet依赖和SpringMVC依赖
下面是完整的pom.xml文件
4.0.0
com.md
01-hello-springmvc
1.0-SNAPSHOT
war
UTF-8
1.8
1.8
junit
junit
4.11
test
javax.servlet
javax.servlet-api
3.1.0
provided
org.springframework
spring-webmvc
5.2.5.RELEASE
3. 注册中央调度器
打开web.xml文件,默认的是这样的
由于这个版本太低了,所以需要换成这样的,可以直接复制之前写的,粘贴到这就可以了
主要内容看下面写的注释
在web.xml文件里
springmvc
org.springframework.web.servlet.DispatcherServlet
contextConfigLocation
classpath:springmvc.xml
1
springmvc
*.do
4. 创建SpringMVC配置文件
在工程的类路径即 src 目录下resources下创建 SpringMVC 的配置文件 springmvc.xml,
该文件名可以任意命名,但由于我们在注册中央调度器的指定了名字,所以这里用springmvc.xml
5. 创建处理器
在类上与方法上添加相应注解即可
@Controller:表示当前类为处理器
@RequestMapping:表示当前方法为处理器方法。该方法要对 value 属性所指定的 URI进行处理与响应。被注解的方法的方法名可以随意
在src/main/java/com.md.controller的下面建立MyController类作为处理器
package com.md.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
/**
* @author MD
* @create 2020-08-12 9:21
*/
// @Controller:创建处理器对象,放在了springmvc的容器中
@Controller
public class MyController {
// 处理用户提交的请求,springmvc中使用方法来处理
// 方法是自定义的,可以有多种返回值,多种参数,方法名称自定义
/**
* 准备使用doSome方法处理some.do的请求
* @RequestMapping:请求映射,
* 作用是把一个请求的地址和一个方法绑定在一起
* 一个请求指定一个方法处理
* 属性:
* 1. value:是一个String,就是页面的请求地址,value的值必须唯一,使用时,推荐"/"开头
*
* 位置:
* 1. 在方法的上面:使用@RequestMapping修饰的方法叫做处理器方法或者控制器方法
* 2. 在类的上面
*
*
*
* 返回值:ModelAndView
* Model:数据,请求处理完成之后,要显示给用户的数据
* View:视图,比如jsp
*/
// 还可以让多个地址执行这一个方法
// @RequestMapping(value = {"/some.do","/other.do"})
@RequestMapping(value = "/some.do")
public ModelAndView doSome(){
// 在这个方法中就可以处理some.do的请求了
// 通常这个时候该调用service了,这里就相当于service的调用完成了
// 添加数据,框架在请求的最后把数据放入到request作用域中
// 相当于request.serAttribute("msg","欢迎使用springmvc");
ModelAndView mv = new ModelAndView();
mv.addObject("msg","欢迎使用springmvc");
mv.addObject("fun","执行的是doSome方法");
// 指定视图
// 相当于请求转发
mv.setViewName("/show.jsp");
return mv;
}
}
Model 中的数据存储在 request 作用域中,SringMVC 默认采用转发的方式跳转到视图,本次请求结束,模型中的数据被销毁
6. 声明组件扫描器
在 springmvc.xml 中注册组件扫描器
7. 定义目标页面
在 webapp 目录新建一个 jsp 页面 show.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
Title
show.jsp
这些都是从request作用域获取到的数据
msg:${msg}
fun: ${fun}
这里的数据就是通过处理器转发过来获取到的数据
8. 修改视图解析器的注册
SpringMVC 框架为了避免对于请求资源路径与扩展名上的冗余,在视图解析器InternalResouceViewResolver 中引入了请求的前辍与后辍。而 ModelAndView
中只需给出要跳转页面的文件名即可,对于具体的文件路径与文件扩展名,视图解析器会自动完成拼接
在springmvc.xml中
主要注意前缀和后缀
此时把目标页面放入到/WEB-INF/view/下面
9. 修改处理器
这个时候直接写目标页面的名字即可,不用写路径和后缀
@Controller
public class MyController {
@RequestMapping(value = "/some.do")
public ModelAndView doSome(){
ModelAndView mv = new ModelAndView();
mv.addObject("msg","欢迎使用springmvc");
mv.addObject("fun","执行的是doSome方法");
// 指定视图
// 相当于请求转发
//mv.setViewName("/show.jsp");
mv.setViewName("show");
return mv;
}
}
10. 主页面
也就是index.jsp页面,
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
Title
第一个springmvc项目
此时,配置一下Tomcat这个程序就能运行了,点击 发起some.do的请求 就会跳转到show.jsp页面,并且还可以看到下面的页面
三、使用SpringMVC框架web请求处理顺序
四、SpringMVC执行流程
1. 流程图
2. 执行流程简单分析
- 浏览器提交请求到中央调度器
- 中央调度器直接将请求转给处理器映射器
- 处理器映射器会根据请求,找到处理该请求的处理器,并将其封装为处理器执行链后返回给中央调度器
- 中央调度器根据处理器执行链中的处理器,找到能够执行该处理器的处理器适配器
- 处理器适配器调用执行处理器
- 处理器将处理结果及要跳转的视图封装到一个对象 ModelAndView 中,并将其返回给处理器适配器
- 处理器适配器直接将结果返回给中央调度器
- 中央调度器调用视图解析器,将 ModelAndView 中的视图名称封装为视图对象
- 视图解析器将封装了的视图对象返回给中央调度器
- 中央调度器调用视图对象,让其自己进行渲染,即进行数据填充,形成响应对象
- 中央调度器响应浏览器