SpringMVC处理Josn、文件上传下载、拦截器

java-web -- servlet 拦截器 过滤器使用 java-web servlet 拦截器 过滤器使用 java-web servlet 拦截器 过滤器使用 立即下载

一、处理JSON

JSON知识:

JSON 有两种格式:
① Json 对象:{key:value,key:value….},②Json数组:[value1, value2…]

Json 对象解析方式: 对象.key; Json 数组的解析方式:for循环遍历

java对象转Json: ① Bean 和 map —》Json 对象;② List —》 json数组

1、 返回JSON

加入 jar 包:
在这里插入图片描述

下载地址:地址

注意: 请根据自己的Spring版本下载最新的jar,否则有肯能会报错。

报错异常可以参考这篇博客:解决方案

SpringMVC处理json四个条件

​ ① 导入jackson的jar

​ ② 在springMVC的配置文件中开启MVC驱动,
<mvc:annotation-driven />
注意:
在这里插入图片描述

​ ③ 在处理ajax请求的方法上加上注解@ResponseBody

​ ④ 将要转换为json且响应到客户端的数据,直接作为该方法的返回值返回

代码演示:

index:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!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>测试json</title>
<script type="text/javascript" src="${request.servletContext.contextPath}/test01_json/jquery-1.6.4.min.js"></script>
<script type="text/javascript" src="<c:url value='/test01_json/jquery-1.6.4.min.js'/>"></script>

</head>
<body>
       request.servletContext.contextPath= ${pageContext.request.servletContext.contextPath}<br/>
       request.contextPath= ${pageContext.request.contextPath}<br/>
       <input  type="button" value="响应是Json"  onclick="getJson();"/><br/>
       <script type="text/javascript">
             function getJson(){
            	   $.ajax({
            		   data:"sid=1",  /*请求参数*/
            		   type:"POST",  /*请求方式*/
            		   dataType:"json",/*期待服务器端的响应数据的格式*/
            		   url:"<c:url value='/test01/jsonMethod1.action'/>",/*请求的url*/
            		   async:true,/*是否异步*/
            		   success:function(data){/*成功回调函数*/
            			    alert(data.sid+":"+data.sname+":"+data.score+":"+data.sex);
            		   }
            	   });
             }
       </script>
       <input  type="button" value="请求是Json"  onclick="sendJson1();"/><br/>
       <script type="text/javascript">
             function sendJson1(){
            	   var studentJson='{"sid":101,"sname":"韩梅梅","sex":"女","score":12.5}';
            	   $.ajax({
            		   data:studentJson,  /*请求参数*/
            		   contentType: "application/json;charset=UTF-8",
            		   type:"POST",  /*请求方式*/
            		   dataType:"text",/*期待服务器端的响应数据的格式*/
            		   url:"<c:url value='/test01/jsonMethod2.action'/>",/*请求的url*/
            		   async:true,/*是否异步*/
            		   success:function(data){/*成功回调函数*/
            			    alert(data);
            		   }
            	   });
             }
       </script>
       <input  type="button" value="请求是Json"  onclick="sendJson2();"/><br/>
       <script type="text/javascript">
             function sendJson2(){
            	   var studentJson='{"sid":102,"sname":"韩梅梅","sex":"女","score":12.5}';
            	   //alert(studentJson);
            	   //alert(studentJson.sid+"::"+studentJson.sname);
            	   $.ajax({
            		   data:studentJson,  /*请求参数*/
            		   contentType: "application/json;charset=UTF-8",
            		   type:"POST",  /*请求方式*/
            		   dataType:"text",/*期待服务器端的响应数据的格式*/
            		   url:"<c:url value='/test01/jsonMethod3.action'/>",/*请求的url*/
            		   async:true,/*是否异步*/
            		   success:function(data){/*成功回调函数*/
            			    alert(data);
            		   }
            	   });
             }
       </script>
       
       <input  type="button" value="请求和响应都是Json"  onclick="sendAndGetJson();"/><br/>
       <script type="text/javascript">
             function sendAndGetJson(){
            	   var studentJson='{"sid":102,"sname":"韩梅梅","sex":"女","score":12.5}';
            	   $.ajax({
            		   data:studentJson,  /*请求参数*/
            		   contentType: "application/json;charset=UTF-8",
            		   type:"POST",  /*请求方式*/
            		   dataType:"json",/*期待服务器端的响应数据的格式*/
            		   url:"<c:url value='/test01/jsonMethod4.action'/>",/*请求的url*/
            		   async:true,/*是否异步*/
            		   success:function(data){/*成功回调函数*/
            			    alert(data);
            			    alert(data.sid+":"+data.sname+":"+data.score+":"+data.sex);
            		   }
            	   });
             }
       </script>
        <input  type="button" value="响应是Json--map"  onclick="getJson5();"/><br/>
       <script type="text/javascript">
             function getJson5(){
            	   $.ajax({
            		   data:null,  /*请求参数*/
            		   type:"POST",  /*请求方式*/
            		   dataType:"json",/*期待服务器端的响应数据的格式*/
            		   url:"<c:url value='/test01/jsonMethod5.action'/>",/*请求的url*/
            		   async:true,/*是否异步*/
            		   success:function(data){/*成功回调函数*/
            			    alert(data);
            			    alert(data.count);
            		   }
            	   });
             }
       </script>

