SpringMVC-1-解密Spring MVC:构建优雅、灵活的Web应用的秘诀

news2025/1/23 7:26:11

今日目标

能够编写SpringMVC入门案例

了解SpringMVC原理

1. SpringMVC介绍

1.1 SpringMVC概述

思考:SpringMVC框架有什么优点?

  1. SpringMVC是一种基于Java实现MVC模型的轻量级Web框架

  2. 优点

使用简单,开发便捷(相比于Servlet)

天然的与Spring框架集成(如IOC容器、AOP等)

请求处理简化:支持用户请求数据自动映射封装

响应处理简化:自动转换为json数据输出

2 入门案例【重点】

思考:在Controller中如何定义访问路径,如何响应数据?

2.1 实现步骤

1 创建web工程(Maven结构)
2 导入坐标(SpringMVC+Servlet)
3 SpringMVCConfig 配置类 配置前缀”/pages/”和后缀”.jsp”
4 ServletConfig 配置类创建IOC容器和拦截请求路径”/”
5 自定义控制器类(StudentController)
6 开发视图页面/pages/success.jsp

2.2 代码实现

【第一步】创建web工程(Maven结构)

【第二步】导入坐标(SpringMVC+Servlet)

<dependencies> 
  <!--spring-webmvc-->  
  <dependency> 
    <groupId>org.springframework</groupId>  
    <artifactId>spring-webmvc</artifactId>  
    <version>5.3.15</version> 
  </dependency>  
  <!--servlet-->  
  <dependency> 
    <groupId>javax.servlet</groupId>  
    <artifactId>javax.servlet-api</artifactId>  
    <version>4.0.1</version>  
    <scope>provided</scope> 
  </dependency> 
</dependencies> 

注意事项:

  1. 课程版本基于Spring主版本5.3.15制作

  2. 导入spring-webmvc坐标自动依赖spring相关坐标

【第三步】SpringMVCConfig 配置类 配置前缀”/pages/”和后缀”.jsp”

完整的配置代码

package com.zbbmeta.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.view.InternalResourceViewResolver;

/**
 * SpringMVC配置类
 */
@Configuration //1.标识当前是配置类 指定这个类为配置类,替代application.xml
@ComponentScan("com.zbbmeta")//2.配置扫描web层包 代替<context:component-scan base-package="com.zbbmeta" />
public class SpringMvcConfig {
    //3.配置视图解析器,配置视图前缀与后缀
    @Bean
    public InternalResourceViewResolver internalResourceViewResolver(){
        InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
        viewResolver.setPrefix("/pages/");//配置前缀
        viewResolver.setSuffix(".jsp");//配置后缀
        return viewResolver;
    }
}

【第四步】创建ServletConfig 配置类创建IOC容器和拦截请求路径”/”

package com.zbbmeta.config;

import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
import org.springframework.web.servlet.support.AbstractDispatcherServletInitializer;

/**
 * tomcat启动时调用会调用当前类AbstractDispatcherServletInitializer实现的方法
 */
public class ServletConfig extends AbstractDispatcherServletInitializer {

    //在tomcat启动时调用,用于创建springmvc框架的IOC容器对象
    //加载springmvc配置类,产生springmvc容器(本质还是spring容器)
    @Override
    protected WebApplicationContext createServletApplicationContext() {
        //初始化WebApplicationContext对象
        AnnotationConfigWebApplicationContext ac = new AnnotationConfigWebApplicationContext();
        //加载指定配置类
        ac.register(SpringMvcConfig.class);
        return ac;
    }
    // 指定SpringMVC要处理哪些请求, /表示SpringMVC处理项目中的所有请求, 静态资源不要让SpringMVC处理,要放行
    //设置DispatcherServlet绑定处理请求的路径"/",处理除了jsp的所有资源请求
    @Override
    protected String[] getServletMappings() {
        return new String[]{"/"};
    }
    //加载spring的配置类
    @Override
    protected WebApplicationContext createRootApplicationContext() {
        return null;
    }
}

