1. SpringMVC 简介

news2024/11/17 22:45:27

文章目录

  • 1. SpringMVC 概述
  • 2. SpringMVC 入门案例
    • 2.1 入门案例
    • 2.2 入门案例工作流程
  • 3. bean 加载控制
  • 4. PostMan 工具

1. SpringMVC 概述

SpringMVC 与 Servlet 功能等同,均属于 Web 层开发技术。SpringMVC 是 Spring 框架的一部分。

对于 SpringMVC,主要学习如下内容:

  • SpringMVC 简介
  • 请求与响应
  • REST 风格
  • SSM 整合(注解版)
  • 拦截器

SpringMVC 是处于 Web 层的框架,所以其主要的作用就是用来接收前端发过来的请求和数据然后进行处理,并将处理的结果响应给前端,所以如何处理请求和响应是 SpringMVC 中非常重要的一块内容。

REST 是一种软件架构风格,可以降低开发的复杂性,提高系统的可伸缩性,后期的应用也是非常广泛。

SSM 整合是把咱们所学习的 SpringMVC+Spring+Mybatis 整合在一起来完成业务开发,是对三个框架的综合应用。

对于 SpringMVC 的学习,最终要达成的目标:
(1) 掌握基于 SpringMVC 获取请求参数和响应 json 数据操作。
(2) 熟练应用基于 REST 风格的请求路径设置与参数传递。
(3) 能够根据实际业务建立前后端开发通信协议并进行实现。
(4) 基于 SSM 整合技术开发任意业务模块功能。

学习 SpringMVC 前,先回顾一下现在 web 程序是如何做的。现在的 web 程序大都基于三层架构来实现:

在这里插入图片描述

如上图,Web 程序通过浏览器访问页面,前端页面使用异步提交的方式发送请求到后端服务器,后端服务器采用三层架构——表现层、业务层、数据层进行开发。页面发送的请求由表现层接收,获取用户的请求参数后,将参数传递给业务层,再由业务层访问数据层,得到用户需要访问的数据后,将数据返回给表现层。表现层拿到数据后,将数据转换成 json 格式发送给前端页面,前端页面接收数据后,解析数据并组织成用户最终浏览的页面信息交给浏览器。

在这里插入图片描述

初学时,数据层采用的是 jdbc 技术,后来 Mybatis 框架将其取代;表现层采用的是 servlet 技术,现在将要学习的 SpringMVC 框架可以将其取代。

介绍了这么多,对 SpringMVC 进行一个定义:

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

优点:使用简单、开发便捷(相比于Servlet);灵活性强。

2. SpringMVC 入门案例

2.1 入门案例

在这里插入图片描述

(1) 创建项目

创建 Maven 项目。

在这里插入图片描述
补全目录结构,因为使用骨架创建的项目结构不完整,需要手动补全。

在这里插入图片描述
(2) 导入依赖

<?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/maven-v4_0_0.xsd">

  <modelVersion>4.0.0</modelVersion>
  <packaging>war</packaging>

  <name>springmvc01_quickstart</name>
  <groupId>com.itheima</groupId>
  <artifactId>springmvc01_quickstart</artifactId>
  <version>1.0-SNAPSHOT</version>

  <properties>
    <maven.compiler.source>8</maven.compiler.source>
    <maven.compiler.target>8</maven.compiler.target>
  </properties>

  <dependencies>
    <!--导入springmvc与servlet的依赖-->
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
      <version>3.1.0</version>
      <scope>provided</scope><!--防止与tomcat插件冲突-->
    </dependency>

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>5.2.10.RELEASE</version>
    </dependency>
  </dependencies>
  
  <!--tomcat插件-->
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.tomcat.maven</groupId>
        <artifactId>tomcat7-maven-plugin</artifactId>
        <version>2.1</version>
        <configuration>
          <port>80</port><!--tomcat端口号-->
          <path>/</path><!--虚拟目录-->
        </configuration>
      </plugin>
    </plugins>
  </build>
</project>

说明:servlet 的依赖为什么需要添加<scope>provided</scope>

scope 是 maven 中 jar 包依赖作用范围的描述,如果不设置默认是在编译、运行、测试时均有效。