controller:

@Controller
@RequestMapping("/test1")
public class JsonController {
    @RequestMapping("/method1.action")
    @ResponseBody//把相应的java对象转换成json返回给前端
    public Student method1(int sid){
        System.out.println("sid"+sid);
        Student student = new Student("小脑斧",1,"男",92f);
        return student;
    }
    @RequestMapping("/jsonMethod2.action")
	//@ResponseBody
    public void jsonMethod02(@RequestBody Student s,HttpServletResponse res) throws Exception{
		   //@RequestBody用对象Student接受请求的json对象
		   System.out.println(s);
		   res.setCharacterEncoding("utf-8");
		   res.setContentType("text/html;charset=utf-8");
		   res.getWriter().print("success1");
	}
	
	@RequestMapping("/jsonMethod3.action")
    @ResponseBody//响应的是字符串
    public String jsonMethod03(@RequestBody Student s) throws Exception{
		  //@RequestBody用对象Student接受请求的json对象
		   System.out.println(s);
		   return "success2";
	}
	@RequestMapping("/jsonMethod4.action")
    @ResponseBody//响应的是字符串
    public Student jsonMethod04(@RequestBody Student s) throws Exception{
		    //@RequestBody用对象Student接受请求的json对象
		   System.out.println(s);
		   Student ss=new Student("韩梅2", 22, "男", 22.5f);
		   return ss;
	}
	
	@RequestMapping("/jsonMethod5.action")
	@ResponseBody//指定响应是json:::把响应的java对象转换为json串
    public  Map<String, Object> jsonMethod05() {
		   Map<String, Object> map=new HashMap<String, Object>();
		   map.put("count", 11);
		   return map;
	}
}

文件上传:

导入jar包:在这里插入图片描述
在springmvc的核心装配文件中配置:
在这里插入图片描述

创建jsp::post提交+设置enctype+file
在这里插入图片描述

创建action:通过multipartfile来接受file域
MultipartFile的方法:
在这里插入图片描述
创建action:

在这里插入图片描述

@RequestMapping(value = "/up" ,method = RequestMethod.POST)
   public String up (String desc, MultipartFile uploadFile, HttpSession session) throws IOException {
       // 获取上传文件的名称
       String filename = uploadFile.getOriginalFilename();
       String path = session.getServletContext().getRealPath("phone") + File.separator + filename;
       // 获取输入流
       InputStream is = uploadFile.getInputStream();
       // 获取输出流
       File file = new File(path);
       OutputStream fos = new FileOutputStream(file);
       byte[] bt = new byte[1024];
       int len;
       while((len = is.read(bt)) != -1){
           fos.write(bt, 0, len);
       }
       is.close();
       fos.close();
       return "success";
   }

