广告
返回顶部
首页 > 资讯 > 后端开发 > JAVA >Spring MVC详解(学习总结)
  • 915
分享到

Spring MVC详解(学习总结)

mvcspring学习SpringMVC 2023-08-16 21:08:19 915人浏览 安东尼
摘要

一、Sprig MVC简介1.1介绍1.2MVC是什么 二、Spring MVC实现原理2.1核心组件2.2工作流程 三、第一个Spring MVC四、常用注解五、参数绑定5.1URL风格参数绑定5.2RESTful风格

文章是看楠哥的视频做的总结,自己还查阅了一些资料,文章也加了自己的总结,这篇博客可以帮助大家入门,还有一些知识大家如果用到的话可以到时候再去学习一下,我写这篇主要是为了方便后面复习。
在这里插入图片描述

一、Sprig mvc简介

1.1介绍

spring MVC是Spring Framework提供的WEB组件,全称是Spring Web MVC,是目前主流的实现MVC设计模式框架,提供前端路由映射、视图解析等功能

Java web开发者必须要掌握的技术框架

1.2MVC是什么

MVC是一种软件架构思想,把软件按照模型,视图,控制器来划分
Model:模型层,指工程中的JavaBean,用来处理数据
JavaBean分成两类:

  • 一类称为实体类Bean:专门用来存储业务数据,比如Student,User
  • 一类称为业务处理Bean:指Servlet或Dao对象,专门用来处理业务逻辑和数据访问
    View:视图层,指工程中的html,jsp等页面,作用是和用户进行交互,展示数据
    Controler:控制层,指工程中的Servlet,作用是接收请求和响应浏览器
  • 流程:
    • 用户通过视图层发送请求到服务器,在服务器中请求被Controller接收
    • Controller调用相应的Model层处理请求,处理完毕后结果返回到Controller
    • Controller再根据请求处理的结果找到对应的View视图,渲染数据后最终响应给浏览器
      在这里插入图片描述
      Spring MVC对这套MVC流程进行封装,帮助开发者屏蔽底层细节,并且开放出相关接口供开发者调用,让MVC开发更简单方便
      在这里插入图片描述

在这里插入图片描述

二、Spring MVC实现原理

2.1核心组件

  • DispatcherServlet:前置控制器,负责调度其他组件的执行,可以降低不同组件之间的耦合性,是整个Spring MVC的核心模块
  • Handler:处理器,完成具体的业务逻辑,相当于Servlet
  • HandlerMapping:DispatcherServlet是通过 HandlerMapping把请求映射到不同的Handler
  • HandlerInterceptor:处理器拦截器,是一个接口,如果我们需要进行一些拦截处理,可以通过实现该接口完成
  • HandlerExecutionChain:处理器执行链,包括两部分内容:Handler和HandlerInterceptor(系统会有一个默认的HandlerInterceptor,如果有额外拦截处理,可以添加拦截器进行设置)
  • HandlerAdapter:处理器适配器,Handler执行业务方法之前,需要进行一系列的操作包括表单的数据验证、数据类型转换、把表单数据封装到POJO等,这些一系列的操作都是由HandlerAdapter完成,DispatcherServlet通过HandlerAdapter执行不同的Handler
  • ModelAndView:封装了模型数据和视图信息,作为Handler的处理结果,返回给DispatcherServlet
  • ViewResolver:视图解析器,DispatcherServlet通过它把逻辑视图解析为物理视图,最终把渲染的结果响应给客户端

2.2工作流程

  1. 客户端请求被DispatcherServlet接收
  2. 根据HandlerMapping映射到Handler
  3. 生成Handler和HandlerInterceptor
  4. Handler和HandlerInterceptor以HandlerExecutionChain的形式一并返回给DispatcherServlet
  5. DispatcherServlet通过HandlerAdapter调用Handler的方法完成业务逻辑处理
  6. 返回一个ModelAndView对象给DispatcherServlet
  7. DispatcherServlet把获取的ModelAndView对象传给ViewResolver视图解析器,把逻辑视图解析成物理视图
  8. ViewResolver返回一个View进行视图渲染(把模型填充到视图中)
  9. DispatcherServlet把渲染后的视图响应给客户端
    在这里插入图片描述

