SpringMVC了解

1.springMVC概述

        Spring MVC(Model-View-Controller)是基于 Java 的 Web 应用程序框架,用于开发 Web 应用程序。它通过将应用程序分为模型(Model)、视图(View)和控制器(Controller)三个部分来帮助开发人员实现清晰的代码结构和逻辑分离。概念本质:MVC思想,分层工作模式

  模型(Model)负责封装应用程序的业务逻辑和数据   由service、dao、entityJavaBean构成
  视图(View)负责展示用户界面        由jsp、html、ftl....等组成
  控制器(Controller)负责处理用户请求、调用业务逻辑并根据结果选择合适的视图进行展示。

        早期的servlet开发,不划分模块,代码堆积在少量的不同包下,学了SpringMVC,慢慢适应对功能等按不同规则划分模块,层次。

        SpringMVC设计本质:请求作为驱动。前端控制器/DispatcherServlet(核心)接收所有请求,并根据请求的信息将请求 路由/分发 到合适的 Controller 进行处理。根据返回数据DispatcherServlet 还负责调用其他组件 处理视图解析、异常处理、拦截器等功能。

2.SpringMVC使用方式

        现在流行SpringBoot,省去很多配置,但是是开发者对 application.yml中很多技术栈的配置项也并不是特别理解。大多数是复制 他人的配置,会用但不知道使用原因。这时有时间单独对Spring、SpringMVC、Mybatis、Shiro等了解下。

        2.1SpringMVC的核心配置文件

配置SpringMVC的核心文件: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"xmlns:mvc="http://www.springframework.org/schema/mvc"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context-4.3.xsd http://www.springframework.org/schema/mvchttp://www.springframework.org/schema/mvc/spring-mvc.xsd"><!-- 通过context:component-scan元素扫描指定包下的控制器--><!-- 扫描com.xxx.xxx及子孙包下的控制器(扫描范围过大,耗时)--><context:component-scan base-package="com.xxx.controller"/><!-- ViewResolver --><bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"><!-- viewClass需要在pom中引入两个包:standard.jar and jstl.jar --><property name="viewClass"value="org.springframework.web.servlet.view.JstlView"></property>
<!--前缀-->       <property name="prefix" value="/WEB-INF/jsp/"/>
<!--后缀--><property name="suffix" value=".jsp"/></bean><!-- 省略其他配置...... -->
</beans>

总结:1.配置包扫描—Controller类所在的路径 2.配置视图解析器

2.2web项目核心文件web.xml配置

<!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>WebTest</display-name><!-- 再这里会添加一个SpringMVC的servlet配置项 --><servlet><!-- 首先指定SpringMVC核心控制器所在的位置 --><servlet-name>SpringMVC</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><!-- DispatcherServlet启动时,springmvc配置文件加载路径此参数可以不配置,默认值为:/WEB-INF/springmvc-servlet.xml可以改为加载类路径下(resources目录),加上classpath:--><init-param><param-name>contextConfigLocation</param-name><!-- <param-value>/WEB-INF/springmvc-servlet.xml</param-value> --><param-value>classpath:springmvc.xml</param-value></init-param><!--DispatcherServlet对象创建时间问题1)默认情况下,第一次访问该Servlet的创建对象,意味着在这个时间才去加载springMVC.xml2)可以改变为在项目启动时候就创建该Servlet,提高用户访问体验。<load-on-startup>1</load-on-startup>数值越大,对象创建优先级越低! (数值越低,越先创建)--><load-on-startup>1</load-on-startup><!--web.xml 3.0的新特性,是否支持异步--><!--<async-supported>true</async-supported>--></servlet><!-- 配置路由匹配规则,/ 代表匹配所有,类似于nginx的location规则 --><servlet-mapping><servlet-name>SpringMVC</servlet-name><url-pattern>/</url-pattern></servlet-mapping>
</web-app>

总结:web.xml中针对SpringMVC做了一件事。加一个servlet配置。1.指定DispatcherServlet类的全路径 2.DispatcherServlet启动时,从哪个文件中加载组件的初始化信息 3.配置了路由规则  / 拦截请求的规则 此处除了.jsp都会拦截

        2.3配置Controller类

@RestController()
@Api(tags = "Test相关操作")
@Slf4j
public class TestController {@GetMapping("/v1/test")@ApiOperation(value = "test功能描述", produces = "application/x-www-form-urlencoded")public String testProcess (final String id) {System.out.println(id);retun id;
}

发送对应请求即可—— http://localhost:8080/v1/test

梳理:

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