@RequestMapping(value = "/up",method = RequestMethod.POST)
public String up (MultipartFile uploadFile, HttpSession session) throws IOException {
    // 获取上传文件的名称
    String filename = uploadFile.getOriginalFilename();
    String finalFileName = UUID.randomUUID() + filename.substring(filename.lastIndexOf("."));
    String path = session.getServletContext().getRealPath("phone") + File.separator + finalFileName;
    File file = new File(path);
    uploadFile.transferTo(file);
    return "success";
}

在web.xml中设置初始化参数 指定文件保存的路径
在这里插入图片描述

文件下载:

Jsp:
在这里插入图片描述

Web.xml:在这里插入图片描述

Action:
在这里插入图片描述

@RequestMapping(value = "/down")
public ResponseEntity<byte[]> down(HttpSession session) throws Exception {

    // 获取下载文件的路径
    String realPath = session.getServletContext().getRealPath("img");
    String finalPath = realPath + File.separator + "2.jpg";
    InputStream is = new FileInputStream(finalPath);
    // available():获取输入流所读取的文件的最大字节数
    byte[] bt = new byte[is.available()];
    is.read(bt);

    // 设置请求头
    HttpHeaders headers = new HttpHeaders();
    headers.add("Content-Disposition","attachment;filename=zzz.jpg");//这里可以动态加文件名字
    // 设置响应状态
    HttpStatus status = HttpStatus.OK;
    ResponseEntity<byte[]> entity = new ResponseEntity<>(bt, headers, status);
    return entity;
}

拦截器

1、 自定义拦截器

​ Spring MVC 也可以使用拦截器对请求进行拦截处理,用户可以自定义拦截器来实现特定的 功 能 , 自 定 义 的 拦 截 器 可 以 实 现 HandlerInterceptor 接 口 , 也 可 以 继 承 HandlerInterceptorAdapter 适配器类 。

preHandle():这个方法在业务处理器处理请求之前被调用,在该方法中对用户请求request 进行处理。如果程序员决定该拦截器对请求进行拦截处理后还要调用其他的拦截器,或者是业务处理器去进行处理,则返回 true;如果程序员决定不需要再调用其他的组件去处理请求,则返回 false。
postHandle(): 这个方法在业务处理器处理完请求后,但是 DispatcherServlet 向客户端返回响应前被调用,在该方法中对用户请求 request 进行处理。

