【springmvc框架一文搞定】

news2024/11/23 21:13:04

SpringMVC框架

  • 1. 搭建springmvc测试项目
    • 1.1 创建maven项目
    • 1.2 导入依赖pom.xml
    • 1.3 将springmvc容器加载到tomcat中
    • 1.4 启动tomcat插件
    • 1.5 访问路径:
  • 2. 剖析启动过程
    • 2.1 启动服务器初始化过程
    • 2.2 访问路径执行过程
  • 3.spring-springmvc bean的管理
    • 3.1 因为功能不同,如何避免spring错误的加载到?
    • 3.2 spring加载与spring相关的bean
    • 3.3 springmvc加载springmvc相关的bean
    • 3.4 将springmvc与spring的bean加载到服务tomcat容器中
    • 3.5 启动tomcat插件
    • 3.6 查看打印日志
    • 3.7 当我们自己编写一个容器的时候,并且注册进去
  • 4. 请求与响应
    • 4.1 请求映射路径
    • 4.2 请求参数
    • 4.3 日期类型参数传递
    • 4.4 响应json数据

1. 搭建springmvc测试项目

1.1 创建maven项目

1.2 导入依赖pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<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/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.ypy</groupId>
    <artifactId>springmvc_01_quickstart</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>war</packaging> <!--修改为war包否者tomcat插件启动后就停止了,没有可以运行的代码-->

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>
    <dependencies>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.1.0</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>5.2.12.RELEASE</version>
        </dependency>
    </dependencies>
        <!--tomcat插件 启动项目的容器插件-->
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.tomcat.maven</groupId>
                <artifactId>tomcat7-maven-plugin</artifactId>
                <version>2.2</version>
                <configuration>
                    <port>80</port>
                    <path>/</path>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

1.3 将springmvc容器加载到tomcat中

public class ServletContainerInitConfig extends AbstractDispatcherServletInitializer {
    @Override
    protected WebApplicationContext createServletApplicationContext() {
    	// 项目使用注解配置Web应用上下文
        AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
        // 将配置类注册到上下文
        ctx.register(SpringMvcConfig.class);
        return ctx;
    }

    @Override
    // 配置拦截路径,哪些访问路径需要springmvc管理
    protected String[] getServletMappings() {
        return new String[]{"/"};
    }

    @Override
    // 配置其他容器上下文
    protected WebApplicationContext createRootApplicationContext() {
        return null;
    }
}

扫描controller进入容器

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

控制器类

@Controller
public class UserController {

    @RequestMapping("/save")
    @ResponseBody
    public String save(){
        System.out.println("user save ...");
        return "{'info':'Springmvc'}";
    }
}

1.4 启动tomcat插件

edit configurations -> 搜maven -> run: tomcat7:run --> apply. --> run (绿色三角)启动

1.5 访问路径:

http://localhost/save
返回:
在这里插入图片描述

2. 剖析启动过程

2.1 启动服务器初始化过程

  1. 服务器启动,执行ServletContainerInitConfig类,初始化web容器
  2. 执行createServletApplicationContext方法,创建了WebApplicationContext对象
  3. 加载SpringMvcConfig
  4. 执行@ComponentScan加载对应的bean
  5. 加载UserController,每个@RequestMapping的名称对应一个具体的方法
  6. 执行getServletMappings方法,定义所有的请求都通过SpringMVC
    在这里插入图片描述

2.2 访问路径执行过程

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

3.spring-springmvc bean的管理

1.springmvc会加载controller相关的bean
2. spring会加载service、dao、config等包下的bean,那么就会扫描根包下的所有子包,这样就会重复

3.1 因为功能不同,如何避免spring错误的加载到?

SpringMVC的bean–加载Spring控制的bean的时候排除掉springmvc控制的bean

方法:

  1. Spring加载的bean设定扫描范围为com.itheima,排除掉controllert包内的bean
  2. Spring加载的bean设定扫描范围为精准范围,例如service包、dao包等
  3. 不区分Spring与SpringMVC的环境,加载到同一个环境中

3.2 spring加载与spring相关的bean

