【SpringMVC】SpringMVC简介、过程分析、bean的加载和控制

文章目录

  • 1. SpringMVC简介
  • 2. SpringMVC入门案例
    • 文件结构
    • 第一步:坐标导入
    • 第二步:创建SpringMVC容器的控制器类
    • 第三步:初始化SpringMVC环境,设定Spring加载对应的bean
    • 第四步:初始化Servlet容器,加载SpringMVC环境,并设置SpringMVC技术请求的处理
    • 测试
    • 总结:使用到的一些注解及入门程序开发总结
  • 3. 入门案例工作流程分析
    • 启动服务器初始化过程
    • 单次请求过程
  • 4. bean的加载与控制
    • 方式一:
    • 方式二:
    • 将Spring下的bean也加载到Servlet容器中
    • 小结

1. SpringMVC简介

在这里插入图片描述
数据层框架: MyBatis
表现层框架: Servlet->SpringMVC (即SpringMVC属于一种表现层框架)
简介: SpringMVC是一种基于Java实现MVC模型的轻量级Web框架
优点:

  • 使用简单,开发便捷(相比于Servlet)
  • 灵活性强

2. SpringMVC入门案例

文件结构

在这里插入图片描述

第一步:坐标导入

pom.xml文件中添加一些依赖,这些依赖版本之间是相互联系的,如果配错或配太低都不行

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>org.example</groupId>
  <artifactId>springmvc_01_test</artifactId>
  <packaging>war</packaging>
  <version>1.0-SNAPSHOT</version>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
  </properties>

  <dependencies>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>5.2.13.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
      <version>3.1.0</version>
      <scope>provided</scope>
    </dependency>
    <dependency>
      <groupId>org.apache.tomcat</groupId>
      <artifactId>tomcat-api</artifactId>
      <version>10.1.7</version>
    </dependency>
  </dependencies>

  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.tomcat.maven</groupId>
        <artifactId>tomcat7-maven-plugin</artifactId>
        <version>2.1</version>
        <configuration>
          <port>80</port>
          <path>/</path>
        </configuration>
      </plugin>
    </plugins>
  </build>

</project>

第二步:创建SpringMVC容器的控制器类

控制器类来指定对应的访问网址什么的,@Controller标明这是一个bean,@RequestMapping指定访问路径,@ResponseBody指定返回不做任何解析和处理

package com.demo.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class UserController {

    @RequestMapping("/save")
    @ResponseBody
    public String save(){
        System.out.println("User save...");
        return "{'module': 'springmvc'}";
    }
}

第三步:初始化SpringMVC环境,设定Spring加载对应的bean

类似于Spring的配置,通过@Configuration指定为配置类,通过@ComponentScan来指定扫描的控制器范围

package com.demo.config;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

@Configuration
@ComponentScan("com.demo.controller")
public class SpringMvcConfig {
}

第四步:初始化Servlet容器,加载SpringMVC环境,并设置SpringMVC技术请求的处理

这里相当于是一些固定的写法

package com.demo.config;

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

public class ServletContainerInitConfig extends AbstractDispatcherServletInitializer {
//    加载SpringMVC容器配置
    @Override
    protected WebApplicationContext createServletApplicationContext() {
        AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
        ctx.register(SpringMvcConfig.class);
        return ctx;
    }
//    设置哪些请求归属SpringMVC处理
    @Override
    protected String[] getServletMappings() {
        return new String[]{"/"};
    }
//    加载Spring配置
    @Override
    protected WebApplicationContext createRootApplicationContext() {
        return null;
    }
}

测试

配置Run Configurations
在这里插入图片描述
然后启动,在浏览器里输入http://localhost/save可看到结果:
在这里插入图片描述

总结:使用到的一些注解及入门程序开发总结

@Controller:类注解,放在SpringMVC控制器上方,作用是设定SpringMVC的核心控制器bean
@RequestMapping:方法注解,放在SpringMVC控制器方法定义上方,作用是设置当前控制器方法的请求路径
@ResponseBody:方法注解, 放在SpringMVC控制器方法定义上方,作用是设置当前控制器方法相应内容为当前返回值,无需解析
在这里插入图片描述

3. 入门案例工作流程分析