afterCompletion():这个方法在 DispatcherServlet 完全处理完请求后被调用,可以在该方法中进行一些资源清理的操作。 `

在这里插入图片描述配置拦截器:
在这里插入图片描述

过滤器和拦截器的区别

相同之处: 基本功能相似
都可以对指定的请求进行拦截 进行预处理、权限管理、日志记录等操作
都是aop编程思想的体现

不同之处:1 实现接口不同
过滤器Filter实现接口:javax.servlet.Filter接口
拦截器Interceptor实现接口:org.springframework.web.servlet.HanderInteceptor接口
2 是否依赖web容器
Filter是servlet规范 需要web应用服务器解析
Interceptor由spring容器支持 不依赖web容器
3 实现原理不同
Filter是函数回调
Interceptor是反射和动态代理
4 适用的项目不同
Filter只使用于web项目
Interceptor使用于所有项目中

其他总结:
在这里插入图片描述

【Unity Shader】2D模型 3D模型混用的穿模问题(Spine在3D场景中出现前后穿模问题的解决办法) 问题描述: 在3D场景中使用Spine模型(2D), 因为Spine需要像Billboard类似的处理,永远是垂直与相机的, 所以一般情况下2D模型能正常显示且前后的阻挡关系也是没有问题的,如下图所示,一切都很美好.(这里用一个四边形,图中的福字表示2D模型) 可是如果后面蓝色的格子比较高,或者2D角色本身也比较高,那么就会出现模型穿插的问题,如下图所示: 如果吧2D模型竖立起来,前后关系肯定是没有问题的,所以也能避免模型穿插的问题,可是就没有Billboard效果,圆形的福字已经被压扁了,如下图: 阅读详情

相关推荐

永磁同步电机高效标定技术:从理论到实践的全面解析

本文全面解析永磁同步电机高效标定技术,从MTPA标定、弱磁区优化到初始角校准,详细介绍了理论原理和实战技巧。针对新能源汽车应用场景,提供标定系统集成要点和AI辅助优化方案,帮助工程师提升电机性能标定效率与精度。

weixin_28452161的博客 505

(简易详细)spring boot 使用拦截器 实现拦截前端请求并返回json到前端页面

(简易详细)spring boot 使用拦截器 实现拦截前端请求并返回json到前端页面

大雾起了清晨 4968

【UE 反射】反射的原理是什么?如何使用机制?

静态类型检查确保了类型的早期一致性和高效的代码执行,但减少了灵活性。动态类型检查提供了更大的灵活性,但增加了运行时的开销和潜在的错误。反射作为一种动态特性,无论是在静态类型语言还是动态类型语言中,都提供了强大的运行时类型操作能力,但也伴随着性能和安全性方面的权衡。通过理解这些联系,开发者可以在不同的编程语言和应用场景中选择适合的类型检查方式和反射机制,以实现所需的动态行为和灵活性,同时保证性能和安全性。

hhw_hhw的博客 6034

springMVC拦截器从Request中获取Json格式并解决request的请求流只能读取一次的问题

背景 在使用SSM(你问我什么叫SSM,我一拳锤爆你的狗头)做开发的时候,经常会使用@RequestBody注解,这个注解是非常的好用。但是如果你想在请求参数传到后台的时候做一个参数检验,当然可以!使用SpringMVC的拦截器,在拦截器里把request的数据读取出来不就行了!!,但是在使用了拦截器的时候会出现一个问题!!!!你在拦截器读取了request的数据,在Controller里...

菜鸟sdut的博客 2万+

别再手动巡检了!用Zabbix 5.0 + SNMPv2自动监控华为S系列交换机(附完整命令集)

本文详细介绍了如何利用Zabbix 5.0与SNMPv2实现华为S系列交换机的自动化监控,告别低效的手动巡检。通过配置SNMPv2c安全基线、核心功能启用及Zabbix Server端深度配置,构建7×24小时监控体系,实时预警接口状态、流量波动等关键指标,大幅提升运维效率与故障响应速度。

weixin_30940783的博客 630

DC算法竞赛——北京PM2.5浓度回归分析

北京PM2.5浓度回归分析 比赛结果(118/1150) 一. 概述 1、项目来源:https://www.dcjingsai.com/static_page/cmpList.html 2、给定数据字段如下: 3、使用方法:回归算法 4、目的:预测北京pm2.5值,使平均预测误差越小越好。 二、分析过程 setwd("E:/R数据源") #读入数据 data <- read.csv('p...

玻璃球的博客 3475

Post请求 参数为josn的传参方式

请求如下,我们在代码中如何通过url拼接的方式来发送请求 代码如下: 传参工具封装如下: public static String HttpPostWithJson(String url, String json) { String returnValue = "这是默认返回值,接口调用失败"; CloseableHttpClient httpClient = HttpClients....

ZCR的博客 2336

STM32CubeIDE之SHT3X温湿度传感器移植HAL库

有了前面的OLED的学习,这个学习起来也很快。 分以下几步走 1.你要有个温度传感器,SHT3X这个型号的,因为我要讲这个 2.你要有个STM32开发板(我用的是STM32L431RCT) 3.顺便找台电脑下载一个STM32CubeIDE 4.简单的找一个SHT3X的驱动,我是去某宝嫖的,一般卖这个的都有,这个驱动分两个文件,是.c和.h的,我直接把这两个放在下边 读了我上一篇的人,看这个应该很熟悉吧,一样的套路,学习方法是一样的,你就照搬就行 下面是sht3x.c的原文档,里面有个CRC..

qq_47736089的博客 2316

拦截器和图片上传下载

Interceptor implements Interceptor extends AbstractInterceptor 与filter的区别:先过filter再过interceptor org.apache.struts2.interceptor.FileUploadInterceptor 文件上传: 三种上传的方案 三种上传方案 虚拟路径与真实路径 /upload copyFile与cop...

Kikyou994755的博客 480

UR5 机械臂手眼标定(Eye-in-Hand)实战:OpenCV 求解 AX=XB,误差 < 2mm

本文详细介绍了UR5机械臂在Eye-in-Hand配置下的手眼标定实战,通过OpenCV实现高精度标定,最终达到误差小于2mm的工业级精度要求。文章涵盖了标定基础原理、环境搭建、数据采集策略、核心算法实现及误差分析与优化,为视觉机械臂的自主抓取提供了实用指南。

weixin_31476015的博客 295

无符号整数、带符号整数溢出问题

让我们详细讲解一下带符号整数溢出和无符号整数溢出问题中,符号标志位 (SF)、零标志位 (ZF) 和进位标志位 (CF) 的行为方式

weixin_49342084的博客 2090

React基础:列表渲染、生命周期

列表渲染 数组中元素可以直接渲染 class Fun extends React.Component { constructor(props) { super(props); this.state = {}; } render() { return ( <div> <h1>{this.props.params}</h1>

weixin_41897680的博客 272

11-16 Fluent结果查看及后处理功能(做动画、监控点)

监控点、面及动画操作

zheaa的博客 1万+

SpringMVC---拦截器、文件上传下载

18 拦截器 18.1 概述 SpringMVC中的处理器拦截器类似于Servlet开发中的过滤器Filter,用于对处理处理器进行预处理或者是后处理。 过滤器和拦截器的区别:拦截器是AOP思想的具体应用。 过滤器 servlet规范中的一部分,任何JavaWeb工程都可以使用。 在url-pattern中配置了/*之后,可以对所有要访问的资源进行拦截。 拦截器 拦截器是SpringMVC框架自己实现的,只有使用了SpringMVC框架的工程才能使用。 拦截器只会拦截访问的控制器方法(Controll

Srwici的博客 305

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Servlet 过滤器、拦截器、监听器以及文件上传下载

在学习之初,总是对过滤器、拦截器、监听器这三个搞不清楚,现在进行一些记录,方便大家交流,也为了提高自身的学习能力! 如果想要了解这三个的作用,首先对servlet流程进行熟悉了解,servlet是客户端(浏览器)与服务器之间的沟通桥梁,可以简单的理解为我们手机想要和电脑之间进行传输数据的USB。 <servlet> <servlet-nam...

angxing4650的博客 277

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

InnoDB 内存结构总览:Change Buffer、AHI 与 Log Buffer

本文系统梳理InnoDB内存结构中的ChangeBuffer、Adaptive Hash Index(AHI)与LogBuffer。ChangeBuffer缓存二级索引页不在内存时的变更,减少随机IO,仅在页加载时合并;聚簇索引修改立即执行,因数据本身不可延后。AHI基于高频等值查询自动构建哈希索引,加速定位,仅支持等值操作。LogBuffer为redo log内存缓冲,配合磁盘日志实现崩溃恢复。三者均服务于性能优化,其中ChangeBuffer与AHI共享BufferPool空间,而LogBuffer独立

bksczm的博客 296

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

信创环境下PageOffice文档控件适配与实践

信创适配做到文档控件这一层,拼的已经不是"有没有国产版本",而是同一个功能在两类终端上是否真的等价。等价的标准很具体:同一次点击能得到同样的结果,同一份公文能得到同样的版式,同一个项目不需要维护两套代码。这背后是三件并不轻松的工作:服务端用一套接口同时支撑两类终端,客户端把两种系统与四种芯片的安装包分发清楚,文档内核层由产品侧跟着 WPS 的版本走。浏览器这一层的压力,则被收进了产品自己的窗口里——升级节奏由产品掌握,不再交给运气。

zi_wu_xian的专栏 326

第三篇 第 6 课

前置:第三篇第 1 课(stdx 引入),第二篇第 1 课(std.regex)。环境:仓颉 SDK 1.2.0。本文所有代码与输出均逐行实测。

weixin_41618057的博客 514

V8 机制、手写核心函数与 TypeScript 类型体操

或固定初始化(如数组先定长、对象先给全字段)保持类型与形状稳定;这些都比"换框架"更基础。只能处理纯数据(丢函数、Date、RegExp、循环引用报错)。生产级深拷贝要处理:原始值短路、循环引用、V8(Chrome / Node 的 JS 引擎)不是"解释一行跑一行"那么简单,它用。图:V8 执行流程——解释执行 + 热点优化,优化失败会 Deopt 回退。JS 内存自动管理,但"自动"不等于"不会漏"。是"固定间隔最多执行一次"。手写 Promise 是"懂异步"的试金石。是"停下后才执行最后一次",

qq_38468358的博客 351

【从零理解 Spring AI · 12】MCP 的两种角色:做客户端还是做服务端

上一篇讲了 MCP 的概念:标准协议、三大角色、M+N 替代 M×N。

nice_lcj520的博客 534

Java 集合容器高频面试题全解:HashMap 树化阈值、1.7 死循环与 ConcurrentHashMap 演进(2026 招聘 JD 真题复盘)

HashMap 树化阈值 8 的泊松分布依据、退化阈值 6 的防抖设计、JDK 1.7 头插成环死循环的排查与修复、1.8 尾插后为何仍线程不安全、ConcurrentHashMap 放弃分段锁的原因与 ForwardingNode 协作扩容、computeIfAbsent 死锁陷阱、大集合找重复的场景题选型,附三层追问链自测。题目来源为 38 期公开招聘 JD 样本与字节、拼多多、建行、美团、快手公开面经。

蒙眼过河 418

spdlog 同步日志库使用详解

spdlog是一个轻量级 C++ 日志库,支持同步日志、异步日志、多线程日志、日志文件轮转和自定义日志格式。对于嵌入式 Linux 应用开发,我建议先使用。它可以帮我们完成:日志级别过滤。时间戳和线程 ID 输出。日志格式化。终端和文件输出。多线程安全写入。日志文件按大小或时间轮转。我们不需要自己实现互斥锁、文件写入、日志格式化和轮转等底层功能。

zengjiajun2006的博客 1118

JavaSE通关手册:数据类型与变量

代码无需额外处理,编译时编译器自动完成转换。

xys_678的博客 209

Java 多态 学习笔记

多态是面向对象编程的重要特性,指同一操作作用于不同对象时产生不同行为。其核心在于“父类引用指向子类对象”,结合方法重写实现运行时动态绑定。多态使代码更灵活、可扩展,如用Person p = new Student();统一处理各类人员注册,无需修改调用逻辑。但多态无法直接调用子类特有方法,需通过instanceof判断并强制转换。编译时看左边(类型),运行时看右边(实际对象),实现解耦与维护便利。

AA_AA114514的博客 367
上一篇: 数据结构(二)
下一篇: MongoDB快速上手、windows安装、常用命令、文档基本增删改查、mongoDB的索引
·小脑斧·
博客等级 码龄7年 10粉丝 46原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值