如果运行有效的话就会和 tomcat 中的 servlet-api 包发生冲突,导致启动报错。

provided 代表的是该包只在编译和测试时用,运行时无效,直接使用 tomcat 中的,就避免了冲突。

(3) 创建 Controller 类

//使用Controller定义bean
@Controller
public class UserController {
    // 当前操作的请求映射路径:用户发出哪个请求能调用到这个方法
    @RequestMapping("/save")
    // 设置当前操作的返回值类型
    // 把返回的东西整体作为响应的内容给到外面
    @ResponseBody//设置当前控制器方法响应内容为当前返回值,无需解析
    // 处理请求的方法
    // 返回值为String:执行完这个方法,要对外返回json数据
    public String save(){
        System.out.println("user save ...");
        return "{'module':'springmvc'}";
    }
}

(4) 创建配置类

@Configuration
//加载 controller 对应的 bean
@ComponentScan("com.itheima.controller")
public class SpringMvcConfig {
}

(5) 使用配置类替换 web.xml
将web.xml删除,换成ServletContainersInitConfig

// 定义一个servlet容器启动的配置类
// 要继承AbstractDispatcherServletInitializer
public class ServletControllerInitConfig extends AbstractDispatcherServletInitializer {
    //加载springMVC容器的配置
    //tomcat服务器启动时,就能加载SpringMVC配置类了
    @Override
    protected WebApplicationContext createServletApplicationContext() {
        //加载springMVC的配置类
        AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
        ctx.register(SpringMvcConfig.class);
        return ctx;
    }
    //设置哪些请求由springMVC处理
    @Override
    protected String[] getServletMappings() {
        //所有请求都由springMVC处理
        return new String[]{"/"};
    }
    //加载spring容器配置
    //现在只用springMVC容器,所以这个方法不用管,直接返回null
    @Override
    protected WebApplicationContext createRootApplicationContext() {
        return null;
    }
}

(6) 配置 tomcat 环境
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

(7) 运行项目后,用浏览器访问

在这里插入图片描述
idea 控制台也打印出了:user save …

SpringMVC 入门程序开发总结(1+N):

一次性工作

  • 创建工程,设置服务器,加载工程
  • 导入依赖
  • 创建 web 容器启动类,加载 SpringMVC 配置,并设置SpringMVC 请求拦截路径
  • SpringMVC 核心配置类(设置配置类,扫描 controller 包,加载 Controller 控制器 bean)

多次工作

  • 定义处理请求的控制器类
  • 定义处理请求的控制器方法,并配置映射路径(@RequestMapping)与返回 json 数据(@ResponseBody)

如:直接在 UserController 中加入如下代码,就可以扩展功能。

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

2.2 入门案例工作流程

在这里插入图片描述

3. bean 加载控制

在这里插入图片描述

SpringMVC 需要加载的 bean:表现层的 bean,也就是 controller 包下的。

Spring 需要加载的bean:
业务 bean(Service)
功能 bean(DataSource、SqlSessionFactoryBean、MapperScannerConfigurer 等)

分析清楚谁该管哪些 bean 以后,要解决的问题就是如何让 Spring 和 SpringMVC 分开加载各自的 bean。

在 SpringMVC 的配置类 SpringMvcConfig 中使用注解@ComponentScan,只需将扫描范围设置到 controller,如:

在这里插入图片描述

之前在 Spring 的配置类 SpringConfig 中使用注解@ComponentScan 时,扫描的范围其实已经包含了 controller,如:

在这里插入图片描述
实际上,应该避免 Spring 错误地加载到 SpringMVC 的 bean,下面就来解决这个问题。

解决方案有三种:

① Spring 加载 bean 时,设定扫描范围为精准范围,例如 service 包、dao 包等(主要用这种)。

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

注意:dao 包下的类的对象是使用 mybatis 自动代理的方式创建的,这个对象不是我们自己创建出来的,所以写不写 com.itheima.dao 都不影响对应 bean 的加载,但是写上更好(因为不用 mybatis 自动代理时可能会需要)。