启动服务器初始化过程

  1. 服务器启动,执行ServletContainerInitConfig类,初始化Web容器
  2. 执行createServletApplicationContext方法,创建了WebApplicationContext对象
  3. 加载SpringMVCConfig
  4. 执行@ComponentScan对应的bean
  5. 加载UserController(也就是加载扫描包下注释了@Controller的那些类),每个@RequestMapping的名称都对应一个具体的方法(注意:如图中/save->save()的映射实际上并不是放在每一个bean中管理的,而是由SpringMVC放在统一的地方进行管理的)
  6. 执行getServletMappings方法,定义所有的请求都通过SpringMVC
    在这里插入图片描述

单次请求过程

  1. 发送请求localhost/save
  2. web容器发现所有的请求都经过SpringMVC(上面的6,定义了所有的请求都经过SpringMVC),将请求交给SpringMVC处理
  3. 解析请求路径/save
  4. /save匹配执行对应的方法save()
  5. 执行save()
  6. 检测到有@ResponseBody,直接将save()方法的返回值作为响应请求体返回给请求方

4. bean的加载与控制

SpringMVC相关的bean是表现层的bean:

  • SpringMVC加载的bean对应的包均在com.xx.controller包内

Spring控制的bean:

  • 业务bean(Service)
  • 功能bean(DataSource等)
  • 方式一:Spring加载的bean设定扫描范围为com.xx,排除掉controller包内的bean
  • 方式二:Spring加载的bean设定扫描范围为精准范围,例如service, dao包等
  • 方式三:不区分Spring和SpringMVC的环境,加载到同一个环境中

方式一:

指定大的扫描类型,在其中通过excludeFilters排除掉一些东西,具体写法如下,我们需要再excludeFilters里边指定清楚过滤的规则

package com.demo.config;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.FilterType;
import org.springframework.stereotype.Controller;

@Configuration
@ComponentScan(value = "com.demo",
        excludeFilters = @ComponentScan.Filter(
            type = FilterType.ANNOTATION,
            classes = Controller.class
        )
)
public class SpringConfig {
}

执行一下测试,看能否再拿到注释了@ControllerUserController类(注意,在测试之前要注释掉SpringMvcConfig上的@Configuration):

package com.demo;

import com.demo.config.SpringConfig;
import com.demo.controller.UserController;
import com.demo.domain.User;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class App {
    public static void main(String[] args) {
        ApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);
        UserController userController = ctx.getBean(UserController.class);
        System.out.println(userController);
    }
}

执行测试代码会报错:
在这里插入图片描述
如果取消掉这个过滤规则,再执行测试代码会发现不会报错,而是会打印拿到的实例信息。通过测试说明使用excludeFilters这种方法是可以过滤包的
解释一下为什么要注释掉SpringMvcConfig上的@Configuration:因为我们在SpringConfig中扫描了com.demo下的所有包,在SpringMvcConfig上我们使用@Configuration注解了它是一个配置类,那么这个配置就会被扫描,它所包括的所有bean也会被加载进来,如果将SpringMvcConfig放到com.demo下而不注释也可以解决这个问题(老师在视频里是这么讲的,但是我自己试了一下好像把SpringMvcConfig放到com.demo下,不注释也会被加载进来,不知道是不是我的问题)

方式二:

我们使用mybatis技术来进行开发,这里的com.demo.dao是可以不写的,因为mybatis通过自动代理的技术可以扫到com.demo.dao下的bean(在Mybatis的MapperScannerConfigurer中有设置msc.setPackage("...")
但是假如我们使用JDBC的技术来进行开发,我们就必须扫描com.demo.dao下的包,否则我们就没有数据层的bean,Spring下JDBC的开发可以看一下这篇文章:Spring jdbc数据库管理,所以对于com.demo.dao的扫描还是建议写,这样通用性比较好,如果不写的话通用性就会比较差

package com.demo.config;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

@Configuration
@ComponentScan({"com.demo.service", "com.demo.dao"})
public class SpringConfig {
}

将Spring下的bean也加载到Servlet容器中

修改ServletContainersInitConfig类中的内容,加上加载Spring配置的内容:

package com.demo.config;

import com.demo.controller.SpringConfig;
import com.demo.controller.SpringMvcConfig;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
import org.springframework.web.servlet.support.AbstractDispatcherServletInitializer;

public class ServletContainerInitConfig extends AbstractDispatcherServletInitializer {
//    加载SpringMVC容器配置
    @Override
    protected WebApplicationContext createServletApplicationContext() {
        AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
        ctx.register(SpringMvcConfig.class);
        return ctx;
    }
//    设置哪些请求归属SpringMVC处理
    @Override
    protected String[] getServletMappings() {
        return new String[]{"/"};
    }
//    加载Spring配置
    @Override
    protected WebApplicationContext createRootApplicationContext() {
        AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
        ctx.register(SpringConfig.class);
        return ctx;
    }
}

在Servlet容器中加载SpringMVC和Spring配置还有一个简化的类及写法,以下是以上的简化开发:

package com.demo.config;

import com.demo.controller.SpringConfig;
import com.demo.controller.SpringMvcConfig;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
import org.springframework.web.servlet.support.AbstractDispatcherServletInitializer;

public class ServletContainerInitConfig extends AbstractAnnotationConfigDispatcherServletInitializer {
    @Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class[]{SpringConfig.class};
    }

    @Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class[]{SpringMvcConfig.class};
    }

    @Override
    protected String[] getServletMappings() {
        return new String[]{"/"};
    }
}

