【SSM-SpringMVC(二)】Spring接入Web环境!本篇开始研究SpringMVC的使用!SpringMVC数据响应和获取请求数据

SpringMVC的数据响应方式

  1. 页面跳转
    • 直接返回字符串
    • 通过ModelAndView对象返回
  2. 回写数据
    • 直接返回字符串
    • 返回对象或集合

页面跳转:

  1. 返回字符串方式

    直接返回字符串:此种方式会将返回的字符串与视图解析器的前后缀拼接后跳转

    @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 (重定向地址必须是公开不受保护的路径)
  2. 通过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;
}

回写数据:

  1. 直接返回字符串

    • Web基础阶段,客户端访问服务器端,如果想直接回写字符串作为响应体返回的话,只需要使用response.getWriter().print(“hello world”)即可,那么在Controller中想直接回写字符串该怎么样?
    1. 通过SpringMVC框架注入的response对象,使用response.getWriter().print(“hello world”)回写数据,此时不需要视图跳转,业务方式返回值void。

      @RequestMapping("/test5")
      public void test4(HttpServletResponse response) throws IOException {response.getWriter().print("回写数据");
      }
      
    2. 将需要回写的字符串直接返回,但此时需要通过@responseBody注解告知SpringMVC框架,方法返回的字符串不是跳转,而是直接在http响应体中返回。

      @RequestMapping("/test6")
      @ResponseBody
      public String test4() throws IOException {return "直接在响应体中返回数据";
      }
      
  2. 返回对象或集合

    • 在方法上添加@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类型进行参数设置

  • 但是不是所有的数据类型都提供了转化器,没有提供的就需要自定义转换其,例如:日期类型

  • 自定义类型转换器的开发步骤:

    1. 定义转换器类实现Converter接口
    2. 在配置文件中声明转换器
    3. 在 < 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”

文件上传原理

在这里插入图片描述

单文件上传步骤

  1. 导入fileupload和io坐标(需依靠Commons插件)
  2. 配置文件上传解析器
  3. 编写文件上传代码

单文件上传的代码实现

  1. 第一步:

    • 所需Commons插件的io包和fileupload包
    • 在项目中导入这两个jar包后进行第二步操作
  2. 第二步:

    • 配置文件上传解析器
    <!-- 配置文件上传 -->
    <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包,否则将报错提示未找到类
  3. 第三步:

    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所作的一部分案例

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

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

相关文章

阅文集团C++面试题及参考答案

目录 能否不使用锁保证多线程安全? 面向对象的三个特性是什么?请分别解释。 构造函数和析构函数能否被继承? C++ 中函数重载是如何实现的? C 语言中是否支持函数重载? 什么是左值和右值?请举例说明。 C++ 中子类的构造和析构顺序是怎样的? C++ 中虚函数表的变化过…

【亲测有效】如何清空但不删除GitHub仓库中的所有文件(main分支)

如何清空但不删除GitHub仓库中的所有文件&#xff08;main分支&#xff09; 在项目开发过程中&#xff0c;有时我们需要清空GitHub仓库中的所有文件&#xff0c;同时保留仓库本身。这种情况常见于项目重构、代码重写或者需要重新开始一个项目时。本文将介绍一种有效的方法来清…

前端EXCEL插件,智表ZCELL产品V3.0 版本发布,底层采用canvas全部重构,功能大幅扩展,性能极致提升,满足千万级单元格加载

本次更新是底层全部重构&#xff0c;按照现代浏览器要求&#xff0c;采用canvas方式进行了重构&#xff0c;预留了将来扩展空间&#xff0c;特别是在大数据量性能提升方面有了较大提升&#xff0c;可以满足千万级单元格加载&#xff0c;欢迎大家体验使用。 体验地址&#xff1…

3DGS-to-PC:3DGS模型一键丝滑转 点云 or Mesh 【Ubuntu 20.04】【2025最新版!!】

一、引言 3D高斯泼溅(3DGS)是一种新兴的三维场景表示方法&#xff0c;可以生成高质量的场景重建结果。然而&#xff0c;要查看这些重建场景&#xff0c;需要特殊的高斯渲染器。大多数3D处理软件并不兼容3D高斯分布模型&#xff0c;但它们通常都兼容点云文件。 3DGS-to-PC项目提…

OpenHarmony 以太网卡热插拔事件接口无效