三、第一个Spring MVC

  1. 创建Maven改成工程,pom.xml加入Spring MVC的依赖在这里插入图片描述在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    pom.xml
  4.0.0  org.example  springMVC  1.0-SNAPSHOT  war  SpringMVC Maven Webapp    Http://www.example.com      UTF-8    1.8    1.8              junit      junit      4.11      test              org.springframework      spring-webmvc      5.3.19      
             org.springframework            spring-webmvc            5.3.19        
  1. 在web.xml中配置Spring MVC的DispatcherServlet
    首先在项目中创建java和resources的目录
    在这里插入图片描述
    在resources目录中添加springmvc.xml

然后在web.xml 配置Spring MVC的DispatcherServlet

  Archetype Created Web Application dispatcherServletorg.springframework.web.servlet.DispatcherServletcontextConfigLocationclasspath:springmvc.xml1dispatcherServlet            System.out.println("接收到了请求");        //返回逻辑视图 逻辑视图相当于视图的别名 通过这个找到物理视图,也就是真正的视图        //这里返回的只是页面的名称,不是完整的页面访问路径        return "index";    }}

@Controller注解是为了让Spring ioc容器初始化时自动扫描到该Controller类;@RequestMapping是为了映射请求路径,这里因为类与方法上都有映射所以访问时应该是/;方法返回的结果是视图的名称index,该名称不是完整页面路径,最终会经过视图解析器解析为完整页面路径并跳转。
配置Tomcat
在这里插入图片描述
在这里插入图片描述
5. 测试
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
流程梳理

  1. DispatcherServlet接收到URL请求index,结合@RequestMapping(“/index”)注解把该请求交给index业务方法进行处理
  2. 执行index业务方法,控制台打印日志,并且返回"index"字符串(逻辑视图).
  3. 结合springmvc.xml中的视图解析器配置,找到目标资源:/index.jsp,即根目录下的index.jsp文件,把该JSP资源返回给客户端完成响应。

Spring MVC搭建成功

在这里插入图片描述

四、常用注解

@RequestMapping