② Spring 加载 bean 时,设定扫描范围为 com.itheima,排除掉 controller 包中的 bean。

@Configuration
//扫描com.itheima下的类,以加载bean
//按注解过滤,过滤掉带有@Controller注解的类
@ComponentScan(value = "com.itheima",
        excludeFilters = @ComponentScan.Filter(
                type = FilterType.ANNOTATION,
                classes = Controller.class
        )
)
public class SpringConfig {
}
  • excludeFilters:排除扫描路径中加载的 bean。
  • includeFilters:加载指定的 bean,在现有基础上追加。

SpringConfig 扫描时,如果某个类上有 @Configuration 注解,那么这个类也会被扫描,同时它里面的 bean 也会被加载。

SpringMvcConfig 上就有一个@ComponentScan。虽然 SpringConfig 的扫描过滤掉了 controller 类,但又通过 SpringMvcConfig 把 controller 类给扫描进来了。
解决方案:把 SpringMvcConfig 移出 Spring 配置类的扫描范围。如:可以将 SpringConfig、SpringMvcConfig 移动到 com 下。

③ 不区分 Spring 与 SpringMVC 的环境,加载到同一个环境中(了解即可)

最后一个问题,有了 Spring 的配置类,要想在 tomcat 服务器启动将其加载,我们需要修改 ServletContainersInitConfig。

// 定义一个servlet容器启动的配置类
// 要继承AbstractDispatcherServletInitializer
public class ServletControllerInitConfig extends AbstractDispatcherServletInitializer {
    //加载springMVC容器的配置
    //tomcat服务器启动时,就能加载SpringMVC配置类了
    @Override
    protected WebApplicationContext createServletApplicationContext() {
        //加载springMVC的配置类
        AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
        ctx.register(SpringMvcConfig.class);
        return ctx;
    }
    //设置哪些请求由springMVC处理
    @Override
    protected String[] getServletMappings() {
        //所有请求都由springMVC处理
        return new String[]{"/"};
    }
    //加载spring容器配置
    @Override
    protected WebApplicationContext createRootApplicationContext() {
        //加载spring的配置类
        AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
        ctx.register(SpringConfig.class);
        return ctx;
    }
}

对于上述的配置方式,Spring 还提供了一种更简单的配置方式,可以不用再去创建
AnnotationConfigWebApplicationContext 对象,不用手动register 对应的配置类,如何实现?

// 定义一个servlet容器启动的配置类
// 要继承AbstractAnnotationConfigDispatcherServletInitializer
public class ServletControllerInitConfig extends AbstractAnnotationConfigDispatcherServletInitializer {
    //加载Spring配置类
    @Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class[]{SpringConfig.class};
    }
    //加载SpringMVC配置类
    @Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class[]{SpringMvcConfig.class};
    }
    //设置哪些请求由springMVC处理
    @Override
    protected String[] getServletMappings() {
        //所有请求都由springMVC处理
        return new String[]{"/"};
    }
}

4. PostMan 工具

代码编写完后要想测试,只需要打开浏览器直接输入地址发送请求即可。发送的是 GET 请求可以直接使用浏览器,但是如果要发送的是 POST 请求呢?

如果要求发送的是 POST 请求,就得准备页面,并在页面上准备 form 表单,测试起来比较麻烦。所以就需要借助一些第三方工具,如 PostMan。

PostMan 是一款网页调试与发送网页 HTTP 请求的 Chrome 插件,常用于进行接口测试。

(1) 创建 WorkSpace 工作空间

在这里插入图片描述

(2) 工作空间的名称

在这里插入图片描述
(3) 选择请求方式

在这里插入图片描述

在这里插入图片描述

(4) 发送请求(相当于在浏览器发送请求)

在这里插入图片描述
数据效果:

在这里插入图片描述

页面效果:

在这里插入图片描述
(5) 同样地,可以向百度发请求:

在这里插入图片描述

(6) 保存当前请求(ctrl+s后)

在这里插入图片描述

注意:第一次请求需要创建一个新的目录,后面就不需要创建新目录,直接保存到已经创建好的目录即可。

对于 PostMan 如果觉得字小不好看,可以使用 ctrl+“=” 调大,ctrl+“-” 调小。

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

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

