Spring Mvc:初识SpringMvc

news2024/11/16 5:51:40

编译软件:IntelliJ IDEA 2019.2.4 x64
操作系统:win10 x64 位 家庭版
Maven版本:apache-maven-3.6.3
Mybatis版本:3.5.6
SpringMvc版本:5.3.1


文章目录

  • 一、SpringMvc是什么?
  • 二、SpringMvc是如何执行业务流程的?
  • 三、如何搭建基于SpringMvc的第一个HelloWorld
    • 3.1 搭建SpringMvc框架的步骤
    • 3.2 HelloWorld之实战


在这里插入图片描述


一、SpringMvc是什么?

①SpringMVC是Spring的一种子框架,它是Spring为【 展现层 | 表示层 | 表述层 | 控制层】提供的基于MVC设计理念的优秀的Web框架,是目前最主流的MVC框架。

什么是Mvc设计理念?

就是Mvc设计思想,即Model (业务模型),View(用户视图)与Controller(控制层)

为什么要使用Mvc设计理念?

简单来说,MVC设计理念提供了一种结构化的方式来组织应用程序的代码,使得开发人员可以更好地管理复杂性、提高开发效率,并实现可维护、可扩展和可测试的代码。

②SpringMVC是非侵入式

什么叫非侵入式?

它强调了一种开发模式 ,在使用框架的同时尽量减少对应用程序代码的依赖和修改,使得框架与应用程序之间的耦合度降低。 具体来说,在SpringMVC中,你可以编写普通的Java类作为控制器,并通过注解或配置将其标识为处理特定URL请求的方法。这种方式让您可以保持应用程序原有的结构和业务逻辑,而不需要强制按照框架的规范去改变代码的组织方式。

③SpringMVC是用来代替Servlet,在未用到SpringMvc框架之前,我们通常都是基于Servlet处理请求,做出响应。


二、SpringMvc是如何执行业务流程的?

SpringMvc执行业务的简易流程如下所示

在这里插入图片描述

  1. 用户通过浏览器向后端发出请求。
  2. DispatcherServlet是一个Servlet,它作为应用程序的入口点接收所有的请求,并负责协调整个处理流程。
  3. DispatcherServlet根据配置的处理器映射器(HandlerMapping)查询找到适合处理当前请求的处理器(控制器)。
  4. 处理器映射器根据请求的URL或其他条件将请求映射到合适的处理器。处理器可以是一个类,通常会使用注解(如@Controller)标识,也可以是实现了特定接口(如HandlerInterceptor)的类。
  5. 处理器映射器将请求做简单的封装得到处理器执行链对象(HandlerExecutionChain)返回给DispatcherServlet,该链包括处理器本身、拦截器以及其他辅助处理器。
  6. DispatcherServlet通过拦截器链调用处理器的预处理方法(preHandle),这样可以进行一些共享数据的准备工作以及对请求进行预处理。
  7. 根据处理器执行链中的处理器,DispatcherServlet查找到与之相应的处理器适配器对象HandlerAdapter。这是由于处理器的种类不只一种,不同的处理器需要不同的处理器适配器 HandlerAdapter 来执行。
  8. 找到对应的处理器适配器后,DispatcherServlet立即调用处理器适配器,让其执行处理器。
  9. 处理器适配器执行处理器后,处理器将 ModelAndView 返回给处理器适配器。
  10. 处理器适配器在接收到处理器返回的 ModelAndView 后,直接将 ModelAndView 返回给DispatcherServlet。
  11. DispatcherServlet在接收到处理器适配器发送来的 ModelAndView 后,并不是将其作为最终的调度结果,而是首先调用执行处理器执行链中的拦截器后端方法。因为DispatcherServlet将ModelAndView 对象传递给了拦截器的后端方法,使后端方法可以修改 ModelAndView。
  12. 视图解析器的工作将视图名称与响应目标定位对象进行绑定,形成视图对象返回给DispatcherServlet。
  13. 在得到相应的视图对象后,DispatcherServlet调用视图对象的渲染方法,真正对视图进行渲染。
  14. DispatcherServlet执行了收尾工作,它执行处理器执行链拦截器的afterCompletion()方法。由 afterCompletion()方法发出对请求的最终响应。
  15. 浏览器接收到响应