        一般都会将WEB应用打成war包,然后放入到Tomcat中运行,而当Tomcat启动时,首先会找到对应的WEB程序,紧接着会去加载web.xml,加载web.xml时,由于配置了DispatcherServlet,所以此时会先去加载DispatcherServlet,而加载这个类时,又会触发它的初始化方法,会调用initStrategies()方法对组件进行初始化,如下:

	/*** This implementation calls {@link #initStrategies}.*/@Overrideprotected void onRefresh(ApplicationContext context) {initStrategies(context);}/***    初始化此 servlet 使用的策略对象。*    可以在子类中重写,以便初始化进一步的策略对象*    各大组件的初始化*/protected void initStrategies(ApplicationContext context) {initMultipartResolver(context);initLocaleResolver(context);initThemeResolver(context);initHandlerMappings(context);initHandlerAdapters(context);initHandlerExceptionResolvers(context);initRequestToViewNameTranslator(context);initViewResolvers(context);initFlashMapManager(context);}

但是初始化的组件需要改东西,或者说加载一些配置信息,可由  <init-param> 中的  <param-value>classpath:springmvc.xml</param-value>,读取配置信息,对各大组件初始化。

        注意:通过配置 contextConfigLocation 参数,开发者可以灵活地指定 DispatcherServlet 的应用程序上下文配置文件,从而实现对 DispatcherServlet 的定制和配置。

3.SpringMVC工作原理

        一些常用组件介绍:主为前五点

  1. DispatcherServlet前端控制器        统一处理接收请求,响应结果。是整个流程控制的中心,由它调用其它组件处理用户的请求   程序员不需要开发
  2. HandlerMapping处理映射器      框架提供,处理器映射器会对用户的请求进行处理,处理成Handler。并将其封装为处理器执行链 返回 (HandlerExecutionChain) 给前端控制器SpringMVC提供了不同的映射器实现不同的映射方式,例如:配置文件方式,实现接口方式,注解方式等。 映射到对应、符合的Controller(处理器)   程序员不需要开发
  3. HandlerAdapter处理适配器      一个用于执行Handler处理器 的组件,将Handler处理成ModelAndView逻辑视图,并返给前端控制器。 调用具体的Controller(处理器)处理     程序员不需要开发
  4. Handler处理器       处理请求业务逻辑,在SpringMVC中会被包装成一个Handler对象。 默认为controller,其实还包括【HandlerInterceptor/拦截器、HandlerMethodReturnValueHandler /处理 Controller 方法的返回值】   等  程序员开发如controller
  5. ViewResolver视图解析器:   前端控制器会将ModelAndView交给视图解析器进行进一步解析,最终解析成视图进行渲染。比如controller方法执行完成之后,return的值是index,那么会对这个结果进行解析,将结果生成例如index.jsp这类的View视图。  程序员不需要开发
  6. View视图     ViewSpringMVC中是一个接口,实现类支持不同的类型,例如jsp、freemarker、ftl...现在一般都是前后端分离的项目,因此也很少再用到这块内容,视图。一般都成了html页面,数据结果的渲染工作也交给了前端完成    程序员开发jsp页面  

 (图为截取其他)

         观察如上流程,SpringMVC中的其他组件几乎不存在太多的耦合关系,大部分的工作都是由DispatcherServlet来调度组件完成的,因此这也是它被称为“中央控制器”的原因,DispatcherServlet本质上并不会处理用户请求,它仅仅是作为请求统一的访问点,负责请求处理时的全局流程控制。

执行流程如下:(图为截取其他)

4.为什么不用配置多数组件呢?—DispatcherServlet 的默认配置

大概解释:因为DispatcherServlet会读取属性文件——DispatcherServlet.properties 

 详细解释:以DispatcherServlet中初始化方法  initStrategies 中调用的  initHandlerMappings(context);作为案例

1.private List<HandlerMapping> handlerMappings; 没有配置就是为null,则关注getDefaultStrategies方法