小结

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

PyQt6 QScrollBar滚动条控件

锋哥原创的PyQt6视频教程&#xff1a; 2024版 PyQt6 Python桌面开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 PyQt6 Python桌面开发 视频教程(无废话版) 玩命更新中~共计48条视频&#xff0c;包括&#xff1a;2024版 PyQt6 Python桌面开发 视频教程(无废话版…

实验记录:可能造成深度学习模型训练过程中准确率振荡的原因

可能造成模型训练过程中准确率振荡的原因&#xff1a; 数据集因素&#xff1a; 1.数据集中含有噪声或者样本分布不平衡&#xff0c;这会导致模型学习到一些错误的规律&#xff0c;从而引起训练准确率的震荡。 2.训练数据量过小。如果训练数据集过小&#xff0c;会导致样本不足…

Y4M视频文件格式

什么是Y4M 以YUV4Mpeg格式创建的视频文件;这个视频文件存储了一组未压缩的YCbCr图像&#xff0c;这些图像逐帧组成视频;在压缩成MPEG-2或Matroska等更流行的视频格式之前&#xff0c;用作原始的彩色视频格式 Y4M文件是一个纯文本格式的header开始&#xff0c;header有0或多个…

ARM架构简析

全局与局量等知识 断电后&#xff0c;程序以及数据都在FLASH中。 断电后&#xff0c;内存中就没有变量了。 程序在烧在FLASH中的&#xff1b; 程序运行的时候&#xff0c;全局变量的初始值&#xff0c;必然是从FLAASH中的来的&#xff1a; 初始化全局变量的过程&#xff1a;…

B01、JVM与Java体系结构-01

字节码与多语言混合编程 字节码概述&#xff1a; 我们平时说的java字节码&#xff0c;指的是用java语言编译成的字节码。准确的说任何能在jvm平台上执行的字节码格式都是一样的。所以应该统称为&#xff1a;jvm字节码。不同的编译器&#xff0c;可以编译出相同的字节码文件&…

【面试】广告优化

a1&#xff1a;点击率公式是什么&#xff1f;点击率低的原因是什么&#xff1f; 点击率点击/曝光&#xff0c;点击率低的原因主要有两点&#xff1a;一是创意不吸引人&#xff1b;二是目标受众不准确/定向过宽不精确&#xff0c;广告曝光给了对产品不感兴趣用户 a2&#xff1a;…

Google Gemini 模型本地可视化

Google近期发布了Gemini模型&#xff0c;而且开放了Gemini Pro API&#xff0c;Gemini Pro 可免费使用&#xff01; Gemini Pro支持全球180个国家的38种语言&#xff0c;目前接受文本、图片作为输入并生成文本作为输出。 Gemini Pro的表现超越了其他同类模型&#xff0c;当前版…