【第五步】自定义控制器类(StudentController)

@Controller
public class StudentController {
    @RequestMapping("/save")
    public String save(Model model){
        model.addAttribute("info","欢迎学习SpringMVC");
        return "success";
    }
}

注意事项

对于SpringMVC而言,Controller方法返回值默认表示要跳转的页面,没有对应的页面就会报错。如果不想跳转页面而是响应数据,那么就需要在方法上使用@ResponseBody注解。

【第六步】开发视图页面/pages/success.jsp

<%--
  Created by IntelliJ IDEA.
  User: zbb
  Date: 0011
  Time: 23:56
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>hello</title>
</head>
<body>
    ${info}
</body>
</html>

运行结果

启动项目需要在Idea中集成项目,不清楚怎么集成的可以去查看之前的文章

web-4-理解Tomcat中的HTTP请求和Servlet响应处理机制

2.3 案例注解和类解析

2.3.1 @Controller注解

  • 名称:@Controller

  • 类型:类注解

  • 位置:SpringMVC控制器类定义上方

  • 作用:设定SpringMVC的核心控制器bean

  • 范例

@Controller
public class StudentController {
}

2.3.2 @RequestMapping注解

  • 名称:@RequestMapping

  • 类型:方法注解

  • 位置:SpringMVC控制器方法定义上方

  • 作用:设置当前控制器方法请求访问路径

  • 范例

@RequestMapping("/save")
public String save(Model model){
    model.addAttribute("info","欢迎学习SpringMVC");
    return "success";
}

注意:其实@RequestMapping注解还可以写到类上面,表示类下面的所有方法前面都会有该地址

2.3.3 @ResponseBody注解

  • 名称:@ResponseBody

  • 类型:方法注解

  • 位置:SpringMVC控制器方法定义上方

  • 作用:设置当前控制器方法响应内容为当前返回值,无需解析

  • 范例

@RequestMapping("/save")
@ResponseBody
public String save(){
    System.out.println("user save ...");
    return "success";
}

思考:如果在方法上添加了该注解,会和例子结果有什么区别?

2.4.4 AbstractDispatcherServletInitializer类

  • AbstractDispatcherServletInitializer类是SpringMVC提供的快速初始化Web3.0容器的抽象类

  • AbstractDispatcherServletInitializer提供三个接口方法供用户实现

    • createServletApplicationContext()方法,创建Servlet容器时,加载SpringMVC对应的bean并放入WebApplicationContext对象范围中,而WebApplicationContext的作用范围为ServletContext范围,即整个web容器范围。

//加载springmvc配置类,产生springmvc容器(本质还是spring容器)
protected WebApplicationContext createServletApplicationContext() {
    AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
    ctx.register(SpringMvcConfig.class);
    return ctx;
}
  • getServletMappings()方法,设定SpringMVC对应的请求映射路径,设置为/表示拦截所有请求,任意请求都将转入到SpringMVC进行处理。

//设置由springmvc控制器处理的请求映射路径
protected String[] getServletMappings() {
    return new String[]{"/"};
}
  • createRootApplicationContext()方法,如果创建Servlet容器时需要加载非SpringMVC对应的bean,即加载Spring容器中业务bean,使用这个方法进行,使用方式同createServletApplicationContext()

//加载spring配置类
protected WebApplicationContext createRootApplicationContext() {
    return null;
}

3 入门案例工作流程分析【理解】

思考:在上面的时候我们配置类ServletConfig,没有做任何注解,那么为什么,SpringMVC项目启动的时候就能识别他? 这个类又是谁调用的?

3.1 Tomcat启动调用ServletConfig流程