目录 1.背景 2.解决方案 1.背景 在OpenHarmony中调用以太网热插拔时间,发现热插拔没有任何回调,如下接口 import { ethernet } from @kit.NetworkKit;ethernet.on(interfaceStateChange, (data: object) => {console.log(on interfaceSharingStateChange: + JSON.…

C++ 跨平台开发挑战与深度解决方案:从架构设计到实战优化

C 凭借其高性能与底层控制能力&#xff0c;在游戏引擎、嵌入式系统、工业软件等领域占据核心地位。然而&#xff0c;跨平台开发过程中需应对硬件架构多样性、操作系统差异性、编译工具链碎片化等复杂问题。本文将从底层架构到上层应用&#xff0c;系统性剖析 C 跨平台开发的核心…

什么是 ANR 如何避免它

一、什么是 ANR&#xff1f; ANR&#xff08;Application Not Responding&#xff09; 是 Android 系统在应用程序主线程&#xff08;UI 线程&#xff09;被阻塞超过一定时间后触发的错误机制。此时系统会弹出一个对话框提示用户“应用无响应”&#xff0c;用户可以选择等待或强…

数据结构(六)——树和二叉树

一、树和二叉树的定义与存储 1.树的定义 树是一种非线性的数据结构&#xff0c;它是由n个有限结点组成有层次关系的集合 树具有以下特点&#xff1a; &#xff08;1&#xff09;每个结点具有0个或多个子结点 &#xff08;2&#xff09;每个子结点只有一个父结点 &#xff…

DICOM 网络服务实现:医学影像传输与管理的技术实践

🧑 博主简介:CSDN博客专家、CSDN平台优质创作者,高级开发工程师,数学专业,10年以上C/C++, C#, Java等多种编程语言开发经验,拥有高级工程师证书;擅长C/C++、C#等开发语言,熟悉Java常用开发技术,能熟练应用常用数据库SQL server,Oracle,mysql,postgresql等进行开发应用…

TongWeb7.0常用-D参数说明

Web容器相关启动参数配置 属性 含义 -Dtongweb.restart.interval 设置宕机后重启的时间间隔&#xff0c;以秒为单位。如果不设置这个参数&#xff0c;默认为1秒 -Dmonitor.abnormal.restart 设置服务器非正常状态时是否重启&#xff0c;如果不设置这个参数或者参数值不为…

软件架构评估方法全面解析

介绍 在软件开发过程中&#xff0c;架构设计的好坏直接影响系统的可维护性、可扩展性和性能。因此&#xff0c;软件架构评估&#xff08;Software Architecture Evaluation&#xff09;成为确保架构质量的关键步骤。本文将介绍几种主流的架构评估方法&#xff0c;包括ATAM、SA…

我开源了一个免费在线工具!UIED Tools

UIED Tools - 免费在线工具集合 最近更新&#xff1a;修改了文档说明&#xff0c;优化了项目结构介绍 这是设计师转开发的第一个开源项目&#xff0c;bug和代码规范可能有些欠缺。 这是一个功能丰富的免费在线工具集合网站&#xff0c;集成了多种实用工具&#xff0c;包括 AI …

【vue】全局组件及组件模块抽离

一、全局组件 只要是实例化过的区域都可以使用 Vue.component("组件名",{ template: 内容} ) 二、组件模块抽离 抽离就是把template的内容写到body里面&#xff0c;然后建立id写到变量下的template里&#xff0c;id变量写到component里 body{ template&#xff1a; …

深入理解 iOS 开发中的 `use_frameworks!`

在使用 CocoaPods 管理 iOS 项目依赖时&#xff0c;开发者经常会在 Podfile 文件中看到一个配置选项&#xff1a;use_frameworks!。本文将详细介绍这个配置选项的含义&#xff0c;以及如何决定是否在项目中使用它。 一、什么是 use_frameworks! 在 CocoaPods 中引入第三方库时…

《Python星球日记》 第57天:LSTM 与 GRU

名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 目录 一、LSTM 的门控机制1. LSTM 结构概述2. 遗忘门(Forget Gate)3. 输入门(Input Gate)4. 输出门(Output Gate)5. 记忆单元更新过程二、GRU 的简化…

Java SE所需工具与常见类型和运算符介绍

1.Java SE所需工具 1.1 JDK JDK全称为Java Develepment Kit(Java开发者工具包&#xff09;&#xff0c;包括了Java运行环境JRE&#xff08;Java Runtime Envirnment&#xff09;、一堆Java工具&#xff08;javac/java/jdb等&#xff09;和Java基础的类库&#xff08;即Java A…

QT6.8安装教程

官网下载 链接&#xff1a; Index of /official_releases/online_installers 这个比较慢 建议去 清华大学开源软件镜像站&#xff1a;Index of /qt/archive/online_installers/4.9/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror 根据自己什么系统选择 点击打开…

MIT XV6 - 1.3 Lab: Xv6 and Unix utilities - primes

接上文 MIT XV6 - 1.2 Lab: Xv6 and Unix utilities - pingpong primes 继续实验&#xff0c;实验介绍和要求如下 (原文链接 译文链接) : Write a concurrent prime sieve program for xv6 using pipes and the design illustrated in the picture halfway down this page and…

hive两个表不同数据类型字段关联引发的数据倾斜

不同数据类型引发的Hive数据倾斜解决方案 #### 一、‌原因分析‌ 当两个表的关联字段存在数据类型不一致时&#xff08;如int vs string、bigint vs decimal&#xff09;&#xff0c;Hive会触发隐式类型转换引发以下问题&#xff1a; ‌Key值的精度损失‌&#xff1a;若关联字…

【JAVA】业务系统订单号,流水号生成规则工具类

设计业务系统订单号&#xff0c;流水号注意事项 唯一性&#xff1a;确保在分布式环境下ID不重复 有序性&#xff1a;ID随时间递增&#xff0c;有利于数据库索引性能 可读性&#xff1a;包含时间信息&#xff0c;便于人工识别 扩展性&#xff1a;支持业务前缀和类型区分 性能…