相关文章

Python导入模块的3种方式

很多初学者经常遇到这样的问题&#xff0c;即自定义 Python 模板后&#xff0c;在其它文件中用 import&#xff08;或 from...import&#xff09; 语句引入该文件时&#xff0c;Python 解释器同时如下错误&#xff1a;ModuleNotFoundError: No module named 模块名意思是 Pytho…

45.在ROS中实现global planner(1)

前文move_base介绍&#xff08;4&#xff09;简单介绍move_base的全局路径规划配置&#xff0c;接下来我们自己实现一个全局的路径规划 1. move_base规划配置 ROS1的move_base可以配置选取不同的global planner和local planner&#xff0c; 默认move_base.cpp#L70中可以看到是…

Vue3电商项目实战-分类模块1【01-顶级类目-面包屑组件-初级、02-顶级类目-面包屑组件-高级】

文章目录01-顶级类目-面包屑组件-初级02-顶级类目-面包屑组件-高级01-顶级类目-面包屑组件-初级 目的&#xff1a; 封装一个简易的面包屑组件&#xff0c;适用于两级场景。 大致步骤&#xff1a; 准备静态的 xtx-bread.vue 组件定义 props 暴露 parentPath parentName 属性&am…

[oeasy]python0081_ANSI序列由来_终端机_VT100_DEC_VT选项_终端控制序列

更多颜色 回忆上次内容 上次 首先了解了RGB颜色设置可以把一些抽象的色彩名字 落实到具体的 RGB颜色 计算机所做的一切 其实就是量化、编码把生活的一切都进行数字化 标准 是ANSI制定的 这个ANSI 又是 怎么来的 呢&#xff1f;&#xff1f;&#x1f914; 由来 ANSI 听起…

【c++设计模式】——模板方法模式

模板方法模式的定义 定义一个操作中的算法对象的骨架&#xff08;稳定&#xff09;&#xff0c;而将一些步骤延迟到子类&#xff08;定义一个虚函数&#xff0c;让子类去实现&#xff09;&#xff0c;template method使得子类可以不改变&#xff08;复用&#xff09;一个算法结…

can协议介绍

目录 1 can协议介绍 1.1can协议 1.2 CAN协议特点 2.CAN FD 2.1 CAN FD协议简介 2.2 CAN FD协议特点 3.LIN 3.1 LIN总线简介 3.2 LIN总线特点 4. FlexRay 4.1 FlexRay简介 4.2 FlexRay特点 5. MOST 6.Ethernet 7 总结&#xff1a; 1 can协议介绍 1.1can协议 CAN…

Linux---Linux是什么

Linux 便成立的核心网站&#xff1a; http://www.kernel.org Linux是什么 Linux 就是一套操作系统 Linux 就是核心与系统呼叫接口那两层 软件移植&#xff1a;如果能够参考硬件的功能函数并据以修改你的操作系统程序代码&#xff0c; 那经过改版后的操作系统就能够在另一个硬…

Spring Boot 整合定时任务完成 从0 到1

Java 定时任务学习 定时任务概述 > 定时任务的应用场景非常广泛, 如果说 我们想要在某时某地去尝试的做某件事 就需要用到定时任务来通知我们 &#xff0c;大家可以看下面例子 如果需要明天 早起&#xff0c;哪我们一般会去定一个闹钟去通知我们, 而在编程中 有许许多多的…

ssm高校功能教室预约系统java idea maven

本网站所实现的是一个高校功能教室预约系统&#xff0c;该系统严格按照需求分析制作相关模块&#xff0c;并利用所学知识尽力完成&#xff0c;但是本人由于学识浅薄&#xff0c;无法真正做到让该程序可以投入市场使用&#xff0c;仅仅简单实现部分功能&#xff0c;希望日后还能…

springboot集成Redis

springboot集成Redis1 windows平台安装Redis2 引入依赖3 修改配置文件4 启动类添加注解5 指定缓存哪个方法6 配置Redis的超时时间小BUG测试对于项目中一些访问量较大的接口&#xff0c;配置上Redis缓存&#xff0c;提升系统运行速度。1 windows平台安装Redis github.com/Micro…