在SpringMVC中,有两个应用上下文:RootApplicationContext、WebApplicationContext。

  • WebApplicationContext是DispatcherServlet专属的上下文(可以理解为是SpringMVC容器),用来加载Controller、ViewResolver、HandlerMapping等web相关的Bean。

  • RootApplicationContext(可以理解为是Spring容器)则是加载数据库、Service业务层等中间件中的Bean。其中,WebApplicationContext继承了RootApplicationContext中的所有Bean,以便在@Controller中注入@Service等依赖。WebApplicationContext是子容器可以使用父容器中的对象

  • 在 Servlet 3.0 环境下,Servlet 容器会在 classpath 下搜索实现了 javax.servlet.ServletContainerInitializer 接口的任何类,找到之后用它来初始化 Servlet 容器。

  • Spring 实现了以上接口,实现类叫做 SpringServletContainerInitializer, 它会依次搜寻实现了 WebApplicationInitializer接口的任何类,并委派这个类实现配置。

  • 而AbstractDispatcherServletInitializer的父类则实现了WebApplicationInitializer接口。

  • AbstractDispatcherServletInitializer提供三个接口方法供用户实现

    1.createServletApplicationContext()方法,创建Servlet容器时,加载SpringMVC对应的bean并放入WebApplicationContext对象范围中

    2.而WebApplicationContext的作用范围为ServletContext范围,即整个web容器范围

3.2 Tomcat启动配置创建Servlet和IOC容器流程

代码逻辑分析

  • 1.【源代码分析】服务器启动运行,创建IOC容器

  • 2.【源代码分析】创建DispatcherServlet运行构造函数

  • 3.【源代码分析】将IOC容器存储到ServletContext中

3.3 启动服务器初始化过程

  1. 服务器启动,执行ServletConfigInitializer类,初始化web容器

  2. 执行createServletApplicationContext方法,创建了WebApplicationContext对象

  3. 加载SpringMvcConfig配置类

  4. 执行@ComponentScan加载对应的bean

  5. 加载UserController,每个@RequestMapping的名称对应一个具体的方法

  6. 执行getServletMappings方法,定义所有的请求都通过SpringMVC

3.4 springmvc执行流程(面试题)

SpringMVC执行流程:一个核心控制器和三大组件

  • DispatcherServlet:前端控制器,是整体流程控制的中心,由其调用其它组件处理用户的请求,有效的降低了组件间的耦合性

  • RequestMappingHandlerMapping :处理器映射器,负责根据用户请求路径找到对应Controller控制器方法

  • RequestMappingHandlerAdapter :处理器适配器,执行Controller控制器的方法

  • InternalResourceViewResolver :视图解析器,根据Controller控制器方法返回值解析找到展现数据的jsp页面输出数据展现

3.5 Servlet容器初始化的简化格式

Spring 3.2 开始引入一个简易的 WebApplicationInitializer 实现类,这就是 AbstractAnnotationConfigDispatcherServletInitializer。

package com.zbbmeta.config;

import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;

/**
 * Servlet容器初始化的配置类
 * AbstractAnnotationConfigDispatcherServletInitializer 专门针对注解的配置编写的抽象类
 */
public class ServletAnnotationConfig  extends AbstractAnnotationConfigDispatcherServletInitializer {
    // 暂时不管,整合Spring才需要
    @Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class[0];
    }
    //在tomcat启动时调用,用于创建springmvc框架的IOC容器对象
    //加载springmvc配置类, Tomcat会拿这个配置类去创建IoC容器,产生springmvc容器(本质还是spring容器)
    @Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class[] {SpringMvcConfig.class};
    }
    // 指定SpringMVC要处理哪些请求, /表示SpringMVC处理项目中的所有请求, 静态资源不要让SpringMVC处理,要放行
    //设置DispatcherServlet绑定处理请求的路径"/",处理除了jsp的所有资源请求
    @Override
    protected String[] getServletMappings() {
        return new String[] {"/"};
    }
}

注意:ServletAnnotationConfig和ServletConfig二者留其一

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

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

相关文章

Java进阶篇--迭代器模式

目录 同步迭代器&#xff08;Synchronous Iterator&#xff09;&#xff1a; Iterator 接口 常用方法&#xff1a; 注意&#xff1a; 扩展小知识: 异步迭代器&#xff08;Asynchronous Iterator&#xff09;&#xff1a; 常用的方法 注意&#xff1a; 总结&#xff1a…