@Configuration
//@ComponentScan({"com.ypy.service","com.ypy.dao"})
@ComponentScan(value = "com.ypy",
        excludeFilters = @ComponentScan.Filter(
                type = FilterType.ANNOTATION,
                classes = {Controller.class,RestController.class}
        )
)
public class SpringConfig {
}

3.3 springmvc加载springmvc相关的bean

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

3.4 将springmvc与spring的bean加载到服务tomcat容器中

public class ServletContainerInitConfig extends AbstractAnnotationConfigDispatcherServletInitializer {

    @Override
    protected Class<?>[] getRootConfigClasses() {
        System.out.println("1被调用了);
        return new Class[]{SpringConfig.class};
    }

    @Override
    protected Class<?>[] getServletConfigClasses() {
    	System.out.println("2被调用了);
        return new Class[]{SpringMvcConfig.class};
    }

    @Override
    protected String[] getServletMappings() {
       	System.out.println("3被调用了);
        return new String[]{"/"};
    }
}

或者

public class ServletContainerInitConfig extends AbstractDispatcherServletInitializer {
   // 注册springmvc容器bean
   @Override
   protected WebApplicationContext createServletApplicationContext() {
       AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
       ctx.register(SpringMvcConfig.class);
       return ctx;
   }

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

   // 注册spring的容器bean
   @Override
   protected WebApplicationContext createRootApplicationContext() {
       AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
       ctx.register(SpringConfig.class);
       return ctx;
   }
}

3.5 启动tomcat插件

同上,启动方式
edit configurations -> 搜maven -> run: tomcat7:run --> apply. --> run (绿色三角)启动

3.6 查看打印日志

[INFO] Scanning for projects...
[INFO] 
[INFO] ------------------< com.ypy:springmvc_01_quickstart >-------------------
[INFO] Building springmvc_01_quickstart 1.0-SNAPSHOT
[INFO] --------------------------------[ war ]---------------------------------
[INFO] 
[INFO] >>> tomcat7-maven-plugin:2.2:run (default-cli) > process-classes @ springmvc_01_quickstart >>>
[INFO] 
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ springmvc_01_quickstart ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] Copying 0 resource
[INFO] 
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ springmvc_01_quickstart ---
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 5 source files to D:\Application\WorkSpace\self-learn\base-learn\springmvc_01_quickstart\target\classes
[INFO] 
[INFO] <<< tomcat7-maven-plugin:2.2:run (default-cli) < process-classes @ springmvc_01_quickstart <<<
[INFO] 
[INFO] 
[INFO] --- tomcat7-maven-plugin:2.2:run (default-cli) @ springmvc_01_quickstart ---
[INFO] Running war on http://localhost:80/
[INFO] Using existing Tomcat server configuration at D:\Application\WorkSpace\self-learn\base-learn\springmvc_01_quickstart\target\tomcat
[INFO] create webapp with contextPath: 
十一月 13, 2023 9:47:44 下午 org.apache.coyote.AbstractProtocol init
信息: Initializing ProtocolHandler ["http-bio-80"]
十一月 13, 2023 9:47:44 下午 org.apache.catalina.core.StandardService startInternal
信息: Starting service Tomcat
十一月 13, 2023 9:47:44 下午 org.apache.catalina.core.StandardEngine startInternal
信息: Starting Servlet Engine: Apache Tomcat/7.0.47
十一月 13, 2023 9:47:45 下午 org.apache.catalina.core.ApplicationContext log
信息: 1 Spring WebApplicationInitializers detected on classpath
1被调用了
2被调用了
3被调用了
十一月 13, 2023 9:47:45 下午 org.apache.catalina.core.ApplicationContext log
信息: Initializing Spring root WebApplicationContext
[INFO] Root WebApplicationContext: initialization started
[INFO] Root WebApplicationContext initialized in 261 ms
[INFO] Initializing Servlet 'dispatcher'
十一月 13, 2023 9:47:45 下午 org.apache.catalina.core.ApplicationContext log
信息: Initializing Spring DispatcherServlet 'dispatcher'
[INFO] Completed initialization in 119 ms
十一月 13, 2023 9:47:45 下午 org.apache.coyote.AbstractProtocol start
信息: Starting ProtocolHandler ["http-bio-80"]
// 发送请求,打印的输出结果
user save ...

3.7 当我们自己编写一个容器的时候,并且注册进去

import com.ypy.config.SpringConfig;
import com.ypy.config.SpringMvcConfig;
import com.ypy.controller.UserController;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class App {
    public static void main(String[] args) {
    	// 创建一个internal container
        AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
        // 注册配置类
        ctx.register(SpringConfig.class, SpringMvcConfig.class);
        // 刷新容器
        ctx.refresh();
        //容器获取bean
        UserController bean = ctx.getBean(UserController.class);
        System.out.println(bean);
    }
}

// 输出结果:
com.ypy.controller.UserController@64c87930

4. 请求与响应

4.1 请求映射路径

4.2 请求参数

4.3 日期类型参数传递

4.4 响应json数据

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

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

相关文章

信号发生器为什么输出信号和配置参数对不上?

1.问题&#xff1a; 今天在调试时遇到信号发生器输出信号与我实际输入的参数不符的问题。 我原本打算输出一个中心点是2.5V然后上下偏移1.5V的信号。刚操作信号发生器的时候&#xff0c;调节到正弦波输出&#xff0c;参数部分&#xff0c;必须要输入High,Low电平。这个很不方…

苍穹外卖项目笔记(1)

前言 苍穹外卖项目笔记附代码&#xff0c;贴上 github 链接&#xff0c;持续更新中&#xff1a;GitHub - Echo0701/sky-take-out &#xff08;不知道为啥发不了项目压缩包&#xff0c;那就下次再试试吧........&#xff09; 1 软件开发整体介绍 1.1 软件开发流程 1.2 角色分…

NOIP 2017 宝藏----Java题解

目录 NOIP 2017 宝藏 题目描述 输入描述: 输出描述: 输入 输出 说明 输入 输出 说明 备注: 代码实现&#xff1a; NOIP 2017 宝藏 时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 262144K&#xff0c;其他语言524288K 64bit IO For…

基于入侵杂草算法优化概率神经网络PNN的分类预测 - 附代码

基于入侵杂草算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于入侵杂草算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于入侵杂草优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要&#xff1a;针对PNN神…

No201.精选前端面试题,享受每天的挑战和学习

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云课上架的前后端实战课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入…

JavaWeb——CSS3的使用

目录 1. CSS概述 2. CSS引入方式 3. CSS颜色显示 4. CSS选择器 4.1. 元素&#xff08;标签&#xff09;选择器 4.2. id选择器 4.3. 类选择器 4.4. 三者优先级 5. 盒子模型 1. CSS概述 CSS&#xff0c;全称为“Cascading Style Sheets”&#xff0c;中文译为“层叠样式…

pycharm pro v2023.2.4(Python编辑开发)

PyCharm2023是一款集成开发环境&#xff08;IDE&#xff09;&#xff0c;专门为Python编程语言设计。以下是PyCharm2023的一些主要功能和特点&#xff1a; 代码编辑器&#xff1a;PyCharm2023提供了一个功能强大的代码编辑器&#xff0c;支持语法高亮、自动补全、代码调试、版…

CleanMyMac4.14中文免费版mac系统管理软件

许多小伙伴使用Mac后都反馈电脑不如想象中的流畅&#xff0c;甚至有点卡顿的现象&#xff0c;原因可能是因为无用的应用占据了过多的内存&#xff0c;或者是系统盘垃圾过多&#xff0c;导致的电脑卡顿现象。 今天小编教给大家几招&#xff0c;让自己的Mac能够一键重生&#xf…

7个UI设计师都在看的高质量SVG图标素材网站分享!

之前已经给大家分享过一些图标资源及素材灵感网站&#xff0c;大家的反响是不错的&#xff0c;想着你们可能好需要来点新鲜的高质量SVG图标素材网站&#xff0c;直接就是一整套统一设计风格的图标库&#xff0c;来一个图标系列大合集&#xff0c;帮你更快更好的找到风格适配的图…

Java版B/S架构云his医院信息管理系统源码(springboot框架)

一、技术框架 ♦ 前端&#xff1a;AngularNginx ♦ 后台&#xff1a;JavaSpring&#xff0c;SpringBoot&#xff0c;SpringMVC&#xff0c;SpringSecurity&#xff0c;MyBatisPlus&#xff0c;等 ♦ 数据库&#xff1a;MySQL MyCat ♦ 缓存&#xff1a;RedisJ2Cache ♦ 消息队…

保序回归:拯救你的校准曲线(APP)

保序回归&#xff1a;拯救你的校准曲线&#xff08;APP&#xff09; 校准曲线之所以是评价模型效能的重要指标是因为&#xff0c;校准曲线衡量模型预测概率与实际发生概率之间的一致性&#xff0c;它可以帮助我们了解模型的预测结果是否可信。一个理想的模型应该能够准确地预测…

超实用的公众号排版保姆级教程,纯干货

公众号排版的重要性首先体现在能够提高阅读体验。一个好的排版可以让读者在阅读过程中感觉舒适、流畅&#xff0c;降低阅读压力。 公众号的排版风格也是品牌形象的一部分。一个专业的排版&#xff0c;不仅可以提高读者的信任度&#xff0c;也可以增强品牌的独特性。例如&#…

无需数据库服务器部署脚本,全能型开源数据库监控平台lepus

Lepus 是一款开源的数据库监控平台&#xff0c;目前已经支持 MySQL、Oracle、SQLserver、MongoDB、Redis 等数据库的基本监控和告警。 Lepus 在监控数据库时&#xff0c;无需在每台数据库服务器上部署脚本或 Agent&#xff0c;只需要在数据库中创建授权账号后&#xff0c;即可…

DM8读写分离集群安装部署_手动切换

一、安装前准备 1.1 硬件环境建议 读写分离集群安装部署前需要额外注意网络环境和磁盘 IO 配置情况&#xff0c;其他环境配置项建议请参考安装前准备工作。 1.1.1 网络环境 心跳网络对 mal 通讯系统的影响非常大&#xff0c;如果网络丢包或者延迟较大&#xff0c;则会严重影…

解决 vue3 element 表格和图片预览样式有冲突

查看表格中的预览出现样式问题冲突 <el-image:src"${realSrc}"fit"cover":style"width:${realWidth};height:${realHeight};":preview-src-list"realSrcList":append-to-body"true"><template #error><div c…

用placement label代替keep margin解决绕线问题

我正在「拾陆楼」和朋友们讨论有趣的话题&#xff0c;你⼀起来吧&#xff1f; 拾陆楼知识星球入口 通常我们用keepout margin去降低多pin cell类型的密度&#xff0c;这里提供一种替代方案&#xff0c;即使用placement label。好处是只限制多pin cell彼此间距&#xff0c;不会…

No202.精选前端面试题,享受每天的挑战和学习

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云课上架的前后端实战课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入…

【MySQL系列】 第四章 · 约束

写在前面 Hello大家好&#xff0c; 我是【麟-小白】&#xff0c;一位软件工程专业的学生&#xff0c;喜好计算机知识。希望大家能够一起学习进步呀&#xff01;本人是一名在读大学生&#xff0c;专业水平有限&#xff0c;如发现错误或不足之处&#xff0c;请多多指正&#xff0…

Django视图层()

视图层 django视图层&#xff1a;Django项目下的views.py文件&#xff0c;它的内部是一系列的函数或者是类,用来处理客户端的请求后处理并返回相应的数据 三板斧 HttpResponse # 返回字符串 render # 返回html页面&#xff0c;并且在返回浏览器之前还可以给html文件…

java springboot2.7 JSR303与Hibernate进行Bean的数据校验

我们如果对数据能进行格式校验 做个安全检查就会容易很多 其实 各个系统中都必然后拥有数据校验&#xff0c;这也不是新东西 J2EE规范中JSR303就规范定义了一组有关数据校验的API 首先 我们在 pom.xml 中 注入依赖 <dependency><groupId>javax.validation</gr…