SpringMVC-Day1
SpringMVC
1.SpringMVC介绍
springMVC是一种基于Java实现MVC模型的轻量级Web框架
优点:
-
使用简单,开发便捷(相较于Servelt)
-
灵活性强
使用SpringMVC技术开发web程序流程
-
创建web工程(Maven结构)
-
设置tomcat服务器,加载web工程(tomcat插件)
-
导入坐标(SpringMVC+Servlet)
-
定义处理请求的功能类(UserController)
-
设置请求映射(配置映射关系)
-
将SpringMVC设定加载到Tomcat容器中
SpringMVC入门案例
-
导入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>
-
初始化SpringMVC环境
@Configuration public class SpringMvcConfig { } -
创建SpringMVC控制器类(等同于Servlet功能)
@Controller public class UserController {@RequestMapping("/save")@ResponseBodypublic String save(){System.out.println("user save ...");return "{'info':'springmvc'}";} } -
设定SpringMVC加载对应的bean
@Configuration @ComponentScan("com.zkw.controller") public class SpringMvcConfig { } -
初始化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;} }
部分代码介绍:
-
@RequestMapping:设置当前控制器方法请求访问路径
-
@ResponseBody:设置当前控制器方法响应内容为当前返回值,无需解析
-
createServletApplicationContext
protected WebApplicationContext createServletApplicationContext()//加载容器 {AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();//初始化容器对象ctx.register(SpringMvcConfig.class);//将配置注册到容器中return ctx;} -
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数据
-
导入JSON坐标
<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.9.0</version> </dependency>
-
@EnableWebMvc:开启自动转换json对象的支持
-
集合参数: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),表现形式状态转换
可以隐藏资源的访问行为,无法通过地址得知对资源是何种操作
-
设置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'}";} } -
设定请求参数("/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框架 优点: 使用简单,开发便捷(相较于Servelt) 灵活性强 使用SpringMVC技术开发web程序流程 创建web工程(Maven结构) 设置…...
【虚拟机】VMWare的CentOS虚拟机断电或强制关机出现问题
VMware 虚拟机因为笔记本突然断电故障了,开机提示“Entering emergency mode. Exit the shell to continue.”,如下图所示: 解决方法:输入命令: xfs_repair -v -L /dev/dm-0 注:报 no such file or direct…...
探索 RocketMQ:企业级消息中间件的选择与应用
一、关于RocketMQ RocketMQ 是一个高性能、高可靠、可扩展的分布式消息中间件,它是由阿里巴巴开发并贡献给 Apache 软件基金会的一个开源项目。RocketMQ 主要用于处理大规模、高吞吐量、低延迟的消息传递,它是一个轻量级的、功能强大的消息队列系统&…...
vue中v-if和v-for优先级
在Vue中,v-for的优先级高于v-if。这意味着在同一个元素上使用v-if和v-for时,v-for将首先被解析,然后是v-if。 下面是一个代码示例: <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#-取消任务列表(上)
如果不想等待异步控制台应用程序完成,可以取消该应用程序。 通过遵循本文的示例,可将取消添加到下载网站内容的应用程序。 可通过将 CancellationTokenSource 实例与每个任务进行关联来取消多个任务。 如果选择 Enter 键,则将取消所有尚未完成…...
Linux---ps命令
Linux ps 命令 | 菜鸟教程 (runoob.com) process status 用于显示进程的状态 USER: 用户名,运行此进程的用户名。PID: 进程ID(Process ID),每个进程的唯一标识号%CPU: 进程当前使用的CPU百分比%MEM: 进程当前使用的…...
解决k8s拉取私有镜像401 Unauthorized 问题
拉取镜像时未指定账户和密码通常是因为需要访问的镜像仓库启用了认证,但 Kubernetes 默认配置中未提供访问凭据。要解决此问题,可以按照以下步骤配置镜像仓库的认证信息: 1. 创建 Kubernetes Secret 为镜像仓库配置访问凭据,使用…...
Ruby 模块(Module)
Ruby 模块(Module) 概述 Ruby 是一种动态、开放源代码的编程语言,以其简洁明了的语法和强大的功能而闻名。在 Ruby 中,模块(Module)是一个重要的概念,它用于封装一组相关的方法和常量。模块提…...
HAL库的简单介绍以及环境搭建
目录 引言 一、HAL库的基本介绍 二、HAL库开发环境搭建 1、安装JAVA运行环境 2、安装STM32CubeMX 3、在线下载芯片支持包 引言 前面,我们学习了STM32基于寄存器的开发方式,能够更接近底层,但是随着我们学习的越来越深、代码越来与复杂…...
如何在 PyCharm 中配置 HTTP 代理以确保网络连接的顺畅性
如何在 PyCharm 中配置 HTTP 代理以确保网络连接的顺畅性 在配置 PyCharm 的 HTTP 代理以确保网络连接的顺畅性时,需按照一定的步骤进行设置,这不仅有助于确保 PyCharm 能够顺利访问互联网资源,还能保证插件和工具的正常更新与同步。以下是详…...
PHP 8.4 重磅发布了
文章精选推荐 1 JetBrains Ai assistant 编程工具让你的工作效率翻倍 2 Extra Icons:JetBrains IDE的图标增强神器 3 IDEA插件推荐-SequenceDiagram,自动生成时序图 4 BashSupport Pro 这个ides插件主要是用来干嘛的 ? 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 开发教程(一):入门指南-CSDN博客 Next.js 开发教程(二):从零构建仪表盘应用-CSDN博客 有兴趣的可以蹲个后续,我会陆续发布一系列的文章。 目录 系列文章目录 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、目的 解决顺序表存储数据有上限,并且插入和删除操作效率低的问题。 2、概念 链表:链式存储的线性表,使用随机的物理内存存储逻辑上连续的数据。 链表的组成:由一个个结点组成 结点:由数据域和链接域组…...
“LLM是否是泡沫”
目录 “LLM是否是泡沫” 培养自己鉴别论文价值的能力、复现开源项目的能力、debug 代码的能力 llm 是生产力工具 多去找实习,读再多的论文,刷再多的技术文章,也不如一次 debug 多机通讯报错带来的认知深刻 一、LLM领域的发展与挑战 二、…...
基于机器学习的人脸识别算法matlab仿真,对比GRNN,PNN,DNN以及BP四种网络
目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 (完整程序运行后无水印) 2.算法运行软件版本 MATLAB2022A 3.部分核心程序 (完整版代码包含详细中文注释和操作步骤视频)…...
算法(Algorithm)
算法(Algorithm) 是指解决问题或完成特定任务的一系列明确指令的集合。它是按照一定规则定义的一种计算过程,用于将输入转化为输出,能够被计算机或人类有效执行。 算法的核心特点 有穷性 算法必须在有限步骤内完成,不能…...
C语言中const char *字符进行切割实现
将127.0.0.1以“”“.”来进行切割,实现如下: 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"…...
(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)
题目:3442. 奇偶频次间的最大差值 I 思路 :哈希,时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况,哈希表这里用数组即可实现。 C版本: class Solution { public:int maxDifference(string s) {int a[26]…...
SkyWalking 10.2.0 SWCK 配置过程
SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外,K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案,全安装在K8S群集中。 具体可参…...
springboot 百货中心供应链管理系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,百货中心供应链管理系统被用户普遍使用,为方…...
CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型
CVPR 2025 | MIMO:支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题:MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者:Yanyuan Chen, Dexuan Xu, Yu Hu…...
【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表
1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...
苍穹外卖--缓存菜品
1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得,如果用户端访问量比较大,数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据,减少数据库查询操作。 缓存逻辑分析: ①每个分类下的菜品保持一份缓存数据…...
如何理解 IP 数据报中的 TTL?
目录 前言理解 前言 面试灵魂一问:说说对 IP 数据报中 TTL 的理解?我们都知道,IP 数据报由首部和数据两部分组成,首部又分为两部分:固定部分和可变部分,共占 20 字节,而即将讨论的 TTL 就位于首…...
C# 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...
学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”
2025年#高考 将在近日拉开帷幕,#AI 监考一度冲上热搜。当AI深度融入高考,#时间同步 不再是辅助功能,而是决定AI监考系统成败的“生命线”。 AI亮相2025高考,40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕,江西、…...
作为测试我们应该关注redis哪些方面
1、功能测试 数据结构操作:验证字符串、列表、哈希、集合和有序的基本操作是否正确 持久化:测试aof和aof持久化机制,确保数据在开启后正确恢复。 事务:检查事务的原子性和回滚机制。 发布订阅:确保消息正确传递。 2、性…...