Spring MVC通过@RequestMapping注解把URL请求和业务方法进行映射,在控制器的类定义处以及方法定义处都可以添加@RequestMapping,在类定义处添加相当于多了一层访问路径
在这里插入图片描述
@RequestMapping常用参数

  • value:指定URL请求的实际地址,是@RequestMapping的默认值
    在这里插入图片描述
  • method:指定请求的method类型,包括GET、POST、PUT、DELETE等
   @RequestMapping(value = "/index",method = RequestMethod.POST)    public String index(){        System.out.println("接收到了请求");        //返回逻辑视图 逻辑视图相当于视图的别名 通过这个找到物理视图,也就是真正的视图        //注意:这里返回的只是页面名称,不是完整的页面访问路径        return "index";    }

上述代码表示只有POST请求可以访问该方法,如果使用其他请求访问的话,直接抛出异常,比如GET请求
在这里插入图片描述

  • params:指定request请求中必须包含的参数值,如果不包含的话,就无法调用该方法
    在这里插入图片描述

五、参数绑定

在这里插入图片描述

5.1URL风格参数绑定

params是对URL请求参数进行限制,不满足条件的URL无法访问该方法,需要在业务方法中获取URL的参数值。

  1. 在业务方法定义时声明参数列表
  2. 给参数列表添加@RequestParam注解进行绑定

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
Spring MVC可以自动完成数据类型转换,该工作是由HandlerAdapter来完成的

5.2RESTful风格的URL参数获取

  • 传统的URL:localhost:8080/hello/index?id=1&name=tom
  • RESTful URL:localhost:8080/hello/index/1/tom
 @RequestMapping("/restful/{id}/{name}")    public String restful(@PathVariable("id") Integer num, @PathVariable("name") String name){        System.out.println(num+"-"+name);        return "index";    }

在这里插入图片描述

5.3映射Cookie

  @RequestMapping("/cookie")    public String getCookie(@CookieValue("JSESSIONID") String sessionId){        System.out.println(sessionId);        return "index";    }

在这里插入图片描述

5.4使用POJO绑定参数

Spring MVC会根据请求参数名和POJO属性名进行匹配,自动为该对象填充属性值,并且支持属性级联
首先创建实体类
在这里插入图片描述
为了方便测试,写一个addUser.jsp页面

<%--  Created by IntelliJ IDEA.  User: 17614  Date: 2022-07-04  Time: 21:01  To change this template use File | Settings | File Templates.--%><%@ page contentType="text/html;charset=UTF-8" language="java" %>    Title
编号:
姓名:

然后在Handler中,编写相关方法
在这里插入图片描述

启动Tomcat服务器
在这里插入图片描述

结果发现出现乱码问题
在这里插入图片描述
为了解决这个问题,我们只需要在web.xml配置文件中配置过滤器就可以了

      encodingFilter    org.springframework.web.filter.CharacterEncodingFilter          encoding      UTF-8            encodingFilter    @Controller@RequestMapping("/course")public class CourseController {    @Autowired    private CourseRepository courseRepository;    @GetMapping("/findAll")    public ModelAndView findAll() {        ModelAndView modelAndView = new ModelAndView();        modelAndView.setViewName("courseList");        modelAndView.addObject("list", courseRepository.findAll());        return modelAndView;    }    @DeleteMapping("/deleteById/{id}")    public String deleteById(@PathVariable("id") Integer id){        courseRepository.deleteById(id);        return "redirect:/course/findAll";    }    @PostMapping("/save")    public String save(Course course) {        courseRepository.saveOrUpdate(course);                return "redirect:/course/findAll";    }    @GetMapping("/findById/{id}")    public ModelAndView findById(@PathVariable("id") Integer id) {        ModelAndView modelAndView = new ModelAndView();        modelAndView.setViewName("edit");        modelAndView.addObject("courser", courseRepository.findById(id));        return modelAndView;    }    @PutMapping("/update")    public String update(Course course){        courseRepository.saveOrUpdate(course);        return "redirect:/course/findAll";    }}

JSP
courseList.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %><%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %><%@page isELIgnored="false" %>    Title                    
编号: 名称: 价格: 操作:
${course.id} ${course.name} ${course.price}
修改

save.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>    Title
课程编号:
课程名称:
课程价格:

edit.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %><%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %><%@page isELIgnored="false" %>    Title    
课程编号:
课程名称:
课程价格:

在这里插入图片描述
点击删除
在这里插入图片描述
点击修改
在这里插入图片描述
在这里插入图片描述
点提交
在这里插入图片描述

十、文件的上传下载

10.1文件上传

10.1.1单文件上传

底层使用的是Apache fileupload 组件完成上传功能,Spring MVC只是对其进行了封装,简化开发,pom.xml

       commons-io      commons-io      2.8.0              commons-fileupload      commons-fileupload      1.4    

springmvc.xml
为了把二进制数据解析成对象

    

JSP页面

  • input的type属性设置为file
  • fORM表单的method设置为post
  • form表单的enctype设置为multipart/form-data
    在这里插入图片描述
    在这里插入图片描述
<%@ page contentType="text/html;charset=UTF-8" language="java" %><%@page isELIgnored="false" %>    Title    
@Component@RequestMapping("/file")public class FileHandler {        @PostMapping("/upload")    public String upload(@RequestParam("img") MultipartFile img, httpservletRequest request){        if (img.getSize()>0){            String path = request.getSession().getServletContext().getRealPath("file");            String filename = img.getOriginalFilename();            File descFile=new File(path, filename);            try {                img.transferTo(descFile);                request.setAttribute("src", "/file/"+filename);            } catch (IOException e) {                e.printStackTrace();            }        }        return "upload";    }}

在这里插入图片描述
然后选择文件
在这里插入图片描述
提交
在这里插入图片描述

10.1.2多文件上传

<%@ page contentType="text/html;charset=UTF-8" language="java" %><%@page isELIgnored="false" %><%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>    多文件上传    
file1:
file2:
file3:
  @PostMapping("/uploads")    public String uploads(@RequestParam("imgs") MultipartFile[] imgs,HttpServletRequest request){        List pathList=new ArrayList<>();        for (MultipartFile img:imgs){            if (img.getSize()>0){                String path = request.getSession().getServletContext().getRealPath("file");                String filename = img.getOriginalFilename();                File descFile=new File(path, filename);                try {                    img.transferTo(descFile);                    pathList.add("/file/"+filename);                } catch (IOException e) {                    e.printStackTrace();                }            }        }        request.setAttribute("pathList", pathList);        return "uploads";    }

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

10.2文件下载

JSP页面通过超链接点击进行下载

<%@ page contentType="text/html;charset=UTF-8" language="java" %>    文件下载    皮卡丘.jpg    柯南.png    springmvc.png

Handler

      @GetMapping("/download")    public void download(String fileName,                         HttpServletRequest request,                         HttpServletResponse response) {        if (fileName!=null){            String path = request.getSession().getServletContext().getRealPath("file");            File file=new File(path,fileName);            OutputStream out=null;            if (file.exists()){                //设置下载文件                response.setContentType("applicationContext/force-download");                //设置文件名                response.setHeader("Context-Disposition", "attachment;filename="+fileName);                try {                    out=response.getOutputStream();                    out.write(FileUtils.readFileToByteArray(file));                    out.flush();                } catch (IOException e) {                    e.printStackTrace();                }finally {                    if (out!=null){                        try {out.close();                        } catch (IOException e) {e.printStackTrace();                        }                    }                }            }        }    }

在这里插入图片描述

十一、拦截器

11.1过滤器、监听器、拦截器的对比

  • Servlet:处理Reequest请求和Response响应
  • 过滤器(Filter):对Request请求起到过滤作用,作用在Servlet之前,如果配置为 @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("目标Handler执行前执行MyInterceptor---->preHandle方法..."); return true; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System.out.println("目标Handler执行后,视图执行前执行MyInterceptor---->postHandle方法..."); } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { System.out.println("目标Handler执行后,视图执行后执行MyInterceptor---->afterCompletion方法..."); }}

    拦截器配置1

                                 

    拦截器配置方式2

                                                  preHandle方法...");        return true;    }        @Override    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {        System.out.println("3.目标Handler执行后,视图执行前执行MyInterceptor2---->postHandle方法...");    }        @Override    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {        System.out.println("5.目标Handler执行后,视图执行后执行MyInterceptor2---->afterCompletion方法...");    }}

    Handler

    @RequestMapping("/hello")@Controllerpublic class HelloContro      @RequestMapping("/packageType")    @ResponseBody    public String packageType(@RequestParam(value = "id", required = true) Integer id) {        System.out.println("拦截的方法...");        return "id=" + id;    }}

    在这里插入图片描述
    在这里插入图片描述

    来源地址:https://blog.csdn.net/qq_52797170/article/details/125591705

--结束END--

本文标题: Spring MVC详解(学习总结)

本文链接: https://www.lsjlt.com/news/372149.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Spring MVC详解(学习总结)
    一、Sprig MVC简介1.1介绍1.2MVC是什么 二、Spring MVC实现原理2.1核心组件2.2工作流程 三、第一个Spring MVC四、常用注解五、参数绑定5.1URL风格参数绑定5.2RESTful风格...
    99+
    2023-08-16
    mvc spring 学习 Spring MVC
  • Spring全面详解(学习总结)
    Spring FrameWork一、 前言二、IOC(控制反转)2.1 对于IOC的理解2.2如何使用IOC2.3配置文件的解读2.4IOC容器创建bean的两种方式2.5从IOC容器中取bean2.6bean的属性如...
    99+
    2023-08-16
    spring java IOC AOP
  • Spring-全面详解(学习总结)
    目录一、Spring介绍简介特点、主要特点为什么要学?二、IOC(依赖注入)Spring 容器IOC 和 bean介绍控制反转:容器概述:bean介绍AOP总结一、Spring介绍 ...
    99+
    2022-11-12
  • spring框架学习总结
    目录Spring 框架概述Spring优点Spring体系结构Spring拓展Spring Boot与Spring CloudSpring IoC 容器 (IoC 也称为依赖项注入(...
    99+
    2022-11-12
  • Mongodb学习总结
    Mongodb相关操作总结 2020/4/2 Mongodb使用的是类似与json字符串的形式存储数据 [ { key:value }, { key:value }, ] Mongodb使用了不存在的对...
    99+
    2019-08-19
    Mongodb学习总结
  • mysqlimport学习总结
    原文链接: https://www.modb.pro/db/23208xy 摘要:mysqlimport是MySQL数据库提供的一个命令行程序,可用于数据导入。...
    99+
    2022-10-18
  • WorkFlow学习总结
     最近在工作中要实现一种“流程审批”的功能,查阅资料得知,workFlow技术可以满足我的需求,于是就开始沉下心来好好学习一下这门技术。总结的学习资料也拿出来和大家共享一下。  什么是工作流: 工作流...
    99+
    2023-06-05
  • Spring MVC详解
    文章目录 一、SpringMVC1.1 引言1.2 MVC架构1.2.1 概念1.2.2 好处 二、开发流程2.1 导入依赖2.2 配置核心(前端)控制器2.3 后端控制器2.4 配置文件2.5 访问 三、...
    99+
    2023-08-30
    spring mvc java
  • Spring MVC 详解 (Spring Boot)
    Spring MVC 详解 - Spring Boot 一、什么是 Spring MVC1.1 MVC 定义1.2 MVC 和 Spring MVC 的关系1.3 学习目的 二、Spring MVC 创建和连接2.1 创建 Sp...
    99+
    2023-12-22
    spring mvc spring boot java 后端
  • python 学习总结5
    字符串类型及操作 一、字符串类型的表示   (1)字符串:由0个或多个字符组成的有序字符序列     例如:“请输入带有符号的温度值” 或者‘c’都是字符串   (2)字符串是字符的有序序列,可以对其中的字符进行索引     例如:“请”...
    99+
    2023-01-30
    python
  • BGP学习 总结3
      BGP DECISION PROCESS 1 largest weight ( local orininated path :32768 other 0 ) 2 largest local-preefernce (BGP default...
    99+
    2023-01-31
    BGP
  • 函数学习总结
    定义 自己总结:就相当于现实中各种用途的工具,有着对数据进行各种处理的功能(实质就是比较复杂的变量?!) 分类  自定义函数和Python语言已经定义过的常用的内置函数 自定义函数的组成部分 def 函数名(参数1,参数2...): '...
    99+
    2023-01-31
    函数
  • Python学习总结__Day1
    一、Python是一门什么类型语言 1、解释型:一边编译一边执行,劣势是运行速度慢,但通过运用PyPy交互解释器(JIT技术)会让python程序执行速度快很多。优势是可移植性强。 2、强类型:即类型安全类型。除非通过强制转换,否则变量类...
    99+
    2023-01-31
    Python
  • python学习总结-----pytho
    一、python简介    python 是一种面向对象、解释性的脚本语言,遵循 GPL 协议。语法简单、社区强大、丰富的库支持。又被称为“胶水语言”。能把其他语言(主要C/C++)写的模块很轻松的结合在一起。二、python 安装 win...
    99+
    2023-01-31
    python pytho
  • mysql学习总结(一)
        作为一名小白,今天开始上传自己的学习总结。 ...
    99+
    2016-11-21
    mysql学习总结(一)
  • python 学习总结2
    温度转换问题 一、温度转换   目前有两种表示温度的方法一种是摄氏度另一种是华氏度,摄氏度的结冰点为0度,沸点为100度将温度等分刻画,华氏度的结冰点为32度,沸点为212度将温度进行等刻度划分。   现需要将按格式输入的摄氏度转换为华氏...
    99+
    2023-01-30
    python
  • python 学习总结1
    计算机与程序设计 一、计算机的概念   1.计算机是根据指令操作数据的设备。   2.计算机主要包括两个功能性一个是功能性另一个是计算性   功能性是对数据的操作,表现为数据计算,输入输出处理和结果存储   可编程性是根据一系列指令自动的...
    99+
    2023-01-30
    python
  • python 学习总结4
    数字类型及操作 一、整数类型   (1)python中的整数与数学中的概念是一致的,可以正也可以负,没有取值范围。        pow(x,y)函数是计算x的y次幂,想计算多大就多大。   (2)在整数类型中有四种进制形式      十...
    99+
    2023-01-30
    python
  • python 学习总结3
    Python蟒蛇绘制 一、实现程序如下 1 import turtle 2 turtle.setup (650, 350, 200, 200)#turtle的绘图窗体turtle.setup(width, height, start...
    99+
    2023-01-30
    python
  • Spring框架学习常用注解汇总
    目录类注解方法或属性上注解参数注解类注解 @component 标注类,泛指各种组件,类不属于各种分类的时候,用它做标注。 @Service 标注类,声明该类为业务层组件,用于处理业...
    99+
    2022-11-12
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作