【S32K 进阶之旅】S32K 芯片的解锁

在使用 S32K1xx MCU 的过程中&#xff0c;因为某些不当操作导致芯片被锁、加密的情况偶有发生&#xff0c;在此总结一篇如何解锁芯片的文档&#xff0c;希望能够帮到有需要的人。 1. S32K 芯片被锁的现象及原因分析1&#xff09;在S32K 系列 MCU 开发和生产过程中&#xff…

【Unity细节】Unity中的层级LayerMask

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! 本文由 秩沅 原创 &#x1f636;‍&#x1f32b;️收录于专栏&#xff1a;unity细节和bug &#x1f636;‍&#x1f32b;️优质专栏 ⭐【…

元宇宙是什么?有哪些应用方向?一文了解元宇宙虚拟展厅

引言&#xff1a; 在当今数字科技飞速发展的时代&#xff0c;元宇宙作为一个令人向往的概念正逐渐进入大众的视野。那么&#xff0c;什么是元宇宙&#xff1f;元宇宙又有哪些应用方向呢&#xff1f;元宇宙虚拟展厅又有哪些优势呢&#xff1f; 一&#xff0e;元宇宙是什么 元宇…

eNSP 打开警告:请将eNSP相关应用程序添加到windows firewall的允许程序列表,并允许其在公用网络上运行!

文章目录 1 警告截图2 解决办法 1 警告截图 2 解决办法 思路&#xff1a;按照警告的提示信息&#xff0c;将 eNSP 相关应用添加到 windows firewall&#xff08;防火墙&#xff09;的允许程序列表&#xff0c;并允许其在公用网络上运行&#xff01;此处以 Win 10 为例

怎么把人物抠到一个视频里?这个视频抠像方法一看就会

在视频中&#xff0c;人物抠像可以用于创建有趣的视觉效果&#xff0c;例如将人物放置在不同的场景中&#xff0c;或者创建动画效果。此外&#xff0c;它还可以用于制作特效&#xff0c;例如将人物的外观更改为其他形象&#xff0c;或者在人物移动时添加轨迹效果。那么怎么把人…

Eclipse常见的使用技巧(快捷键)大全

常用设置&#xff0c;非常建议 1.代码提示设置 2.快捷键设置 代码编写技巧 注意&#xff1a; 如果你设置了代码提示&#xff0c;那么下面操作快捷方式回车即可生成&#xff0c;不必alt/ 换行 ShiftEnter回车&#xff0c;不管光标在哪里都会换行&#xff01;非常好用&…

向日葵如何截图

场景 向日葵远程时&#xff0c;有时需要截图&#xff0c;但是客户电脑上没有qq、微信等软件提供快捷截图。 怎么办呢? 解决方案 其实向日葵肯定支持这些功能的。 设置 | 热键设置 | 勾选 远控其他设备时&#xff0c;可输入热键进行以下操作。 如果&#xff1a; altq 切换…

性能测试-并发用户数估算(超细整理)

前言 并发用户数&#xff1a;是指现实系统中操作业务的用户&#xff0c;在性能测试工具中&#xff0c;一般称为虚拟用户数(Virutal User)。 并发用户数和注册用户数、在线用户数的概念不同。 并发用户数一定会对服务器产生压力的&#xff1b; 而在线用户数只是 ”挂” 在系统…

一万字关于java数据结构堆的讲解,让你从入门到精通

目录 java类和接口总览 队列(Queue) 1. 概念 2. 队列的使用 以下是一些常用的队列操作&#xff1a; 1.入队操作 2.出队操作 3.判断队列是否为空 4.获取队列大小 5.其它 优先级队列(堆) 1. 优先级队列概念 Java中的PriorityQueue具有以下特点 2.常用的PriorityQue…

Doris的执行计划生成、分发与执行

