【SSM-SpringMVC(二)】Spring接入Web环境!本篇开始研究SpringMVC的使用!SpringMVC数据响应和获取请求数据
SpringMVC的数据响应方式
页面跳转:
-
返回字符串方式
直接返回字符串:此种方式会将返回的字符串与视图解析器的前后缀拼接后跳转
@RequestMapping("/con") public String say(){return "success"; }
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"><property name="prefix" value="/src/web_jsp/"></property><property name="suffix" value=".jsp"></property> </bean>
最后访问的地址:/src/web_jsp/success.jsp
- 返回带有前缀的字符串:
- 转发:forward:/src/web-jsp/success.jsp (默认为转发方式)
- 重定向:redirect:/success.jsp (重定向地址必须是公开不受保护的路径)
- 返回带有前缀的字符串:
-
通过ModelAndView对象返回方式
// 既然SpringMVC会自动回填框架中存在的数据,那么可以直接声明request对象,它一样可以进行回填
@RequestMapping("/test4")
public String test4(HttpServletRequest request){request.setAttribute("name","赵六");return "/src/web_jsp/index.jsp";
}// 设置模型,也就是直接设置数据返回字符串方式也可以进行返回视图
@RequestMapping("/test3")
public String test3(Model model){model.addAttribute("name","王五");return "/src/web_jsp/index.jsp";
}// 当声明数据类是在框架中存在的类时,SpringMVC会自行注入相对应的对象
@RequestMapping("/test2")
public ModelAndView test2(ModelAndView modelAndView){modelAndView.addObject("name","李四");// 存放进request域中modelAndView.setViewName("/src/web_jsp/index.jsp");return modelAndView;
}// ModelAndView,可以直接返回该对象,该对象内设置的对应属性与值用于返回数据和视图路径
@RequestMapping("/test1")
public ModelAndView test1(){ModelAndView modelAndView = new ModelAndView();// 设置视图路径modelAndView.addObject("name","张三");// 存放进request域中modelAndView.setViewName("/src/web_jsp/index.jsp");return modelAndView;
}
回写数据:
-
直接返回字符串
- Web基础阶段,客户端访问服务器端,如果想直接回写字符串作为响应体返回的话,只需要使用response.getWriter().print(“hello world”)即可,那么在Controller中想直接回写字符串该怎么样?
-
通过SpringMVC框架注入的response对象,使用response.getWriter().print(“hello world”)回写数据,此时不需要视图跳转,业务方式返回值void。
@RequestMapping("/test5") public void test4(HttpServletResponse response) throws IOException {response.getWriter().print("回写数据"); }
-
将需要回写的字符串直接返回,但此时需要通过@responseBody注解告知SpringMVC框架,方法返回的字符串不是跳转,而是直接在http响应体中返回。
@RequestMapping("/test6") @ResponseBody public String test4() throws IOException {return "直接在响应体中返回数据"; }
-
返回对象或集合
- 在方法上添加@ResponseBody就可以返回json格式的字符串,但是这样配置比较麻烦,配置的代码比较多,因此,我们可以使用mvc的注解驱动代替上述配置。
<mvc:annotation-driven></mvc:annotation-driven>
- 在SpringMVC的各个组件中,处理器映射器、处理器适配器、视图解析器称为SpringMVC的三大组件。
- 使用< mvc:annotation-driven >自动加载RequestMappingHandlerMapping(处理映射器)和RequestMappingHandlerAdapter(处理适配器),可用在Spring-xml.xml配置问价你中使用< mvc:annotation-driven >替代注解处理器和适配器配置。
- 同时用< mvc:annotation-driven >默认底层就会基础jackson进行对象或集合的json格式字符串的转换
SrpingMVC 获得请求数据
获得请求参数
- 客户端请求类型参数的格式是:name=value&name=value
- 服务器要获得请求的参数,有时还需要进行数据的封装,SpringMVC可以接收如下类型的参数:
- 基本类型参数
- POJO类型参数
- 数组类型参数
- 集合类型参数
获得基本类型参数
- Controller业务方式的参数名称要与请求参数的name一致,参数值会自动映射匹配
// java代码
@RequestMapping("/test10")
@ResponseBody
public void test9(String name,String age) throws IOException {System.out.println(name);System.out.println(age);
}
<!-- 浏览器地址栏 - 通过get请求向方法发送数据 -->
http://localhost:8080/路径?name=value&age=value
获得POJO类型参数
- Controller中的业务方法的POJO参数的属性名与请求参数的name一致,参数值会自动映射匹配
<!-- 浏览器地址栏 - 通过get请求向方法发送数据 -->
http://localhost:8080/路径?name=value&age=value
public class User{private String name;private String age;
}// java代码
@RequestMapping("配置路径")
@ResponseBody
public void 方法(实体类类型 接收实体类值) throws IOException {System.out.println(接收实体类值);
}
获得数组类型参数
- Controller中的业务方法数组名称与请求参数的name一致,参数值会自动映射匹配
<!-- 浏览器地址栏 - 通过get请求向方法发送数据 -->
http://localhost:8080/路径?arr=111&arr=张三&arr=李四1
@RequestMapping("/test12")
@ResponseBody
public void test11(String[] arr) throws IOException {System.out.println(Arrays.asList(arr));
}
获得集合类型参数
- 获得集合参数时,要将集合参数包装到一个POJO中才可以。
- 当使用ajax提交时,可以知道contentType为json形式,那么在方法参数位置使用@RequestBody可以直接接收集合数据而无序使用POJO进行包装
配置请求的各类问题
静态资源访问的开启
<!-- 开放某一路径下的静态资源文件 -->
<mvc:resources mapping="/src/Document/**" location="/src/Document/"></mvc:resources><!-- 如果SpringMVC找不到对应的静态资源,那么将交由内部容器(Tomcat)查询对应的静态资源文件 -->
<mvc:default-servlet-handler></mvc:default-servlet-handler>
请求数据乱码问题
<!-- 设置过滤器,该过滤器将所有的文件编码都设置为UTF-8 -->
<filter><filter-name>CharacterEncodingFilter</filter-name><filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class><init-param><param-name>encoding</param-name><param-value>UTF-8</param-value></init-param>
</filter>
<filter-mapping><filter-name>CharacterEncodingFilter</filter-name><url-pattern>/*</url-pattern>
</filter-mapping>
各种方式获取请求数据
参数绑定注解@RequestParam
- 当请求的参数名称与Controller的业务方法参数名称不一致时,就需要通过@RequestParam注解显示的绑定
- 注解@ReqeuestParam还有如下参数可以使用:
- value:映射前的请求参数名称
- required:此在指定的请求参数是否必须包括,默认时true,提交时如果没有此参数则报错
- defaultValue:当没有指定请求参数时,则使用指定的默认值赋值。前提required为false
@RequestMapping("/test15")
@ResponseBody
/** defaultValue : 默认值* value : 映射前参数名* required : 指定参数名是否包括 默认true* */
public void test14(@RequestParam(value = "data",required = false,defaultValue = "老刘") String name) throws IOException {System.out.println(name);
}
获得Restful风格的参数
-
Restful是一种软件架构风格、设计风格,而不是标准,只是提供了一组设计原则和约束条件。
-
其主要用于客户端和服务器交互的软件,基于整个风格设计的软件可以更加简洁,更有层次,更易于实现缓存机制等
-
Restful 风格的请求是使用 “url+请求方式” 表示一次请求目的,HTTP 协议里面四个表示方式的动词如下:
- GET:用于获取资源
- POST:用于新建资源
- PUT:用于更新资源
- DELETE:用于删除资源
-
例如:
-
/路径/1 GET:—— 得到 id = 1的类
-
/路径/1 DELETE:—— 删除 id = 1的类
-
/路径/1 PUT:—— 更新 id = 1的类
-
/路径 POST:—— 新增类
-
-
/路径/1中的1就是要获得的请求参数,在SpringMVC中可以使用占位符进行参数绑定。
-
地址/路径/1可以写成/路径/{参数},占位符{参数}对应的就是1的值。
-
在业务方法中我们可以使用@PathVariable注解进行占位符的匹配获取工作。
自定义类型转换器
-
SpringMVC默认已经提供了一些常用的类型转换器,例如客户端提交的字符串转换成int类型进行参数设置
-
但是不是所有的数据类型都提供了转化器,没有提供的就需要自定义转换其,例如:日期类型
-
自定义类型转换器的开发步骤:
- 定义转换器类实现Converter接口
- 在配置文件中声明转换器
- 在 < annotation-driven > 中引用转换器
获取 Servlet 相关API
-
SpringMVC 支持使用原始 ServletAPI 对象作为控制器方法的参数进行注入,常用的对象如下:
- HttpServletRequest
- HttpServletResponse
- HttpSession
@RequestMapping("/test18") @ResponseBody public void test17(HttpServletRequest request,HttpServletResponse response) throws IOException {System.out.println(request);System.out.println(response); }
获取请求头数据
-
@RequestHeader
- 使用该注解可以获得请求头信息,相当于web阶段学习的request.getHeader(name)
- @RequestHeader注解的属性如下:
- value:请求头的名称
- required:是否必须携带此请求头
-
@CookieValue
- 使用该注解可以获得指定Cookie的值
- @CookieValue注解的属性如下:
- value:指定cookie的名称
- required:是否必须携带此cookie
文件上传
文件上传客户端三要素
- 表单项type=“file”
- 表单的提交方式是post
- 表单的enctype属性是多部分表单形式,及enctype=“multipart/lform-data”
文件上传原理
单文件上传步骤
- 导入fileupload和io坐标(需依靠Commons插件)
- 配置文件上传解析器
- 编写文件上传代码
单文件上传的代码实现
-
第一步:
- 所需Commons插件的io包和fileupload包
- 在项目中导入这两个jar包后进行第二步操作
-
第二步:
- 配置文件上传解析器
<!-- 配置文件上传 --> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"><property name="defaultEncoding" value="UTF-8"></property> <!-- 设置编码 --><property name="maxUploadSize" value="5000000"></property> <!-- 限制文件最大数据 --><property name="maxUploadSize" value="5000000"></property> <!-- 限制文件最大数据 --> </bean>
- 在此步骤之前,必须需要Commons插件提供的io包和fileupload包,否则将报错提示未找到类
-
第三步:
html:
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head><title>文件上传</title> </head> <body><!-- 注意配置enctype,该配置的是 多部分表单形式。详情请看上面的原理图 --><!-- 配置文件上传时,请注意请求方式一定是post请求 --><form action="${pageContext.request.contextPath}/test21" enctype="multipart/form-data" method="post"><div><label for="file">文件</label><input type="file" name="file" id="file" /></div><div><input type="submit" value="提交"></div></form> </body> </html>
java:
@RequestMapping("/test21") @ResponseBody public void test20(MultipartFile file) throws IOException {// 文件名称,包括了文件后缀名String originalFilename = file.getOriginalFilename();// transferTo 方法并不能新建文件夹,该方法只能转移至已存在的文件夹file.transferTo(new File("F:\\Java\\test\\" + originalFilename)); }
多文件上传
-
步骤一致,方法一致
-
当jsp页面中的文件标签name值一致,在控制器中可以使用数组方式接收
-
// 多文件上传@RequestMapping("/test22")@ResponseBodypublic void test21(MultipartFile[] file) throws IOException {// 使用循环遍历即可,步骤一致,方法一致for (MultipartFile data: file) {String originalFilename = data.getOriginalFilename();data.transferTo(new File("F:\\Java\\test\\"+originalFilename));}}
-
-
当jsp页面中的文件标签name值不一致,在控制器中就可以声明多个变量名来接收
-
@RequestMapping("/test21") @ResponseBody public void test20(MultipartFile file,MultipartFile file2,MultipartFile file3) throws IOException {// 文件名称,包括了文件后缀名String originalFilename = file.getOriginalFilename();// transferTo 方法并不能新建文件夹,该方法只能转移至已存在的文件夹file.transferTo(new File("F:\\Java\\test\\" + originalFilename));System.out.println(originalFilename); }
-
😍❤️SSM 专栏前篇
- 【SSM-Spring(一)】初上手Spring?别急!从最底部开始学习Spring吧!从Bean开始!本文介绍Spring程序的开发、Bean的声明周期与依赖注入概念
- 【SSM-Spring(二)】初上手Spring?别急!从最底部开始学习Spring吧!Spring连接数据库、注解开发、Junit测试
- 【SSM-SpringMVC(一)】Spring接入Web环境!本篇开始研究SpringMVC的使用!本文介绍了SpringMVC,以及SpringMVC的执行流程和常用注解解析
💕👉博客专栏
-
英语专栏-涵盖绝大多数的英语语法~~基于B站英语兔视频所作的学习笔记
-
Golang专栏-包含基础、Gin、Goam等知识
-
云原生专栏-包含k8s、docker等知识
-
从0开始学习云计算-华为HCIP证书
-
JUC专栏-带你快速领悟JUC的知识!
-
JVM专栏-深入Java虚拟机,理解JVM的原理
-
基于Java研究 数据结构与算法-包含贪心算法、加权图、最短路径算法等知识
-
Docker专栏-上手热门容器技术Docker
-
SpringBoot专栏-学习SpringBoot快速开发后端
-
项目管理工具的学习-设计技术:Maven、Git、Gradle等相关管理工具
-
JavaSE-全面了解Java基础
-
JS专栏-使用JS作的一部分实例~
-
使用CSS所作的一部分案例
相关文章:

【SSM-SpringMVC(二)】Spring接入Web环境!本篇开始研究SpringMVC的使用!SpringMVC数据响应和获取请求数据
SpringMVC的数据响应方式 页面跳转 直接返回字符串通过ModelAndView对象返回 回写数据 直接返回字符串返回对象或集合 页面跳转: 返回字符串方式 直接返回字符串:此种方式会将返回的字符串与视图解析器的前后缀拼接后跳转 RequestMapping("/con&…...

docker安装mysql8, 字符集,SQL大小写规范,sql_mode
一、Docker安装MySQL 使用Docker安装MySQL,命令如下 docker run -d \-p 3306:3306 \-v mysql_conf:/etc/mysql/conf.d \-v mysql_data:/var/lib/mysql \--name mysql \--restartalways \--privileged \-e MYSQL_ROOT_PASSWORD1234 \mysql:8.0.30参数解释 🐳 dock…...
FastMCP v2:构建MCP服务器和客户端的Python利器
FastMCP v2:构建MCP服务器和客户端的Python利器 引言 在人工智能与大语言模型(LLMs)的应用场景中,如何高效地构建服务器和客户端以实现数据交互与功能调用是关键问题。Model Context Protocol (MCP) 为此提供了一种标准…...
一个WordPress连续登录失败的问题排查
文章目录 1. 问题背景2. 解决方案搜索3. 问题定位4. 排查过程5. 清理空间6. 处理结果7. 后续优化 1. 问题背景 登录请求URL: Request URL: https://www.xxxxxx.com/wp-login.php 返回的响应头信息是: location: https://www.xxxxxx.com/wp-admin/ 证明登录成功。 接下来浏览器…...

【SSM-SSM整合】将Spring、SpringMVC、Mybatis三者进行整合;本文阐述了几个核心原理知识点,附带对应的源码以及描述解析
SSM整合的基础jar包 需要创建的层级: controller层 该层下需要创建对应的控制器Servlet POJO文件夹 该层下需要创建与数据库对应的POJO类 mapper层 该层下需要创建Mapper的接口实现 service层 该层下需要创建业务层的接口及其接口实现 需要创建的配置文件&#x…...
Go语言超时控制方案全解析:基于goroutine的优雅实现
一、引言 在构建高可靠的后端服务时,超时控制就像是守护系统稳定性的"安全阀",它确保当某些操作无法在预期时间内完成时,系统能够及时止损并释放资源。想象一下,如果没有超时控制,一个简单的数据库查询卡住…...
spark运行架构及核心组件介绍
目录 1. Spark 的运行架构1.1 Driver1.2 Executor1.3 Cluster Manager1.4 工作流程 2. Spark 的核心组件2.1 Spark Core2.2 Spark SQL2.3 Spark Streaming2.4 MLlib2.5 GraphX 3. Spark 架构图4. Spark 的优势4.1 高性能4.2 易用性4.3 扩展性4.4 容错性 5. 总结 1. Spark 的运行…...
idea中编写spark程序
### 在 IntelliJ IDEA 中配置和编写 Spark 程序 要在 IntelliJ IDEA 中高效地开发 Spark 程序,需要完成一系列必要的环境配置以及项目搭建工作。以下是详细的说明。 --- #### 1. 安装与配置 IntelliJ IDEA 为了确保 IDE 可以支持 Scala 开发,首先需要…...
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(21):复习
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(21):复习 1、前言(1)情况说明(2)工程师的信仰 2、知识点(1)じょうけん 条件形1、復習 (&#x…...

MYSQL数据库集群高可用和数据监控平台
项目环境 项目拓扑结构 软硬件环境清单 软硬件环境清单 软硬件环境清单 主机名IP硬件软件 master1 192.168.12.130 VIP:192.168.12.200 cpu:1颗2核 内 存:2GB HDD:20GB 网 络:NAT VmWare17 OpenEuler22.03 SP4 MySql8.0.3…...
Spark SQL 读取 CSV 文件,并将数据写入 MySQL 数据库
在 Spark 中,可以使用 Spark SQL 读取 CSV 文件,并将数据写入 MySQL 数据库。以下是一个完整的示例,展示如何实现这一过程。 环境准备 安装 MySQL:确保 MySQL 数据库已安装并运行。创建 MySQL 数据库和表:CREATE DAT…...
C++矩阵操作:正交矩阵(旋转矩阵)
文章目录 一、简介二、实现代码三、实现效果一、简介 我们知道判断一个矩阵的正交性可以看它是否符合以下条件: R T R = I R^TR=I R...
基于单片机的车灯智能控制系统设计与实现
标题:基于单片机的车灯智能控制系统设计与实现 内容:1.摘要 随着汽车行业的快速发展,车灯的智能化控制成为提升行车安全和驾驶体验的关键因素。本文旨在设计并实现一种基于单片机的车灯智能控制系统。采用单片机作为控制核心,结合光照传感器、雨滴传感器…...
机器学习第十一讲:标准化 → 把厘米和公斤单位统一成标准值
机器学习第十一讲:标准化 → 把厘米和公斤单位统一成标准值 资料取自《零基础学机器学习》。 查看总目录:学习大纲 关于DeepSeek本地部署指南可以看下我之前写的文章:DeepSeek R1本地与线上满血版部署:超详细手把手指南 一、买菜…...

uni-app vue3版本打包h5后 页面跳转报错(uni[e] is not a function)
先看问题 解决方案 在HBuilderX项目中,若需在Web配置中显式关闭摇树优化(Tree Shaking),可以通过以下步骤实现:首先,在配置中打开摇树优化,然后再将其关闭。这样操作后,配置文件中会…...
大二java第一面小厂(挂)
第一场: mybatis怎么防止数据转义。 Hutool用的那些你常用的方法。 springboot的常用注解。 redis的多级缓存。 websocket怎么实现的多人协作编辑功能。 怎么实现的分库分表。 mysql里面的各种操作,比如说分表怎么分,分页查询怎么用。 mybat…...

【Redis】缓存穿透、缓存雪崩、缓存击穿
1.缓存穿透 是指客户端请求的数据在缓存中和数据库中都不存在,这样缓存永远不会生效,导致请求直接穿透缓存到达数据库,给数据库带来压力的情况。 常见的解决方案有两种: 缓存空对象:实现简单,维护方便&am…...
双目云台摄像机:双摄安防功能全方位
双目云台摄像机是一种具有革命性设计的云台摄像机设备,其核心在于其独特的双摄像头配置。以下是对这种先进安防设备的详细介绍: 一、核心原理 双目云台摄像机的核心原理在于利用两个摄像头从不同角度捕捉同一场景,通过先进的算法计算两个图…...

告别数据僵尸!Redis实现自动清理过期键值对
在这个数据爆炸的时代,内存就像珍贵的土地资源,而Redis则是这片土地上的智能管家。它不仅能高效存储数据,还能像秋叶定时凋零般,让键值对在指定时间自动消失。今天,就让我们揭开这项"数据保鲜"技术的奥秘。 …...

web第三次课后作业--基于JDBC对mysql数据库的增删查改操作
一、工程搭建步骤 1.新建java项目,添加jdbc依赖 2.写java程序 3.添加mysql数据源,连接本地数据库 4.运行程序二、运行结果 三、代码 代码解析 加载数据驱动 try {Class.forName("com.mysql.jdbc.Driver"); } catch (ClassNotFoundExceptio…...
《P2345 [USACO04OPEN] MooFest G》
题目背景 P5094 [USACO04OPEN] MooFest G 加强版 题目描述 约翰的 n 头奶牛每年都会参加“哞哞大会”。 哞哞大会是奶牛界的盛事。集会上的活动很多,比如堆干草,跨栅栏,摸牛仔的屁股等等。 它们参加活动时会聚在一起,第 i 头…...
现代 Web 自动化测试框架对比:Playwright 与 Selenium 的深度剖析
现代 Web 自动化测试框架对比:Playwright 与 Selenium 的深度剖析 摘要:本文对 Playwright 与 Selenium 在开发适配性、使用难度、场景适用性及性能表现等方面进行了全面深入的对比分析。通过详细的技术实现细节阐述与实测数据支撑,为开发者…...
【网络协议】TCP、HTTP、MQTT 和 WebSocket 对比
从协议本质、工作原理、特点、应用场景等方面详细对比 TCP、HTTP、MQTT 和 WebSocket。 1. TCP(Transmission Control Protocol,传输控制协议) 本质 协议类型:传输层协议(OSI模型第4层)。核心功能&#x…...
Cython打包多层目录Python文件方法
为了使用Cython打包多层目录下的Python文件,并保持目录结构,请按照以下步骤操作: 步骤1:项目结构示例 假设项目结构如下: myproject/setup.pysrc/__init__.pymodule1.pysubdir/__init__.pymodule2.py步骤2ÿ…...

[数据结构]5. 栈-Stack
栈-Stack 1. 介绍2. 栈的实现2.1 基于链表的实现2.2 基于数组的实现 3. 栈操作CreateInitilizateDestoryPushPopTopEmptySize 1. 介绍 栈(stack) 是一种遵循先入后出逻辑的线性数据结构。顶部称为“栈顶”,底部称为“栈底”。把元素添加到栈…...
2020年下半年试题三:论云原生架构及其应用
论文库链接:系统架构设计师论文 论文题目 近年来,随着数字化转型不断深入,科技创新与业务发展不断融合,各行各业正在从大工业时代的固化范式进化成面向创新型组织与灵活型业务的崭新模式。在这一背景下,以容器盒微服务…...

基于Spring Boot + Vue的高校心理教育辅导系统
一、项目背景介绍 随着高校对学生心理健康教育的重视,传统的人工心理辅导与测评模式已经难以满足广大师生的个性化需求。为了提高心理服务的效率、便捷度和覆盖范围,本项目开发了一个高校心理教育辅导系统,集成心理评测、辅导预约、留言交流…...

JavaSwing之-JDialog
JavaSwing之-JDialog JDialog 是 Java Swing 中用于创建对话框窗口的容器类,继承自 Dialog 类(AWT),常用于显示临时信息、获取用户输入或执行模态操作。它是 javax.swing.JDialog 包中的类。 与 JFrame 不同的是,JDia…...

【学习路线】 游戏客户端开发入门到进阶
目录 游戏客户端开发入门到进阶:系统学习路线与推荐书单一、学习总原则:从底层出发,项目驱动,持续迭代二、推荐学习路线图(初学者→进阶)第一阶段:语言基础与编程思维第二阶段:游戏开…...

部署安装gitlab-ce-17.9.7-ce.0.el8.x86_64.rpm
目录 编辑 实验环境 所需软件 实验开始 安装部署gitlab171.配置清华源仓库(版本高的系统无需做)vim /etc/yum.repos.d/gitlab-ce.repo 2.提前下载包dnf localinstall gitlab-ce-17.9.7-ce.0.el8.x86_64.rpm --rocklinux 3.修改配…...