三、如何搭建基于SpringMvc的第一个HelloWorld

3.1 搭建SpringMvc框架的步骤

①在IDEA中创建一个Maven项目,导入相关jar包

<!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>5.3.10</version>
</dependency>

<!-- https://mvnrepository.com/artifact/org.thymeleaf/thymeleaf-spring5 -->
<dependency>
    <groupId>org.thymeleaf</groupId>
    <artifactId>thymeleaf-spring5</artifactId>
    <version>3.0.12.RELEASE</version>
</dependency>

<!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>4.0.1</version>
    <scope>provided</scope>
</dependency>

这里为何把javax.servlet-api的scope设为provided?

因为tomcat服务器中已经有了一个javax.servlet-api,若pop.xml中将javax.servlet-api这个jar包依赖范围设到Tomcat服务器中,则两个servlet的jar包会发生冲突。

在这里插入图片描述

②编写配置文件

  • 在web.xml中注册DispatcherServlet

    • ur配置:/
      • init-param:contextConfigLocation,设置springmvc,xml配置文件路径【管理容器对象】
      • <load-on-startup>:设置DispatcherServlet优先级【启动服务器时,创建当前Servleti对象】
  • 在springmvc.xml实现以下功能

    • 开启组件扫描
    • 配置视图解析器【解析视图(设置视图前缀&后缀】

③编写请求处理器【Controller | Handler】

  • 使用@Controlleri注解标识请求处理器
  • 使用@RequestMapping注解标识处理方法【URL】

在这里插入图片描述

④准备页面进行以测试

3.2 HelloWorld之实战

①准备

新建一个Maven工程,在其上搭建web工程环境,工程结构如下所示

在这里插入图片描述

②在Maven工程中的pop.xml中导入相关jar包

<!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>5.3.10</version>
</dependency>

<!-- https://mvnrepository.com/artifact/org.thymeleaf/thymeleaf-spring5 -->
<dependency>
    <groupId>org.thymeleaf</groupId>
    <artifactId>thymeleaf-spring5</artifactId>
    <version>3.0.12.RELEASE</version>
</dependency>

<!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>4.0.1</version>
    <scope>provided</scope>
</dependency>

③在spring的配置文件中【springmvc.xml】中开启组件扫描和配置视图解析器

<!--  开启组件扫描  -->
<context:component-scan base-package="spring"></context:component-scan>

<!-- 配置视图解析器【解析视图(设置视图前怨后缀)】 -->
<!--  配置视图解析器  -->
<bean id="thymeleafViewResolver" class="org.thymeleaf.spring5.view.ThymeleafViewResolver">
    <!--鹿置字符集属性 -->
    <property name="characterEncoding" value="UTF-8"></property>
    <!--鹿置模板引擎厨性-->
    <property name="templateEngine">
        <!--鹿置内bean-->
        <bean class="org.thymeleaf.spring5.SpringTemplateEngine">
            <!--鹿置馍块的解析器雨性-->
            <property name="templateResolver">
                <!--     配置内部bean       -->
                <bean class="org.thymeleaf.spring5.templateresolver.SpringResourceTemplateResolver">
                    <!--  配置前缀        -->
                    <property name="prefix" value="/WEB-INF/pages/"></property>
                    <!--   配置后缀       -->
                    <property name="suffix" value=".html"></property>
                    <!--   配置字符集                     -->
                    <property name="characterEncoding" value="UTF-8"></property>
                </bean>
            </property>
        </bean>
    </property>
</bean>

④在web.xml中注册DispatcherServlet【前端控制器】

<!-- 注册 Dispatcherservlet【前满控制器】-->
<servlet>
    <servlet-name>dispatcherServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:springmvc.xml</param-value>
    </init-param>

    <!--  设置DispatcherServlet优先级      -->
    <!--   启动服务器时,创建当前Servleti对象     -->
    <load-on-startup>1</load-on-startup>

</servlet>
<servlet-mapping>
    <servlet-name>dispatcherServlet</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

⑤从当前工程下/src/main/spring/Controller下新建一个类HelloController,作为请求处理器,使用@Controlleri注解标识它为请求处理器,并且使用@RequestMapping注解标识处理方法【URL】

在这里插入图片描述

@Controller
//标识此类为请求处理器
public class HelloController {

    //配置url【/】  映射到wEB-INF/index.html
    @RequestMapping("/")
    public String toIndex(){
        //WEB-INF/pages/index.html
        //物理视图名=视图前餐+逻辑视图名+视图后缀
        return "index";
    }

    /**
     * 配置url【/HelloControllerMethod】,浏览器中的请求会基于该url,找到并进入下面的方法
     */
    @RequestMapping("/HelloControllerMethod")
    public String HelloControllerMethod(){
        System.out.println("--->请求已经进入到HelloControllerMethod方法中");
        //默认是转发请求
        return "success";
    }
}

⑥编写相关前端页面【index.html & success.html】

<!-- index.html -->
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>首页</h1>
<a th:href="@{/HelloControllerMethod}">发送请求</a>
</body>
</html>
<!-- success.html -->
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>转发成功,到达成功页面</title>
</head>
<body>
<h1>成功页面</h1>
</body>
</html>

⑦开启Tomcat服务器,运行测试

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


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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

OpenGL入门教程——PT1

由于自己不是计算机图形学出身&#xff0c;所以采纳了一些教材、博客、GPT的综合答案&#xff0c;尽可能作为一篇认识图形学&#xff0c;学会OpenGL简单函数库的博客&#xff01;多多包涵 我会从最基础的显示相关知识逐步导入OpenGL 一、屏幕是如何工作的&#xff0c;为什么电…

Apache Doris 0.15.3升级至1.1.5避坑实用总结

概述&#xff1a; ​ Apache Doris 从0.15到1.1.5属于一个大版本升级&#xff0c;部分语法和使用方式也发生了较大的变化&#xff0c;本文除前期兼容性调研&#xff08;可以通过官网查到到一部分兼容性问题&#xff09;已知问题外&#xff0c;生产环境正式升级之后遇到的突发问…

【Web 安全】刚开始学渗透,零基础怎么入门?

上周旁听了一个大学学长组织的线上网络安全交流会&#xff0c;里边不乏充斥着各位行业大牛&#xff0c;讲的内容确实精彩&#xff0c;可能对于网络安全经验 5 年的人来说&#xff0c;是受益匪浅&#xff0c;欢迎程度极高&#xff0c;恨不得跳出屏幕来表示赞同&#xff0c;毕竟很…

2022年06月份青少年软件编程Scratch图形化等级考试试卷三级真题(含答案)

2022-06 Scratch三级真题 分数&#xff1a;100 题数&#xff1a;38 测试时长&#xff1a;60min 一、单选题(共25题&#xff0c;共50分) 1.点击绿旗&#xff0c;舞台上的角色会说出&#xff1f;&#xff08; &#xff09;(2分) A. 2022年5月1日 B. 1日5月2022年 C. 2022…

【2023最全教程】性能测试基础知识学习路线(建议收藏)

本文介绍一下性能测试的基础内容和一些学习经验&#xff0c;主要讲针对服务器端的性能测试。其他代码级性能测试、前端性能测试等属于比较细分的领域&#xff0c;建议大家有需要的时候针对性得去学。而对于服务器端的性能测试&#xff0c;即使是不做性能测试的人&#xff0c;最…

如何利用GIS数据转换器-栅格 实现去云

GIS数据转换器-栅格不仅能够实现数据转换、数据分割、数据。还可以实现简单去云。 首先打开一副LANDSAT的数据 然后查看云的值范围&#xff0c;值大约为&#xff1a;20000-45000之间 然后在数据转换器中设置设置&#xff0c;过滤范围 点转换按钮进行转换,这样云位置的像素就被…

SpringBoot教学资料3-SpringBoot启动常见问题

java.lang.RuntimeException: java.lang.RuntimeException: org.codehaus.plexus.component.repository.exc Maven版本过高 &#xff0c;与你使用的IDEA版本不兼容。 推荐版本&#xff1a;maven3.6(建议)/maven3.9 控制台Process terminated https://blog.csdn.net/weixin_4458…

SMALE周报_20230707

目录标题 1. 上周回顾2. 本周计划3. 完成情况3.1. 背景3.2. 不确定性类别3.3. 具体方法3.3.1. Aleatoric Uncertainty3.3.1. Epistemic Uncertainty 4. 存在的主要问题5. 下一步工作 1. 上周回顾 这周开始写周报&#xff0c;此项为空。 2. 本周计划 总结不确定性在神经网络中…

96、基于STM32单片机的温湿度DHT11 烟雾火灾报警器蓝牙物联网APP远程控制设计(程序+原理图+任务书+参考论文+开题报告+流程图+元器件清单等)

单片机及温湿度、烟雾传感器是烟雾报警器系统的两大核心。单片机好比一个桥梁&#xff0c;联系着传感器和报警电路设备。近几年来&#xff0c;单片机已逐步深入应用到工农业生产各部门及人们生活的各个方面。各种类型的单片机也根据社会的需求而开发出来。单片机是器件级计算机…

试题小结2

1.内部类和子类的区别 内部类是指在一个外部类的内部再定义一个类&#xff0c;内部类对外部类有访问权限&#xff0c;可以访问类中定义的所有变量和方法。 子类是从父类中继承的类&#xff0c;子类可以访问父类所有public和protected的属性和方法。 Java语言有四个权限访问修…

Android11 Settings菜单加载

一、加载默认亮度 1、top_level_settings.xml 2、AndroidManifest.xml 3、DisplaySettings ①getPreferenceScreenResId ②buildPreferenceControllers 4、display_settings.xml 5、AutoBrightnessPreferenceController 6、BrightnessLevelPreferenceController ①getCurren…

全网最细,Pytest自动化测试-重复执行用例 pytest-repeat(实战)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 平常在做功能测试…

应对Python爬虫IP被封的策略及建议。

我们在进行数据抓取使用代理ip的时候需要有一些约束规定&#xff0c;才能保证我们持续稳定的抓取数据。 大概整理了一下&#xff0c;需要注意以下几点&#xff0c;仅供参考&#xff1a; 1、使用高质量的代理服务器&#xff1a;选择一些可靠的代理服务器&#xff0c;确保它们的…

从歌手李玟的自杀传闻,看骑行健身对心理健康的深远影响

从歌手李玟的自杀传闻&#xff0c;看骑行健身对心理健康的深远影响 最近&#xff0c;歌手李玟的自杀传闻让大众一片哗然。这个消息无疑成为了各大平台的热点话题。然而&#xff0c;作为骑友&#xff0c;我们今天再次谈谈骑行健身的重要性。 首先&#xff0c;我们要明确一点&…

性能测试如何做?性能测试实战从0-1进阶(内涵面试题+答案)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 性能测试实战 - 部…

checkout

git-checkout - Switch branches or restore working tree files# 用index或者指定commit中的版本,来更新工作区中的文件 # 切换分支 Updates files in the working tree to match the version in the index or the specified tree. If no pathspec was given,git checkout wil…

SonarQube扫描常见Bug、漏洞修复整理(持续更新中)

目录 DMS1、A "NullPointerException" could be thrown; "sra" is nullable here.2、Cast one of the operands of this multiplication operation to a "long"3、Call "remove()" on "requestContainer".4、Use try-with-r…

echarts条形图 动态 设置标签背景和柱状图渐变颜色

<!--Description: 横向渐变柱状图 --> <template><div ref"horizontal" class"w-full h-full"></div> </template><script> import * as echarts from echarts export default {components: {},props: [data],data() …

c++11 标准模板(STL)(std::basic_ostream)(八)

定义于头文件 <ostream> template< class CharT, class Traits std::char_traits<CharT> > class basic_ostream : virtual public std::basic_ios<CharT, Traits> 类模板 basic_ostream 提供字符流上的高层输出操作。受支持操作包含有格式…

kubernetes 节点排水维护 cordon, drain, uncordon

1.这三个命令是正式release的1.2新加入的命令&#xff0c;三个命令一起介绍&#xff0c;是因为三个命令配合使用可以实现节点的维护。在1.2之前&#xff0c;因为没有相应的命令支持&#xff0c;如果要维护一个节点&#xff0c;只能stop该节点上的kubelet将该节点退出集群&#…