目录 一、执行计划的生成 二、执行计划的分发 三、执行计划的执行 一、执行计划的生成 在Doris的FE端&#xff0c;与大多数数据库系统一样&#xff0c;要从SQL或某种http请求&#xff0c;生成执行计划&#xff0c;从SQL生成&#xff0c;一开始是“抽象语法树”&#xff08;…

FreeRTOS 从入门到精通-任务调度

初写FreeRTOS 从入门到精通系列文章之初&#xff0c;笔者只是当作可以随时回顾的学习笔记来写&#xff0c;并没有想到这些偏技术的文章收获了意料之外的阅读量和关注。首先当然很欣喜自己的文章能够得到了读者们的认可&#xff0c;但同时也有种使命感&#xff0c;既期望启迪并与…

模型评估的常用指标

模型评估的指标 模型是在大量的数据集上训练而来的,无论一个模型是从零训练的还是基于某一个模型,通过微调方法得到的,靠人工评价模型的效果都是异常困难的。那么要想客观的、自动化的评价一个LLM模型,就需要能够选择正确评估模型效果的指标或者基准测试,来客观和自动化的…

C语言刷题指南(二)

&#x1f4d9;作者简介&#xff1a; 清水加冰&#xff0c;目前大二在读&#xff0c;正在学习C/C、Python、操作系统、数据库等。 &#x1f4d8;相关专栏&#xff1a;C语言初阶、C语言进阶、C语言刷题训练营、数据结构刷题训练营、有感兴趣的可以看一看。 欢迎点赞 &#x1f44d…

腾讯开启2024校招,主要招聘5大类岗位

近日&#xff0c;腾讯的大动作一个接一个&#xff0c;前脚刚公布2023上半年财报&#xff0c;后脚就开启了2024校招&#xff0c;不得不让人感叹腾讯真速度&#xff01; 此次招聘对象为毕业时间在2023年9月至2024年8月期间的2024届应届毕业生&#xff0c;覆盖北上广深等多个城市…

Python中定时任务APScheduler库用法详解

在日常工作中&#xff0c;常常会用到需要周期性执行的任务&#xff0c;一种方式是采用 Linux 系统自带的 crond 结合命令行实现。另外一种方式是直接使用Python。 当每隔一段时间就要执行一段程序&#xff0c;或者往复循环执行某一个任务&#xff0c;这就需要使用定时任务来执…

如何搭建游戏服务器?有哪些操作步骤

​  选择游戏服务器提供商 为确保游戏服务器的稳定运行和及时响应问题&#xff0c;选择一个正规、靠谱的游戏服务器提供商非常重要。 选择服务器操作系统 根据不同游戏的需求&#xff0c;选择适合的操作系统&#xff0c;通常可选择Linux或WindowsServer操作系统。 上传、安装…

智安网络|零信任安全框架:保障数字化时代网络安全的最佳实践

随着数字化时代的快速发展&#xff0c;网络安全问题变得越来越突出。传统的安全防御模式已经不再适用于现代复杂的网络环境中。为了应对日益增长的网络威胁&#xff0c;零信任安全模式应运而生。 一、什么是零信任&#xff1f; 零信任是一种安全框架和哲学&#xff0c;它基于…

【使用教程】在Ubuntu下运行CANopen通信PMM伺服电机使用教程(NimServoSDK_V2.0.0)

本教程将指导您在Ubuntu操作系统下使用NimServoSDK_V2.0.0来运行CANopen通信的PMM系列一体化伺服电机。我们将介绍必要的步骤和命令&#xff0c;以确保您能够成功地配置和控制PMM系列一体化伺服电机。 NimServoSDK_V2.0.0是一款用于PMM一体化伺服电机的软件开发工具包。它提供了…

第八章LVS中的DR模式详解

1&#xff0c;LVS-DR数据包的流向分析 总结&#xff1a; &#xff08;1&#xff09;客户端发送请求到 Director Server&#xff08;负载均衡器&#xff09;&#xff0c;请求的数据报文&#xff08;源 IP 是 CIP,目标 IP 是 VIP&#xff09;到达内核空间。 &#xff08;2&#…