B040-SpringMVC进阶 JSON 上传下载 拦截器 执行流程

目录

      • 项目准备
      • JSON
        • JSON作用
        • JSON演示
        • @ResponseBody注解
        • 日期返回json格式
      • 文件上传与下载
        • 文件上传
          • 准备工作
          • 文件项
          • 上传文件完成
        • 文件下载
          • 文件下载页面
          • 下载业务代码
      • SpringMVC的执行流程

项目准备

大体步骤:

  1. 新建dynamic web project,
    修改默认输出的class路径,修改content directory名,勾选生成web.xml
  2. 拷贝SpringMVC核心配置文件
    开启扫描包路径 放行静态资源 使spring注解生效 视图解析器
  3. 拷贝web.xml
    前端控制器,过滤器
  4. 部署Tomcat
  5. 导包
  6. 编写TestController
  7. webapp\WEB-INF\views下新建index.jsp

测试

JSON

JSON作用

在这里插入图片描述

  1. 在实际开发中,通常需要和别的系统交换数据,数据交换的格式通常有XML和JSON等;
  2. JSON(JavaScript Object Notation:JavaScript对象表示法)是一种基于JavaScript 语法开放的轻量级数据交换格式,使用js语法来描述数据对象;
  3. JSON作为一个轻量级的数据格式,相对于XML,文档更小,结构清晰简洁,读写效率更高,XML需要很多的标签,在数据传输的时候无疑会消耗更多网络资源和流量:
    (1)用XML表示一个对象:
<person id="1"><name>tom</name><age>20</age><salary>5000.0</salary>
</person>

  (2)用JSON表示一个对象:{“id”:1,“name”:“tom”,“salary”:5000.0}

JSON演示
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title><script type="text/javascript">// 定义jsonvar obj = {"id":123,"name":"王天霸","age":30};// 弹出框alert(obj.name);alert(obj.age);var arr = [{"name":"tom","age":20},{"name":"jack","age":30}];alert(arr[1].age)alert(arr[0].name)</script>
</head>
<body></body>
</html>
@ResponseBody注解

会把数据转成json格式,并且不会走视图解析器了

@Controller
public class JsonController {/*** 返回一个json格式的user对象 * tips:406:缺少jar*/@RequestMapping("/user")@ResponseBody   // 会把数据转成json格式,并且不会走视图解析器了 public User json1(){User user = new User(111, "力很弱", 20);		return user;		}@RequestMapping("/list")@ResponseBody // 会把数据转成json格式,并且不会走视图解析器了 public List<User> json2(){User user1 = new User(111, "力很弱", 20);	User user2 = new User(222, "王天霸", 21);User user3 = new User(333, "阮经天", 22);List<User> list = new ArrayList<>();list.add(user1);list.add(user2);list.add(user3);return list;}
}
日期返回json格式

User

public class User {private Integer id;private String name;private Integer age;@JsonFormat(pattern="yyyy^_^MM^_^dd HH^_^mm^_^ss",timezone="GMT+8")private Date date;public User() {super();}public User(Integer id, String name, Integer age) {super();this.id = id;this.name = name;this.age = age;}public User(Integer id, String name, Integer age, Date date) {super();this.id = id;this.name = name;this.age = age;this.date = date;}public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}public Date getDate() {return date;}public void setDate(Date date) {this.date = date;}@Overridepublic String toString() {return "User [id=" + id + ", name=" + name + ", age=" + age + "]";}}

JsonController

	/*** 日期格式问题*/@RequestMapping("/date")@ResponseBodypublic User json3(){User user = new User(111, "力很弱", 20, new Date());		return user;		}

文件上传与下载

文件上传与下载实质都是IO流的读写操作

文件上传

文件上传:把本地资源上传到服务器,即将本地磁盘中的文件复制到服务器指定的地方
输入流(读) - 输出流(写)

准备工作

1.新建upload.html,填写上传表单