谈一谈API接口开发

做过开发的程序猿&#xff0c;基本都写过接口&#xff0c;写接口不算难事&#xff0c;与接口交互的对象核对好接口的地址、请求参数和响应参数即可&#xff0c;我在作为面试官去面试开发人员的时候&#xff0c;有时候会问这个问题&#xff0c;但相当多的一部分人并没有深入的考…

BERT(NAACL 2019)-NLP预训练大模型论文解读

文章目录摘要算法BERT预训练Masked LMNSPFine-tune BERT实验GLUESQuAD v1.1SQuAD v2.0SWAG消融实验预训练任务影响模型大小影响BERT基于特征的方法结论论文&#xff1a; 《BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding》github&#xff…

QT+OpenGL 摄像机

QTOpenGL 摄像机 本篇完整工程见gitee:QtOpenGL 对应点的tag&#xff0c;由turbolove提供技术支持&#xff0c;您可以关注博主或者私信博主 OpenGL本身没有摄像机的定义&#xff0c;但是我们可以通过把场景中的所有物体往相反方向移动的方式来模拟出摄像机&#xff0c;产生一…

Linux内核启动(2,0.11版本)内核启动前的苦力活与内核启动

内核启动前的工作 在上一章的内容中&#xff0c;我们跳转到了setup.s的代码部分&#xff0c;这章我们先讲一讲setup做了什么吧 entry start start:! ok, the read went well so we get current cursor position and save it for ! posterity.mov ax,#INITSEG ! this is done …

Flowable进阶学习(十)定时器、ServiceTask服务任务、ScriptTask脚本任务

文章目录一、定时器1. 流程定义定时激活2. 流程实例定时挂起3. 定时任务执行过程ServiceTask 服务任务委托表达式表达式类中字段ScriptTask 脚本任务JS TASK一、定时器 相关知识链接阅读&#xff1a;事件网关——定时器启动事件 1. 流程定义定时激活 可以通过activateProces…

材质笔记 - Simluate Solid Surface

光的行为 当光和物体相遇时&#xff0c;光会有三种行为&#xff1a;被物体反射、穿过物体&#xff08;物体是透明或半透明的&#xff09;或者被吸收。 高光反射和漫反射 高光反射&#xff08;Specular Reflection&#xff09;会在表面光滑且反光的物体上看到&#xff0c;比如镜…

SMART PLC时间间隔定时器应用(高速脉冲测频/测速)

高速脉冲计数测量频率,专栏有系列文章分析讲解,这里不再赘述(原理都是利用差分代替微分)。具体链接如下: 西门子SMART PLC高速脉冲计数采集编码器速度(RC滤波)_RXXW_Dor的博客-CSDN博客这篇文章主要讲解西门子 SMART PLC高速计数采集编码器脉冲信号计算速度,根据编码器脉…

鸢尾花数据集分类(PyTorch实现)

一、数据集介绍 Data Set Information: This is perhaps the best known database to be found in the pattern recognition literature. Fisher’s paper is a classic in the field and is referenced frequently to this day. (See Duda & Hart, for example.) The data…

[Android Studio]Android 数据存储-文件存储学习笔记-结合保存QQ账户与密码存储到指定文件中的演练

&#x1f7e7;&#x1f7e8;&#x1f7e9;&#x1f7e6;&#x1f7ea; Android Debug&#x1f7e7;&#x1f7e8;&#x1f7e9;&#x1f7e6;&#x1f7ea; Topic 发布安卓学习过程中遇到问题解决过程&#xff0c;希望我的解决方案可以对小伙伴们有帮助。 &#x1f4cb;笔记目…

戴尔游匣G16电脑U盘安装系统操作教程分享

戴尔游匣G16电脑U盘安装系统操作教程分享。有用户在使用戴尔游匣G16电脑的时候遇到了系统问题&#xff0c;比如电脑蓝屏、自动关机重启、驱动不兼容等问题。遇到这些问题如果无法进行彻底解决&#xff0c;我们可以通过U盘重新安装系统的方法来解决&#xff0c;因为这些问题一般…