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

news2025/5/15 18:00:00

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")
          @ResponseBody
          public 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.coloradmin.cn/o/2376272.html

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

相关文章

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参数解释 &#x1f433; dock…

【SSM-SSM整合】将Spring、SpringMVC、Mybatis三者进行整合;本文阐述了几个核心原理知识点,附带对应的源码以及描述解析

SSM整合的基础jar包 需要创建的层级&#xff1a; controller层 该层下需要创建对应的控制器Servlet POJO文件夹 该层下需要创建与数据库对应的POJO类 mapper层 该层下需要创建Mapper的接口实现 service层 该层下需要创建业务层的接口及其接口实现 需要创建的配置文件&#x…

MYSQL数据库集群高可用和数据监控平台

项目环境 项目拓扑结构 软硬件环境清单 软硬件环境清单 软硬件环境清单 主机名IP硬件软件 master1 192.168.12.130 VIP&#xff1a;192.168.12.200 cpu:1颗2核 内 存&#xff1a;2GB HDD&#xff1a;20GB 网 络&#xff1a;NAT VmWare17 OpenEuler22.03 SP4 MySql8.0.3…

uni-app vue3版本打包h5后 页面跳转报错(uni[e] is not a function)

先看问题 解决方案 在HBuilderX项目中&#xff0c;若需在Web配置中显式关闭摇树优化&#xff08;Tree Shaking&#xff09;&#xff0c;可以通过以下步骤实现&#xff1a;首先&#xff0c;在配置中打开摇树优化&#xff0c;然后再将其关闭。这样操作后&#xff0c;配置文件中会…

【Redis】缓存穿透、缓存雪崩、缓存击穿

1.缓存穿透 是指客户端请求的数据在缓存中和数据库中都不存在&#xff0c;这样缓存永远不会生效&#xff0c;导致请求直接穿透缓存到达数据库&#xff0c;给数据库带来压力的情况。 常见的解决方案有两种&#xff1a; 缓存空对象&#xff1a;实现简单&#xff0c;维护方便&am…

告别数据僵尸!Redis实现自动清理过期键值对

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

web第三次课后作业--基于JDBC对mysql数据库的增删查改操作

一、工程搭建步骤 1.新建java项目&#xff0c;添加jdbc依赖 2.写java程序 3.添加mysql数据源&#xff0c;连接本地数据库 4.运行程序二、运行结果 三、代码 代码解析 加载数据驱动 try {Class.forName("com.mysql.jdbc.Driver"); } catch (ClassNotFoundExceptio…

[数据结构]5. 栈-Stack

栈-Stack 1. 介绍2. 栈的实现2.1 基于链表的实现2.2 基于数组的实现 3. 栈操作CreateInitilizateDestoryPushPopTopEmptySize 1. 介绍 栈&#xff08;stack&#xff09; 是一种遵循先入后出逻辑的线性数据结构。顶部称为“栈顶”&#xff0c;底部称为“栈底”。把元素添加到栈…

基于Spring Boot + Vue的高校心理教育辅导系统

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

JavaSwing之-JDialog

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

【学习路线】 游戏客户端开发入门到进阶

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

部署安装gitlab-ce-17.9.7-ce.0.el8.x86_64.rpm

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

备战菊厂笔试2-BFS记忆化MLE?用Set去重-Set会TLE?用SortedSet剪枝

目录 200.岛屿数量 不用getnei&#xff0c;直接在dfs判断&#xff0c;去掉解包 如果害怕栈溢出那么可以用bfs 2617.网格图中最少访问的格子数 注意特判&#xff01; MLE主要是因为vis占用的内存过大 用SortedSet有序剪枝 什么是SortedSet&#xff1f; 基本性质 导入 …

【RabbitMQ】发布确认机制的具体实现

文章目录 模式介绍建立连接单独确认代码实现逻辑运行结果 批量确认代码实现逻辑运行结果 异步确认实现逻辑介绍代码实现逻辑运行结果 三种策略对比以及完整代码 模式介绍 作为消息中间件&#xff0c;都会面临消息丢失的问题&#xff0c;消息丢失大概分为三种情况&#xff1a; …

React状态管理-对state进行保留和重置

相同位置的相同组件会使得 state 被保留下来 当你勾选或清空复选框的时候&#xff0c;计数器 state 并没有被重置。不管 isFancy 是 true 还是 false&#xff0c;根组件 App 返回的 div 的第一个子组件都是 <Counter />&#xff1a; 你可能以为当你勾选复选框的时候 st…

vue和springboot交互数据,使用axios【跨域问题】

vue和springboot交互数据&#xff0c;使用axios【跨域问题】 提示&#xff1a;帮帮志会陆续更新非常多的IT技术知识&#xff0c;希望分享的内容对您有用。本章分享的是node.js和vue的使用。前后每一小节的内容是存在的有&#xff1a;学习and理解的关联性。【帮帮志系列文章】&…

AJAX 使用 和 HTTP

ajax学习 promise和 awit Node.js 和 webpack 前端工程化 Git工具 AJAX异步的JS和XML&#xff1a; 使用XML对象和服务器通信 在这里插入图片描述 统一资源定位符 URL HTTP 超文本传输协议 域名 资源路径 资源目录和类型 URL 查询参数 使用&#xff1f;表示之后的参数…

MySQL之基础事务

目录 引言&#xff1a; 什么是事务&#xff1f; 事务和锁 mysql数据库控制台事务的几个重要操作指令&#xff08;transaction.sql&#xff09; 1、事物操作示意图&#xff1a; 2.事务的隔离级别 四种隔离级别&#xff1a; 总结一下隔离指令 1. 查看当前隔离级别​​ …

MySQL基础关键_013_常用 DBA 命令

目 录 一、MySQL 用户信息存储位置 二、新建用户 1.创建本地用户 2.创建外网用户 三、用户授权 1.说明 2.实例 四、撤销授权 五、修改用户密码 六、修改用户名、主机名/IP地址 七、删除用户 八、数据备份 1.导出数据 2.导入数据 &#xff08;1&#xff09;方式…

java基础:异常体系

目录 一、java异常体系介绍二、异常1、运行时异常2、非运行时异常 三、错误四、异常的处理方式1、方式1&#xff1a;throws声明抛出异常1.1、throws关键字1.2、throw关键字 2、方式2&#xff1a;try-catch-finally 一、java异常体系介绍 异常体系图如下&#xff1a; Throwable…