version `GLIBC_2.29‘ not found 的原因和怎么解决问题

程序上经常有在这台Linux上编译&#xff0c;然后放到另一个Linux上运行的情况。 如果Linux版本差别不大或都是ubuntu或centos系列还好。 如果不是一个系列很容易出现GLIBC 找不到的情况。 尤其是ubuntu上编译&#xff0c;然后放到centos系列。因为centos为了追求所谓的稳定&…

linux系统中出现大量不可中断进程和僵尸进程怎么办?

进程状态 当iowait升高时&#xff0c;进程很可能因为得不到硬件的响应&#xff0c;而长时间处于不可中断的状态&#xff0c;从ps或者top命令的输出中&#xff0c;可以发现它们都处于D状态&#xff0c;也就是不可中断状态。 通过top和ps可以查看进程的状态&#xff0c;S列表示…

20来岁,大专毕业,学软件测试可行吗?

转行软件测试找不到工作&#xff01; 转行软件测试找不到工作&#xff01; 转行软件测试找不到工作&#xff01; 重要的事情说三遍&#xff01;千万别听培训班咨询老师给你画饼 &#xff1b;我就是某某软件测试培训班出来的&#xff0c;大专&#xff0c;其他专业毕业&#x…

【数据分享】2019-2023年我国区县逐年新房房价数据(Excel/Shp格式)

房价是一个区域发展程度的重要体现&#xff0c;一个区域的房价越高通常代表这个区域越发达&#xff0c;对于人口的吸引力越大&#xff01;因此&#xff0c;房价数据是我们在各项城市研究中都非常常用的数据&#xff01;之前我们分享了2019—2023年我国区县逐月的新房房价数据&a…

实验用python实现决策树和随机森林分类

1.实验目的 1.会用Python提供的sklearn库中的决策树算法对数据进行分类 2.会用Python提供的sklearn库中的随机森林算法对数据进行分类 3.会用Python提供的方法对数据进行预处理 2.设备与环境 使用Spyder并借助Python语言进行实现 3.实验原理 决策树( Decision Tree) 又称为…

【合成数字】合成类游戏-uniapp项目开发流程详解

以前玩过2048游戏&#xff0c;从中发现规律&#xff0c;想到跟合成类游戏相似&#xff0c;知道为什么很相似吗&#xff0c;在这里&#xff0c;做一个数字合成游戏玩玩吧&#xff0c;感兴趣的话可以看看&#xff0c;这里给大家讲一讲数字合成游戏的开发过程。 文章目录 创建项目…

spring事务不生效的场景有哪些

参考文章地址 百度安全验证&#xff0c;https://www.cnblogs.com/novwind/p/17461448.html 这里讨论的是声明式事务的不生效场景。编程式事务不在此处讨论 要说明spring中哪些场景事务不生效&#xff0c;就要说明spring的事务控制是如何实现的。Spring框架中事务控制的运行原理…

磁力计LIS2MDL开发(2)----电子罗盘

磁力计LIS2MDL开发.2--电子罗盘 概述视频教学样品申请源码下载环境磁场建模消除硬铁误差软铁干扰主程序 概述 本文将介绍如何使用 LIS2MDL 传感器来读取数据来转化为指南针。 地磁场强度范围约为 23,000 至 66,000 nT &#xff0c;并且可以建模为磁偶极子&#xff0c;其场线起…

10天玩转Python第8天:python 文件和异常 全面详解与代码示例

今日内容 文件操作 普通文件的操作json 文件的操作[重点] 异常处理(程序代码运行时的报错) 文件介绍 计算机的 文件&#xff0c;就是存储在某种 长期储存设备 上的一段 数据 作用: 将数据长期保存下来&#xff0c;在需要的时候使用 ​ 1.计算机只认识 二进制(0 1) 2.文件中…

CMA、CNAS软件检测公司分享:压力测试应关注的指标和面临的问题

软件压力测试是容易被传统企业忽视的测试点&#xff0c;用户人数一旦超过预期&#xff0c;极易造成软件产品卡顿、崩溃的情况&#xff0c;不利于用户正常使用&#xff0c;严重影响企业公信力和盈利水平。今天卓码软件测评小编来聊聊压力测试过程中应该关注的指标和会面临的问题…

Mysql存储引擎-InnoDB

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱吃芝士的土豆倪&#xff0c;24届校招生Java选手&#xff0c;很高兴认识大家&#x1f4d5;系列专栏&#xff1a;Spring源码、JUC源码、Kafka原理、分布式技术原理、数据库技术&#x1f525;如果感觉博主的文章还不错的…

电商平台如何选择分账系统

电商平台尤其是多用户商城系统&#xff0c;它属于资源整合型平台&#xff0c;随着商户的入驻&#xff0c;它会面临一个问题&#xff1a;钱要分给谁、分多少、怎么分的问题&#xff0c;今天&#xff0c;商淘云小编与您分享如何选择分账系统。 第一种是银行的分账系统&#xff0c…

1850_emacs_org-download在Windows上的使用

Grey 全部学习内容汇总&#xff1a; https://github.com/greyzhang/g_org 1850_emacs_org-download在Windows上的使用 对我来说&#xff0c;使用emacs很大的一个挑战是在Windows上&#xff0c;emacs的配置会比Linux上麻烦一些。而且&#xff0c;通常来说Windows上的体验会差…