<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body><!-- 上传三要素:表单的提交的方式必须是postinput中必须有type="file" enctype:值必须是"multipart/form-data"--> <form action="/upload" method="post" enctype="multipart/form-data">	username: <input type="text" name="username"><br/>图片:<input type="file" name="photo"><br/><input type="submit" value="上传"></form>
</body>
</html>

2.导包
commons-fileupload-1.2.2.jar,commons-io-1.4.jar

3.上传解析器
SpringMVC.xml

<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"><!-- 设置上传文件的最大尺寸为1MB --><property name="maxUploadSize"><!-- spring el写法:1MB --><value>#{1024*1024}</value></property><!-- 效果同上 -->
<property name="maxUploadSize" value="1048576" />
</bean>
文件项

以前写的username,password。。。 :简单的表单项
文件上传: 复杂表单项

tips:文件名和路径名尽量不要重复,如upload

UploadController

@Controller
public class UploadController {/*** photo: 复杂表单项---以前获取参数的方式不行了* MultipartFile:文件项   接收的是一个地址值---包含了上传的内容了*/@RequestMapping("/upload")public String uploadFile(MultipartFile photo){boolean empty = photo.isEmpty();if (!empty) {String filename = photo.getOriginalFilename();System.out.println(filename);}return null;};
}
上传文件完成
@Controller
public class UploadController {/*** photo: 复杂表单项---以前获取参数的方式不行了* MultipartFile:文件项   接收的是一个地址值---包含了上传的内容了*/@RequestMapping("/upload")public String uploadFile(MultipartFile photo,HttpServletRequest request) throws IOException{if (!photo.isEmpty()) {// 获取当前项目路径String realPath = request.getServletContext().getRealPath("/upload1");// 获取文件名    u=19008.jpgString filename = photo.getOriginalFilename();			// 获取上传文件的后缀int index = filename.lastIndexOf(".");// 后缀String suffix = filename.substring(index);			// 随机生成一个文件名   1610434039685.xml// 获取时间戳long i = System.currentTimeMillis();			// 拼接之后的名字String name = i+suffix;	// 通过File构造获取一个完整的file路径File file = new File(realPath, name);			// 输入流InputStream input = photo.getInputStream();			// 获取输出流FileOutputStream output = new FileOutputStream(file);			// 上传的核心代码IOUtils.copy(input, output);			// 关流output.close();input.close();}// 重定向到当前页面return "redirect:/uploadFile.html";}
}
文件下载

从服务器将文件复制到本地磁盘中
重点:输入流,输出流

把download目录放入工程中代表服务器资源

文件下载页面

新建download.jsp

<%@page import="java.net.URLEncoder"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body><a href='/download?filename=<%=URLEncoder.encode("美女.jpg", "utf-8") %>'>美女.jpg</a><br/><a href="/download?filename=star.mp4">star.mp4</a><br/><a href="/download?filename=suiji.zip">suiji.zip</a><br/><a href="/download?filename=words.txt">words.txt</a><br/>
</body>
</html>

tips:要解决IE浏览器点击有中文的A标签报错400的问题,用uff-8编码解决

下载业务代码

tips:
1.要解决浏览器能打开就直接打开不下载的问题
2.要解决中文乱码的问题(文件名乱码)

DownloadController

@Controller
public class DownloadController {@RequestMapping("/download")public void download(String filename,HttpServletRequest req,HttpServletResponse resp) throws IOException{// 获取download路径String realPath = req.getServletContext().getRealPath("/download");		// 完整的file文件File file = new File(realPath, filename);			// 不同的浏览器去处理中文乱码方式if(req.getHeader("User-Agent").toUpperCase().indexOf("TRIDENT")!=-1){filename = URLEncoder.encode(filename, "utf-8");//电脑自带edge【edʒ】浏览器	}else if(req.getHeader("User-Agent").toUpperCase().indexOf("EDGE")!=-1){		filename = URLEncoder.encode(filename, "utf-8");}else{//其他浏览器filename = new String(filename.getBytes("UTF-8"),"ISO-8859-1");//转码的方式};			// 告诉浏览器我要以下载的方式处理这个文件resp.setHeader("Content-Disposition", "attachment; filename=" + filename);		// 获取输入流FileInputStream input = new FileInputStream(file);		// 获取响应输出流ServletOutputStream output = resp.getOutputStream();	// 核心代码IOUtils.copy(input, output);		// 关流output.close();input.close();}
}

SpringMVC的执行流程

四大器:前端控制器、处理器映射器、处理器适配器、视图解析器
前端控制器之前还有一个过滤器,之后有三个阶段的拦截器
在这里插入图片描述

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

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

相关文章

​ SK Ecoplant借助亚马逊云科技,海外服务器为环保事业注入新活力

在当今全球面临着资源紧缺和环境挑战的大背景下&#xff0c;数字技术所依赖的海外服务器正成为加速循环经济转型的关键利器。然而&#xff0c;很多企业在整合数字技术到运营中仍然面临着一系列挑战&#xff0c;依然存在低效流程导致的不必要浪费。针对这一问题&#xff0c;SK E…

确保调查问卷合理性:设计、实施与评估指南

在如今的信息时代&#xff0c;问卷调查成为了一种常见的数据采集方式。问卷广泛用于市场调研、科学研究、员工幸福评估等各个领域。但是&#xff0c;问卷调查的有效性和可靠性在于问卷设计和实施过程。怎么确保调查问卷的合理性&#xff1f;首先建立研究目的、正确选择问卷种类…

EDA实验-----直流电机驱动设计(Quartus II )

目录 一、实验目的 二、实验仪器设备 三、实验的重点和难点 四、实验原理 五、实验步骤 六、实验报告 七、实验过程 1.分频器代码 2.方向选择器 3.直流电动机工作原理 4.电路连接图 5.文件烧录 一、实验目的 了解直流电机控制的工作原理和实现的方法。掌握PWM波控…

Jupyter Notebook修改默认工作目录

1、参考修改Jupyter Notebook的默认工作目录_jupyter文件路径-CSDN博客修改配置文件 2.在上述博客内容的基础上&#xff0c;这里不是删除【%USERPROFILE%】而是把这个地方替换为所要设置的工作目录路径&#xff0c; 3.【起始位置】也可以更改为所要设置的工作目录路径&#x…

24V输入 输出12V 5A长时间 峰值6A 7A 40V耐压 8-10A输出 大功率降压

24V输入 输出12V 5A长时间 峰值6 A 7A 40V耐压 8-10A输出 大功率降压

动态内存分配(malloc和free​、calloc和realloc​)

目录 一、为什么要有动态内存分配​ 二、C/C中程序内存区域划分​ 三、malloc和free​ 2.1、malloc 2.2、free​ 四、calloc和realloc​ 3.1、calloc​ 3.2、realloc​ 3.3realloc在调整内存空间的是存在两种情况&#xff1a; 3.4realloc有malloc的功能 五、常见的动…

rk3568 bootLoader编译

Linux系统uboot、linux kernel、rootfs移植学习笔记&#xff08;一&#xff09;_uboot 删除环境变量-CSDN博客 板信息配置文件&#xff1a;device/rockchip/rk356x/BoardConfig-IAC-RK3568-MB-BETA-V1_00.mk uboot编译入口 Linux系统uboot、linux kernel、rootfs移植学习笔记&…

【jsonview去除排序】如何让jsonview不自动排序(已解决)

✈️涉及知识 如何取消JSON默认数值排序&#xff0c;JSON.parse()函数排序关闭&#xff0c;取消JSON.parse排序&#xff0c;Json格式化校验&#xff0c;jsonview排序问题解决方法。 &#x1f947;专栏&#x1f947;&#xff1a;前端技术&#xff0c;json格式化 &#x1f482;关…

天猫数据分析(天猫查数据工具):2023年天猫平台假发行业市场销售数据分析报告

如今&#xff0c;由于人们工作和生活的压力较大&#xff0c;居民脱发问题严重&#xff0c;且脱发群体倾向于80后和90后&#xff0c;逐渐向低龄化发展。除脱发外&#xff0c;在颜值经济的背景下&#xff0c;人们越来越注重外貌和形象&#xff0c;假发作为一种改善发型的工具&…

uniapp-uni-icons组件@click.stop失败解决~

你们好&#xff0c;我是金金金。 场景 可以看见我右侧有两个icon&#xff0c;点击的时候 会影响到折叠面板的打开&#xff0c;这让我很是苦恼&#xff0c;然后我使用了click.stop修饰符阻止事件冒泡 排查 排查之前我先贴一下代码 报错截图 可以看到找不到属性stopPropagation&…

Elasticsearch 性能调优基础知识

Elastic Stack 已成为监控任何环境或应用程序的实际解决方案。 从日志、指标和正常运行时间到性能监控甚至安全&#xff0c;Elastic Stack 已成为满足几乎所有监控需求的一体化解决方案。 Elasticsearch 通过提供强大的分析引擎来处理任何类型的数据&#xff0c;成为这方面的基…

全新Facebook养号指南,怎么做才能不被封号?

最近听很多跨境电商小伙伴们说 Facebook 又被封号了&#xff0c;可能是你的 Facebook 账号还不够稳定&#xff0c;或者说还没有足够的粉丝和互动。如果你想让自己的 Facebook 账号更加稳定&#xff0c;就需要养号。俗话说&#xff0c;一封回到解放前&#xff0c;为什么你明明有…

操作系统重装

一、老毛桃装机 随着时间的推移&#xff0c;笔记本电脑难免会变得越来越慢&#xff0c;甚至出现系统错误和崩溃等问题。这时候&#xff0c;重装系统可能是最好的解决方案。然而&#xff0c;对于大多数人来说&#xff0c;笔记本电脑重装系统可能会让他们感到无从下手。不要担心&…

软件工程--设计工程--学习笔记(软件设计原则、软件质量属性设计、架构风格......)

软件设计在软件工程中处于技术核心&#xff0c;其目的是把需求分析模型转变为设计模型&#xff0c;以知道软件的实现&#xff0c;本章讲解软件设计的基本原则和基本实践 本文参考教材&#xff1a;沈备军老师的《软件工程原理》 软件设计概述 软件设计分为两个阶段&#xff0…

读取spring boot项目resource目录下的文件

背景 项目开发过程中&#xff0c;有一些情况下将配置文件放在resource下能简化代码实现和部署时的打包步骤。例如&#xff1a; 项目中使用的数据库升级脚本、初始化脚本。将文件放到resource下&#xff0c;打包在jar包中&#xff0c;不能直接通过File路径读取。下面介绍两种读…

孩子还是有一颗网安梦——Bandit通关教程:Level 16 → Level 17

&#x1f575;️‍♂️ 专栏《解密游戏-Bandit》 &#x1f310; 游戏官网&#xff1a; Bandit游戏 &#x1f3ae; 游戏简介&#xff1a; Bandit游戏专为网络安全初学者设计&#xff0c;通过一系列级别挑战玩家&#xff0c;从Level0开始&#xff0c;逐步学习基础命令行和安全概念…

认识YAML和Propertis

✅作者简介&#xff1a;大家好&#xff0c;我是Leo&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Leo的博客 &#x1f49e;当前专栏&#xff1a; 循序渐进学SpringBoot ✨特色专栏&…

深度学习 Day21——J1ResNet-50算法实战与解析

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 | 接辅导、项目定制 文章目录 前言一、我的环境二、代码实现与执行结果1.引入库2.设置GPU&#xff08;如果使用的是CPU可以忽略这步&#xff09;3.导入数据4.查…

Qt中多线程使用案列

Qt中多线程下载大文件 #pragma once#include <QWidget> #include <QPushButton> #include "ThreadPool.h" #include <QProgressBar> #include <QLabel> #include <QHBoxLayout> #include <QVBoxLayout> class MainWindow : pub…

el-table 实现行拖拽排序

element ui 表格实现拖拽排序的功能&#xff0c;可以借助第三方插件Sortablejs来实现。 引入sortablejs npm install sortablejs --save组件中使用 import Sortable from sortablejs;<el-table ref"el-table":data"listData" row-key"id" …