 2.看图4.1

DispatcherServlet中有个静态属性  private static final String DEFAULT_STRATEGIES_PATH = "DispatcherServlet.properties";

图中  1.读取属性文件【DispatcherServlet.properties】得到      private static Properties defaultStrategies的具体值。
        2.3.通过参数strategyInterface的getName()方法 获取到全路径名  key="org.springframework.web.servlet.HandlerMapping";
        defaultStrategies.getProperty(key)得到读取的属性文件中对应的值 value。(下属第二张图4.2)
        4.创建集合 List<T>strategies,根据循环将 有value转换的String[]className解析到strategies中。(里面存的HandlerMapping类型

        5.返回集合strategies  结束。获取HandlerMapping的过程

第一张图4.1

 第一张图4.2

5.SpringMVC请求重定向和转发

  1. 请求重定向(Redirect):

    • 重定向是通过向客户端发送一个特殊的响应(HTTP 302 Found)来告诉客户端去请求另一个 URL。
    • 重定向会导致客户端发起一个新的请求,并且地址栏会显示跳转后的新 URL。
    • 重定向是一种完全的客户端行为,服务器收到请求后会返回一个重定向状态码,客户端会重新请求新的 URL。
    • Spring MVC 中,可以通过 redirect: 前缀来实现重定向,例如:return "redirect:/newUrl"
    • 原生的 Servlet 开发中,实现 response.sendRedirect("xxx.jsp")
  2. 请求转发(Forward):

    • 转发是在服务器端进行的操作,浏览器端 / 客户端  不会感知到地址的变化
    • Spring MVC 中,可以通过 forward: 前缀来实现请求转发,例如:return "forward:/newUrl"
    • 原生的 Servlet 开发中,实现request.getRequestDispatcher("xx.jsp").forward()

注意:1.对于请求转发的页面,可以是WEB-INF中页面【服务器访问】;而重定向的页面,是不能为WEB-INF 中页的。因为重定向相当于用户再次发出一次请求,而用户/浏览器是不能直接访问 WEB-INF 中资源的。【安全性高】

           2.指定的视图前添加 forward:,且此时的视图不再与视图解析器一同工作

在使用重定向和转发时,需要根据具体的需求和场景来选择合适的方式:

  • 如果需要跳转到一个完全不同的 URL 地址,或者需要避免表单重复提交等情况,通常会选择重定向。
  • 如果只是希望在服务器内部完成请求的转发,不想让客户端感知到地址的变化,通常会选择转发。

6.SpringMVC异常处理

  1. 使用 @ControllerAdvice 注解:图6.1

    • @ControllerAdvice 注解可以定义一个全局的异常处理类,用于处理 Controller 层中抛出的异常 。 【service抛出异常,controller调用了service,也能捕获处理】
    • 在这个类中,可以使用 @ExceptionHandler 注解定义多个方法,每个方法处理不同类型的异常。
    • 当 Controller 层中抛出异常时,Spring MVC 会自动寻找合适的异常处理方法,并执行该方法处理异常。
  2. 实现 HandlerExceptionResolver 接口:图6.2

    • HandlerExceptionResolver 接口是 Spring MVC 中的异常解析器,它可以用于处理所有的异常情况。
    • 实现这个接口需要重写其中的 resolveException 方法,根据具体的异常类型进行处理。
    • 在 Spring MVC 中,如果有多个异常解析器,则会按照顺序依次执行,直到找到一个能够处理异常的解析器为止。
  3. 在 Controller 层中使用 @ExceptionHandler 注解:图6.3

    • @ExceptionHandler 注解可以用于在 Controller 层中定义异常处理方法,用于处理当前 Controller 中抛出的异常。
    • 这种方式比较适合处理一些特定的异常,例如表单验证失败等。

 图6.1

图6.2 

图6.3 

9.SpringMVC的执行流程

深度剖析SpringMVC的执行流程,看完帮你立即提升一个台阶! - 知乎

10.其余参考资料:
【SSM】Spring MVC 程序开发(重点:SpringMVC 工作流程) - 知乎 (zhihu.com)

Spring MVC详解(学习总结)_springmvc技能经验描述-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/496032.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

求两个向量之间的夹角

求两个向量之间的夹角 介绍Unity的API求向量夹角Vector3.AngleVector3.SignedAngle 自定义获取方法0-360度的夹角 总结 介绍 求两个向量之间的夹角方法有很多&#xff0c;比如说Unity中的Vector3.Angle&#xff0c;Vector3.SignedAngle等方法&#xff0c;具体在什么情况下使用…

Swagger3 使用详解

Swagger3 使用详解 一、简介1 引入依赖2 开启注解3 增加一个测试接口4 启动服务报错1.5 重新启动6 打开地址&#xff1a;http://localhost:8093/swagger-ui/index.html 二、Swagger的注解1.注解Api和ApiOperation2.注解ApiModel和ApiModelProperty3.注解ApiImplicitParams和Api…

数据库管理-第156期 Oracle Vector DB AI-07(20240227)

数据库管理156期 2024-02-27 数据库管理-第156期 Oracle Vector DB & AI-07&#xff08;20240227&#xff09;1 Vector相关DDL操作可以在现有的表上新增vector数据类型的字段&#xff1a;可以删除包含vector数据类型的列&#xff1a;可以使用CTAS的方式&#xff0c;从其他有…

Mendix 10.7 发布- Go Mac It!

在我们上个月发布了硕果累累的 Mendix 10.6 MTS 之后&#xff0c;您是否还没有抚平激动的情绪&#xff1f;好吧&#xff0c;不管您是否已经准备好&#xff0c;本月将带来另一个您想知道的大亮点——Mac版Studio Pro&#xff01;但这还不是全部。本月&#xff0c;我们还将推出Re…

jenkins+kubernetes+git+dockerhub构建devops云平台

Devops简介 k8s助力Devops在企业落地实践 传统方式部署项目为什么发布慢&#xff0c;效率低&#xff1f; 上线一个功能&#xff0c;有多少时间被浪费了&#xff1f; 如何解决发布慢&#xff0c;效率低的问题呢&#xff1f; 什么是Devops&#xff1f; 敏捷开发 提高开发效率&…

【通讯录案例-tabbarController结构 Objective-C语言】

一、接下来,我们来说一下,tabbarController的View结构 1.实际上,这个tabbarController的结构呢,跟这个导航控制器的结构,差不多, 它里边儿呢,首先,有一个tabbarController的View, tabbarController,实际上,里边儿,有一个View,是专门儿来放子控制器View的, nav…

计算机网络——IPV4数字报

1. IPv4数据报的结构 本结构遵循的是RFC 791规范&#xff0c;介绍了一个IPv4数据包头部的不同字段。 1.1 IPv4头部 a. 版本&#xff08;Version&#xff09;&#xff1a;指明了IP协议的版本&#xff0c;IPv4表示为4。 b. 头部长度&#xff08;IHL, Internet Header Length&…

【六袆-Golang】Golang:安装与配置Delve进行Go语言Debug调试

安装与配置Delve进行Go语言Debug调试 一、Delve简介二、win-安装Delve三、使用Delve调试Go程序[命令行的方式]四、使用Golang调试程序 Golang开发工具系列&#xff1a;安装与配置Delve进行Go语言Debug调试 摘要&#xff1a; 开发环境中安装和配置Delve&#xff0c;一个强大的G…

算法打卡day5|哈希表篇01|Leetcode 242.有效的字母异位词 、19.删除链表的倒数第N个节点、202. 快乐数、1. 两数之和

哈希表基础知识 哈希表 哈希表关键码就是数组的索引下标&#xff0c;然后通过下标直接访问数组中的元素&#xff1b;数组就是哈希表的一种 一般哈希表都是用来快速判断一个元素是否出现集合里。例如要查询一个名字是否在班级里&#xff1a; 要枚举的话时间复杂度是O(n)&…

Leetcoder Day25| 回溯part05:子集+排列

491.递增子序列 给定一个整型数组, 你的任务是找到所有该数组的递增子序列&#xff0c;递增子序列的长度至少是2。 示例: 输入:[4, 7, 6, 7]输出: [[4, 6], [4, 7], [4, 6, 7], [6, 7], [7,7], [4,7,7]] 说明: 给定数组的长度不会超过15。数组中的整数范围是 [-100,100]。给定数…

【Python】Code2flow学习笔记

1 Code2flow介绍 Code2flow是一个代码可视化工具库&#xff0c;旨在帮助开发人员更好地理解和分析代码&#xff1a; 可以将Python代码转换为流程图&#xff0c;以直观的方式展示代码的执行流程和逻辑结构。具有简单易用、高度可定制化和美观的特点&#xff0c;适用于各种代码…

AI学习(5):PyTorch-核心模块(Autograd):自动求导

1.介绍 在深度学习中&#xff0c;自动求导是一项核心技术&#xff0c;它使得我们能够方便地计算梯度并优化模型参数。PyTorch 提供了一个强大的自动求导模块(Autograd)&#xff0c;它可以自动计算张量的导数得出梯度信息&#xff0c;同时也支持高阶导数计算。 1.1 概念词 在学…