1. SpringMVC概述与入门

news2024/12/29 10:20:10

1. SpringMVC简介

  1. SpringMVC是一种基于Java实现MVC模型的轻量级Web框架
  2. 优点
    1. 使用简单,开发便捷(相比于Servlet)
    2. 灵活性强
image-20221222170559755

2. 入门案例

2.1 实现步骤分析

1 创建web工程(Maven结构)
2 设置tomcat服务器,加载web工程(tomcat插件)
3 导入坐标(SpringMVC+Servlet)
4 定义处理请求的功能类(UserController)
5 编写SpringMVC配置类,加载处理请求的Bean。
6 加载SpringMVC配置,并设置SpringMVC请求拦截的路径

2.2 代码实现

2.2.1 创建web工程(Maven结构)

image-20221222171117507

补全java源代码目录

image-20221222171504380 image-20221222171703542

2.2.2 设置tomcat服务器,加载web工程(tomcat插件

<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>

2.2.3 导入坐标(SpringMVC+Servlet)

  1. 基于Spring主版本5.2.10.RELEASE制作
  2. 导入spring-webmvc坐标自动依赖spring相关坐标
<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.10.RELEASE</version>
    </dependency>
</dependencies>

2.2.4 定义处理请求的功能类(LoginController)

package com.zhang.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
//定义表现层控制器bean
@Controller
public class LoginController {

    //设置映射路径为/login,即外部访问路径
    @RequestMapping("/login")
    @ResponseBody //设置当前操作返回结果为指定json数据(本质上是一个字符串信息)
    public String login(){

        System.out.println("登录成功");
        return "login successfully";
    }
}

注意事项:

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

2.2.5 编写SpringMVC配置类,加载处理请求的Bean。

package com.zhang.config;


import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
//springmvc配置类,本质上还是一个spring配置类
@Configuration
@ComponentScan("com.zhang.controller")
public class SpringMvcConfig {
}

2.2.6 加载SpringMVC配置,并设置SpringMVC请求拦截的路径

定义一个类继承AbstractDispatcherServletInitializer

package com.zhang.config;


import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
import org.springframework.web.servlet.support.AbstractDispatcherServletInitializer;
//web容器配置类
public class ServletContainersInitConfig extends AbstractDispatcherServletInitializer {

   //加载springmvc配置类,产生springmvc容器(本质还是spring容器)
    protected WebApplicationContext createServletApplicationContext() {
        AnnotationConfigWebApplicationContext webApplicationContext = new AnnotationConfigWebApplicationContext();
        //加载指定配置类
        webApplicationContext.register(SpringMvcConfig.class);
        return webApplicationContext;
    }
     //设置由springmvc控制器处理的请求映射路径
    protected String[] getServletMappings() {
        return new String[]{"/"};
    }

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

运行结果

image-20221222173458063

2.3 案例注解解析

2.3.1 @Controller注解

  • 名称:@Controller
  • 类型:类注解
  • 位置:SpringMVC控制器类定义上方
  • 作用:设定SpringMVC的核心控制器bean
  • 范例
@Controller
public class UserController {
}

2.3.2 @RequestMapping注解

  • 名称:@RequestMapping
  • 类型:方法注解
  • 位置:SpringMVC控制器方法定义上方
  • 作用:设置当前控制器方法请求访问路径
  • 范例
@RequestMapping("/save")
public void save(){
    System.out.println("user save ...");
}

2.3.3 @ResponseBody注解

  • 名称:@ResponseBody
  • 类型:方法注解
  • 位置:SpringMVC控制器方法定义上方
  • 作用:设置当前控制器方法响应内容为当前返回值,无需解析
  • 范例
@RequestMapping("/save")
@ResponseBody
public String save(){
    System.out.println("user save ...");
    return "{'info':'springmvc'}";
}

2.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,使用当前方法进行,使用方式同createServletApplicationContext()
    //加载spring配置类
    protected WebApplicationContext createRootApplicationContext() {
        return null;
    }
    

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

3.1 启动服务器初始化过程

  1. 服务器启动,执行ServletContainersInitConfig类,初始化web容器
  2. 执行createServletApplicationContext方法,创建了WebApplicationContext对象
  3. 加载SpringMvcConfig配置类
  4. 执行@ComponentScan加载对应的bean
  5. 加载LoginController,每个@RequestMapping的名称对应一个具体的方法
  6. 执行getServletMappings方法,定义所有的请求都通过SpringMVC

3.2 单次请求过程

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

ing的名称对应一个具体的方法
6. 执行getServletMappings方法,定义所有的请求都通过SpringMVC

3.2 单次请求过程

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

image-20221222175401420

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

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

相关文章

Qt属性系统(Qt Property System)

Qt提供了巧妙的属性系统&#xff0c;它与某些编译器支持的属性系统相似。然而&#xff0c;作为平台和编译器无关的库&#xff0c;Qt不能够依赖于那些非标准的编译器特性&#xff0c;比如__property 或者 [property]。Qt的解决方案能够被任何Qt支持的平台下的标准C编译器支持。它…

Kafka工作流程简介

消息传递模式简介: 一个消息系统负责将数据从一个应用程序传递到另外一个应用程序中&#xff0c;应用程序只关注数据&#xff0c;无需关注数据在多个应用之间是如何传递的。 分布式消息传递基于可靠的消息队列&#xff0c;在客户端应用和消息系统之间异步传递消息。 消息传递有…

MySQL面试常问问题(日志) —— 赶快收藏

目录 1.MySQL日志文件有哪些&#xff1f;分别介绍下作用&#xff1f; 2.binlog和redo log有什么区别&#xff1f; 3.一条更新语句怎么执行的了解吗&#xff1f; 4.那为什么要两阶段提交呢&#xff1f; 5.redo log怎么刷入磁盘的知道吗&#xff1f; 1.MySQL日志文件有哪些&…

Typora配合PicGo阿里云图床配置

写博客的时候&#xff0c;刚开始直接在各大平台上直接写&#xff0c;后来还是觉得不太方便&#xff0c;需要在各大平台之间来回切换。于是就改用Typora&#xff0c;但是有个问题就是图片的处理&#xff0c;只能放在本地。想要发布到各大平台&#xff0c;就需要图床。本文结合阿…

2022年安徽最新水利水电施工安全员模拟试题及答案

百分百题库提供水利水电施工安全员考试试题、水利水电施工安全员考试预测题、水利水电施工安全员考试真题、水利水电施工安全员证考试题库等&#xff0c;提供在线做题刷题&#xff0c;在线模拟考试&#xff0c;助你考试轻松过关。 15.围堰工程可以直接判定为生产安全重大事故隐…

【UE4 第一人称射击游戏】02-玩家健康和护甲

步骤&#xff1a; 1.在“ThirdPersonCharacter”中添加两个浮点变量“Health”和“Armor” 将默认值设为1.0&#xff0c;表示默认100% 2.新建一个控件蓝图&#xff0c;命名为“FPSHUD” 打开“FPSHUD”&#xff0c;添加两个进度条&#xff0c;分别表示当前的生命值和护甲量 调…

InnoDB架构体系

2、InnoDB架构体系 2.1、内存结构 2.1.1、buffer pool InnoDB内存缓存区&#xff0c;使用空间换时间的思想&#xff0c;给数据做了一个缓存。把热点的数据存储在内存中&#xff0c;减少IO次数&#xff0c;提高效率。 show variables like %innodb_buffer_pool%;buffer pool …

基于polar码和SCMA的多用户检测的联合检测译码matlab仿真,polar采用SCAN软译码,SCMA用MPA算法

目录 1.算法描述 2.仿真效果预览 3.MATLAB核心程序 4.完整MATLAB 1.算法描述 构造的核心是通过信道极化&#xff08;channel polarization&#xff09;处理&#xff0c;在编码侧采用方法使各个子信道呈现出不同的可靠性&#xff0c;当码长持续增加时&#xff0c;部分信道将…

【C语言】初阶习题

目录 1.图案问题 2、时分秒转换 3、打印1-100之间所有3的倍数的数字 4、打印100~200之间的素数 5、给定两个数&#xff0c;求这两个数的最大公约数 6、在屏幕上输出9*9乘法口诀表 7、计算1/1-1/21/3-1/41/5 …… 1/99 - 1/100 的值&#xff0c;打印出结果 8、二分查找 …

说明DBCO-PEG-SH二苯并环辛炔-聚乙二醇-巯基科研试剂材料,DBCO-PEG-SH结构式

结构式 英文&#xff1a;DBCO-PEG-SH&#xff0c;DBCO-PEG-Thiol 中文&#xff1a;二苯并环辛炔-聚乙二醇-巯基 溶剂&#xff1a;溶于水、DMSO等常规有机溶剂 性状&#xff1a;液体/固体白色或淡黄色粉末&#xff0c;取决于分子量 用途范围&#xff1a;广泛应用于医药、生物…

一文搞懂Linux下并制作环形缓冲区

1.环形缓冲区log_buf[]又是存在内核的哪个文件呢&#xff1f; 位于/proc/kmsg里,所以除了dmesg命令查看,也可以使用cat /proc/kmsg来查看 2.但是,dmesg命令和cat /proc/kmsg有所不同 2.1 dmesg命令 每次使用,都会打印出环形缓冲区的所有信息 2.2 cat /proc/kmsg 只会打印…

项目管理中,进度计划是摆设吗?

1、忽视进度计划 项目管理中&#xff0c;有的人认为进度计划是摆设&#xff0c;不重视计划&#xff0c;只是为了满足合同工期&#xff0c;做给客户看&#xff0c;因此草率的编制进度计划。 在通过客户要求后&#xff0c;就将计划搁置在一边&#xff0c;这就导致后期在执行任务…

科班演员陶奕菱亮相海南电影节:人生没有白走的路,每一步都算数

今天的记忆是带着海水的味道………”12月18日&#xff0c;在年末岁尾之际&#xff0c;徽风皖韵熏陶下成长的新生代演员陶奕菱再次来到海南三亚&#xff0c;受邀参加第四届海南岛国际电影节&#xff0c;迫不及待地跑向沙滩面朝大海&#xff0c;感受多姿多彩的魅力三亚。 优雅端…

Java对象内存布局和对象头

对象的内存布局 在HotSpot虚拟机里&#xff0c;对象在堆内存中的存储布局可以划分为三个部分&#xff1a;对象头&#xff08;Header&#xff09;、实例数据&#xff08;Instance Data&#xff09;和对齐填充&#xff08;Padding&#xff09;。 对象头 对象头由对象标记Mark W…

进程间通信

进程间通信 进程间通信是不同进程之间的信息传输或交换。在不同的过程中&#xff0c;双方可以访问哪些媒体&#xff1f;进程的用户空间相互独立。一般来说&#xff0c;他们不能互相接触。唯一的例外是共享内存区域。此外&#xff0c;系统空间是一个“公共场所”&#xff0c;所…

【OFDM系列8】对知乎“正交频分复用(OFDM)原理灵魂9问”的理解与通俗易懂回答(慎入,含大量重要公式详细推导的万字长文)

前段时间,在知乎上看到一篇文章: 正交频分复用(OFDM)原理 文中博主提出了关于OFDM的九个问题,看了之后感觉这些问题的确深入OFDM本质,仔细思考可以很好地加深对OFDM这种较为复杂的调制方式的理解,下面谈一谈本人粗浅的一些理解和粗浅的认识,如有不准确或不恰当之处,欢…

电脑里一辈子都不想删的神仙软件

&#x1f4c2;目录&#x1f388;前言一、浏览器&#xff1a;Chrome新版Edge二、motrix-全能下载器三、压缩软件&#xff1a;WinRAR四、Quicker(更快)五、视频播放器&#xff1a;Potplayer六、listary七、清理工具&#xff1a;Dism八、199it九、PPT排版&#xff1a;iSlide十、 S…

jQuery 动画

文章目录jQuery 动画概述显示和隐藏动画show() 和 hide()toggle()淡入和淡出动画fadeIn() 和 fadeOut()fadeToggle()fadeTo()滑上和滑下动画slideUp()和slideDown()slideToggle()自定义动画简单动画jquery.color.js累积动画回调函数队列动画取消动画延迟动画jQuery 动画 概述 …

程序设计中的耦合类型

一个庞大的系统中&#xff0c;分布着许多子系统&#xff0c;子系统中包含许多包&#xff0c;包中又有数不清的类。自类往上&#xff0c;有数不清的调用关系&#xff0c;一旦两个或多个对象&#xff08;包括类、包、模块、系统等&#xff09;之间发生关系&#xff08;这里我们可…

提升 5-7 倍速,使用 Mac M1 芯片加速 Pytorch 完全指南

2022年5月&#xff0c;PyTorch官方宣布已正式支持在M1芯片版本的Mac上进行模型加速。官方对比数据显示&#xff0c;和CPU相比&#xff0c;M1上炼丹速度平均可加速7倍。 哇哦&#xff0c;不用单独配个GPU也能加速这么多&#xff0c;我迫不及待地搞到一个M1芯片的MacBook后试水了…