当前位置: 首页 > news >正文

SpringMVC-Day1

SpringMVC

1.SpringMVC介绍

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

优点:

  • 使用简单,开发便捷(相较于Servelt)

  • 灵活性强

使用SpringMVC技术开发web程序流程

  1. 创建web工程(Maven结构)

  2. 设置tomcat服务器,加载web工程(tomcat插件)

  3. 导入坐标(SpringMVC+Servlet)

  4. 定义处理请求的功能类(UserController)

  5. 设置请求映射(配置映射关系)

  6. 将SpringMVC设定加载到Tomcat容器中

SpringMVC入门案例

  1. 导入SpringMVC坐标与Servlet坐标

    <dependency><groupId>javax.servlet</groupId><artifactId>servlet-api</artifactId><version>2.5</version><scope>provided</scope></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.1.5.RELEASE</version>
    </dependency>
  2. 初始化SpringMVC环境

    @Configuration
    public class SpringMvcConfig {
    }
  3. 创建SpringMVC控制器类(等同于Servlet功能)

    @Controller
    public class UserController {@RequestMapping("/save")@ResponseBodypublic String save(){System.out.println("user save ...");return "{'info':'springmvc'}";}
    }
  4. 设定SpringMVC加载对应的bean

    @Configuration
    @ComponentScan("com.zkw.controller")
    public class SpringMvcConfig {
    }
  5. 初始化Servlet容器,加载SpringMVC环境,并设置SpringMVC请求拦截的路径

    public class ServletContainersInitConfig extends AbstractDispatcherServletInitializer {@Overrideprotected WebApplicationContext createServletApplicationContext() {AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();ctx.register(SpringMvcConfig.class);return ctx;}
    ​@Overrideprotected String[] getServletMappings() {return new String[]{"/"}; //所有的请求都归springmvc处理}
    ​@Overrideprotected WebApplicationContext createRootApplicationContext() {return null;}
    }

部分代码介绍:

  1. @RequestMapping:设置当前控制器方法请求访问路径

  2. @ResponseBody:设置当前控制器方法响应内容为当前返回值,无需解析

  3. createServletApplicationContext

    protected WebApplicationContext createServletApplicationContext()//加载容器 {AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();//初始化容器对象ctx.register(SpringMvcConfig.class);//将配置注册到容器中return ctx;}
  4. getServletMappings:设定那些请求归springmvc处理

2.bean的加载控制

因为功能不同,如何避免Spring错误的加载到S平日那个MVC的bean?

A:加载Spring控制的bean的时候,排除掉SpringMVC控制的bean

方式一:设定扫描范围为com.zkw,排除掉controller包内的bean
@Configuration
@ComponentScan({"com.zkw.service","com.zkw.dao"})
public class SpringConfig{
}
方式二:设定扫描范围为精准范围,如service包、dao包等
@Configuration
@ComponentScan(value="com.zkw",excludeFilters = @ComponentScan.Filtertype = FilterType.ANNOTATION,//排除方法classes = Controller.class)
public class SpringConfig{
}

简化开发

public class ServletContainersInitConfig extend AbstractAnnotationConfigDispatcherServeletInitializer{protected Class<?>[] getServletConfigClasses() {return new Class[]{SpringMvcConfig.class};}protected String[] getServletMappings(){return new String[]{"/"};}protected Class<?>[] getRootConfigClasses(){return new Class[0];}
}

3.请求与响应

1.请求映射路
@Controller
@RequestMapping("/user")
public class UserController {@RequestMapping("/save")@ResponseBodypublic String save(){System.out.println("user save ...");return "{'module':'user save'}";}@RequestMapping("/delete")@ResponseBodypublic String delete(){System.out.println("user delete ...");return "{'module':'user delete'}";}
​
}
2.参数传递

Get请求传参

普通参数:url地址传参

public class UserController {@RequestMapping("/commonParam")@ResponseBodypublic String commonParam(String name){System.out.println("普通参数传递 name==>" + name);return "{'module':'common param'}";}
}

Post请求传参

传参汉字会出现乱码问题,添加字符过滤器

//乱码处理
​
@Override
protected Filter[] getServletFilters() {CharacterEncodingFilter filter = new CharacterEncodingFilter();filter.setEncoding("UTF-8");return new Filter[]{filter};
}

普通参数:请求参数名与形参名不同

public class UserController {@RequestMapping("/commonParam")@ResponseBodypublic String commonParam(@RequestParam("name") String userName){System.out.println("普通参数传递 name ==>" + userName);return "{'module':'common param'}";}
}

集合参数

public class UserController {@RequestMapping("/listParam")@ResponseBodypublic String commonParam(@RequestParam List<String> likes){System.out.println("集合参数传递 likes ==>" + likes);return "{'module':'list param'}";}
}

传递json数据

  1. 导入JSON坐标

    <dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.9.0</version>
    </dependency>
  2. @EnableWebMvc:开启自动转换json对象的支持

  3. 集合参数:json格式 在方法体里不在RequestParam中

    public String listParamForJson(@RequestBody List<String> likes) {System.out.println("list common(json)参数传递 list ==>" + likes);return "{'module':'list common for json param'}";
    }

POJO参数:JSON格式

{"name":"itcast","age";"15"
}

@RequestBody和@RequestParam区别

  • 区别:

    • @RequestParam用于接收url地址传参,表单传参

    • @RequestBody用于接收json数据

  • 应用

    • 后期开发中,发送json格式数据为主,@RequestBody应用较广

    • 如果发送非json格式数据,选用@RequestParam接收请求参数

日期类型参数传递

接收形参时,根据不同的日期格式设置不同的接收方式

@RequestMapping("/dataParam")
@ResponseBody
public String dataParam(Date date,@DateTimeFormat(pattern="yyyy-MM-dd")Date date1,@DateTimeFormat(pattern="yyyy/MM/dd HH:mm:ss")Date date2){System.out.println(...);System.out.println(...);System.out.println(...);return "{'module':'data param'}";}
3.响应
  • 响应页面

    @RequestMapping("/toPage")
    public String toPage(){return "page.jsp";
    }
  • 响应文本数据

    @RequestMapping("/toPage")
    @ResponseBody
    public String toPage(){return "page.jsp";
    }
  • 响应json数据

    @RequestMapping("/toJsonPOJO")
    @ResponseBody
    public String toJsonPOJO(){User user = new User();user.setName("赵云");user.setAge(41);return user;
    }
  • 响应json数据,集合

    @RequestMapping("/toJsonPOJO")
    @ResponseBody
    public String toJsonPOJO(){User user = new User();user.setName("赵云");user.setAge(41);return user;User user2 = new User();user2.setName("神赵云");user2.setAge(40);List<User> userList = new ArrayList<User>();userList.add(user1);userList.add(user2);return userList;
    }

4.REST风格

REST(Representational State Transfer),表现形式状态转换

可以隐藏资源的访问行为,无法通过地址得知对资源是何种操作

  1. 设置http请求动作(RequestMethod)

    public class UserController {@RequestMapping(value = "/users",method = RequestMethod.POST)@ResponseBodypublic String save(){System.out.println("user save ...");return "{'module':'user save'}";}@RequestMapping(value = "/users",method = RequestMethod.PUT)@ResponseBodypublic String update(){System.out.println("user update ...");return "{'module':'user update'}";}@RequestMapping(value = "/users",method = RequestMethod.GET)@ResponseBodypublic String getAll(){System.out.println("user getAll ...");return "{'module':'user getAll'}";}
    }
  2. 设定请求参数("/users/{id}" 和 @PathVariable)

    @RequestMapping(value = "/users/{id}",method = RequestMethod.DELETE)@ResponseBodypublic String delete(@PathVariable Integer id){System.out.println("user delete ..." + id);return "{'module':'user delete'}";}@RequestMapping(value = "/users/{id}",method = RequestMethod.GET)@ResponseBodypublic String getById(@PathVariable Integer id){System.out.println("user getById ...");return "{'module':'user getById'}";

@PathVariable

用于接收路径参数,使用{参数名称}描述路劲参数

RESTful快速开发

@RestController
@RequestMapping("/books")
public class UserController {@PostMappingpublic String save(){System.out.println("user save ...");return "{'module':'user save'}";}@PutMappingpublic String update(){System.out.println("user update ...");return "{'module':'user update'}";}@DeleteMappingpublic String delete(@PathVariable Integer id){System.out.println("user delete ..." + id);return "{'module':'user delete'}";}@GetMappingpublic String getById(@PathVariable Integer id){System.out.println("user getById ...");return "{'module':'user getById'}";}@GetMappingpublic String getAll(){System.out.println("user getAll ...");return "{'module':'user getAll'}";}
}

@RestController:@Controller和@ResponseBody两个注解组合功能

相关文章:

SpringMVC-Day1

SpringMVC 1.SpringMVC介绍 springMVC是一种基于Java实现MVC模型的轻量级Web框架 优点&#xff1a; 使用简单&#xff0c;开发便捷&#xff08;相较于Servelt&#xff09; 灵活性强 使用SpringMVC技术开发web程序流程 创建web工程&#xff08;Maven结构&#xff09; 设置…...

【虚拟机】VMWare的CentOS虚拟机断电或强制关机出现问题

VMware 虚拟机因为笔记本突然断电故障了&#xff0c;开机提示“Entering emergency mode. Exit the shell to continue.”&#xff0c;如下图所示&#xff1a; 解决方法&#xff1a;输入命令&#xff1a; xfs_repair -v -L /dev/dm-0 注&#xff1a;报 no such file or direct…...

探索 RocketMQ:企业级消息中间件的选择与应用

一、关于RocketMQ RocketMQ 是一个高性能、高可靠、可扩展的分布式消息中间件&#xff0c;它是由阿里巴巴开发并贡献给 Apache 软件基金会的一个开源项目。RocketMQ 主要用于处理大规模、高吞吐量、低延迟的消息传递&#xff0c;它是一个轻量级的、功能强大的消息队列系统&…...

vue中v-if和v-for优先级

在Vue中&#xff0c;v-for的优先级高于v-if。这意味着在同一个元素上使用v-if和v-for时&#xff0c;v-for将首先被解析&#xff0c;然后是v-if。 下面是一个代码示例&#xff1a; <template><div><div v-for"item in items" v-if"item.isDispl…...

使用Kotlin写一个将字符串加密成short数组,然后可以解密还原成原始的字符串的功能

文章目录 一、运行效果1.1 单个字符串加解密1.2 多个字符串数组加解密二、源代码2.1 控制流图2.2 实现的源代码一、运行效果 1.1 单个字符串加解密 待加密的单个字符串: 测试字符串转化成short数组-----字节卷动 单个字符串加密后的数据: [19914, -21676, 31702, 23463, 2833…...

windows C#-取消任务列表(上)

如果不想等待异步控制台应用程序完成&#xff0c;可以取消该应用程序。 通过遵循本文的示例&#xff0c;可将取消添加到下载网站内容的应用程序。 可通过将 CancellationTokenSource 实例与每个任务进行关联来取消多个任务。 如果选择 Enter 键&#xff0c;则将取消所有尚未完成…...

Linux---ps命令

​​​​​​Linux ps 命令 | 菜鸟教程 (runoob.com) process status 用于显示进程的状态 USER: 用户名&#xff0c;运行此进程的用户名。PID: 进程ID&#xff08;Process ID&#xff09;&#xff0c;每个进程的唯一标识号%CPU: 进程当前使用的CPU百分比%MEM: 进程当前使用的…...

解决k8s拉取私有镜像401 Unauthorized 问题

拉取镜像时未指定账户和密码通常是因为需要访问的镜像仓库启用了认证&#xff0c;但 Kubernetes 默认配置中未提供访问凭据。要解决此问题&#xff0c;可以按照以下步骤配置镜像仓库的认证信息&#xff1a; 1. 创建 Kubernetes Secret 为镜像仓库配置访问凭据&#xff0c;使用…...

Ruby 模块(Module)

Ruby 模块&#xff08;Module&#xff09; 概述 Ruby 是一种动态、开放源代码的编程语言&#xff0c;以其简洁明了的语法和强大的功能而闻名。在 Ruby 中&#xff0c;模块&#xff08;Module&#xff09;是一个重要的概念&#xff0c;它用于封装一组相关的方法和常量。模块提…...

HAL库的简单介绍以及环境搭建

目录 引言 一、HAL库的基本介绍 二、HAL库开发环境搭建 1、安装JAVA运行环境 2、安装STM32CubeMX 3、在线下载芯片支持包 引言 前面&#xff0c;我们学习了STM32基于寄存器的开发方式&#xff0c;能够更接近底层&#xff0c;但是随着我们学习的越来越深、代码越来与复杂…...

如何在 PyCharm 中配置 HTTP 代理以确保网络连接的顺畅性

如何在 PyCharm 中配置 HTTP 代理以确保网络连接的顺畅性 在配置 PyCharm 的 HTTP 代理以确保网络连接的顺畅性时&#xff0c;需按照一定的步骤进行设置&#xff0c;这不仅有助于确保 PyCharm 能够顺利访问互联网资源&#xff0c;还能保证插件和工具的正常更新与同步。以下是详…...

PHP 8.4 重磅发布了

文章精选推荐 1 JetBrains Ai assistant 编程工具让你的工作效率翻倍 2 Extra Icons&#xff1a;JetBrains IDE的图标增强神器 3 IDEA插件推荐-SequenceDiagram&#xff0c;自动生成时序图 4 BashSupport Pro 这个ides插件主要是用来干嘛的 &#xff1f; 5 IDEA必装的插件&…...

LVM缩容

当前环境 rootjmk:~/shell# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS nvme0n1 259:0 0 953.9G 0 disk |-nvme0n1p1 259:1 0 512M 0 part /boot/efi |-nvme0n1p2 259:2 0 488M 0 part /boot -nvme0n1p3 …...

Next.js 独立开发教程(三):CSS 样式的完整指南

系列文章目录 Next.js 开发教程(一)&#xff1a;入门指南-CSDN博客 Next.js 开发教程&#xff08;二&#xff09;&#xff1a;从零构建仪表盘应用-CSDN博客 有兴趣的可以蹲个后续&#xff0c;我会陆续发布一系列的文章。 目录 系列文章目录 1. 样式在 Next.js 中的基本支持…...

React (三)

文章目录 项目地址十二、性能优化12.1 使用useMemo避免不必要的计算12.2 使用memo缓存组件,防止过度渲染12.3 useCallBack缓存函数12.4 useCallBack里访问之前的状态(没懂)十三、Styled-Components13.1 安装13.2给普通html元素添加样式13.3 继承和覆盖样式13.4 给react组件添…...

Python数据结构之链表

一、链表 1、目的 解决顺序表存储数据有上限&#xff0c;并且插入和删除操作效率低的问题。 2、概念 链表&#xff1a;链式存储的线性表&#xff0c;使用随机的物理内存存储逻辑上连续的数据。 链表的组成&#xff1a;由一个个结点组成 结点&#xff1a;由数据域和链接域组…...

“LLM是否是泡沫”

目录 “LLM是否是泡沫” 培养自己鉴别论文价值的能力、复现开源项目的能力、debug 代码的能力 llm 是生产力工具 多去找实习&#xff0c;读再多的论文&#xff0c;刷再多的技术文章&#xff0c;也不如一次 debug 多机通讯报错带来的认知深刻 一、LLM领域的发展与挑战 二、…...

基于机器学习的人脸识别算法matlab仿真,对比GRNN,PNN,DNN以及BP四种网络

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 (完整程序运行后无水印) 2.算法运行软件版本 MATLAB2022A 3.部分核心程序 &#xff08;完整版代码包含详细中文注释和操作步骤视频&#xff09…...

算法(Algorithm)

算法&#xff08;Algorithm&#xff09; 是指解决问题或完成特定任务的一系列明确指令的集合。它是按照一定规则定义的一种计算过程&#xff0c;用于将输入转化为输出&#xff0c;能够被计算机或人类有效执行。 算法的核心特点 有穷性 算法必须在有限步骤内完成&#xff0c;不能…...

C语言中const char *字符进行切割实现

将127.0.0.1以“”“.”来进行切割&#xff0c;实现如下&#xff1a; const char * ip "127.0.0.1";char *test new char[100];strcpy(test, ip);const char *split ".";char *final;final strtok(test, split);while (final){printf("%s\n"…...

树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法

树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源&#xff1a; http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作&#xff0c;无需更改相机配置。但是&#xff0c;一…...

Go 语言接口详解

Go 语言接口详解 核心概念 接口定义 在 Go 语言中&#xff0c;接口是一种抽象类型&#xff0c;它定义了一组方法的集合&#xff1a; // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的&#xff1a; // 矩形结构体…...

Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务

通过akshare库&#xff0c;获取股票数据&#xff0c;并生成TabPFN这个模型 可以识别、处理的格式&#xff0c;写一个完整的预处理示例&#xff0c;并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务&#xff0c;进行预测并输…...

c++ 面试题(1)-----深度优先搜索(DFS)实现

操作系统&#xff1a;ubuntu22.04 IDE:Visual Studio Code 编程语言&#xff1a;C11 题目描述 地上有一个 m 行 n 列的方格&#xff0c;从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子&#xff0c;但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...

【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)

1.获取 authorizationCode&#xff1a; 2.利用 authorizationCode 获取 accessToken&#xff1a;文档中心 3.获取手机&#xff1a;文档中心 4.获取昵称头像&#xff1a;文档中心 首先创建 request 若要获取手机号&#xff0c;scope必填 phone&#xff0c;permissions 必填 …...

保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek

文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama&#xff08;有网络的电脑&#xff09;2.2.3 安装Ollama&#xff08;无网络的电脑&#xff09;2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...

AGain DB和倍数增益的关系

我在设置一款索尼CMOS芯片时&#xff0c;Again增益0db变化为6DB&#xff0c;画面的变化只有2倍DN的增益&#xff0c;比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析&#xff1a; 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...

音视频——I2S 协议详解

I2S 协议详解 I2S (Inter-IC Sound) 协议是一种串行总线协议&#xff0c;专门用于在数字音频设备之间传输数字音频数据。它由飞利浦&#xff08;Philips&#xff09;公司开发&#xff0c;以其简单、高效和广泛的兼容性而闻名。 1. 信号线 I2S 协议通常使用三根或四根信号线&a…...

Golang——6、指针和结构体

指针和结构体 1、指针1.1、指针地址和指针类型1.2、指针取值1.3、new和make 2、结构体2.1、type关键字的使用2.2、结构体的定义和初始化2.3、结构体方法和接收者2.4、给任意类型添加方法2.5、结构体的匿名字段2.6、嵌套结构体2.7、嵌套匿名结构体2.8、结构体的继承 3、结构体与…...

Unity VR/MR开发-VR开发与传统3D开发的差异

视频讲解链接&#xff1a;【XR马斯维】VR/MR开发与传统3D开发的差异【UnityVR/MR开发教程--入门】_哔哩哔哩_bilibili...