SpringMVC处理Json、文件上传、拦截器
处理JSON
链接
http://repo1.maven.org/maven2/com/fasterxml/jackson/core/
步骤
编写目标方法,使其返回 JSON 对应的对象或集合
12345 |
@ResponseBody //SpringMVC对JSON的支持@RequestMapping("/testJSON")public Collection<Employee> testJSON(){return employeeDao.getAll();} |
idex.jsp
1234567891011121314151617 |
<%@ 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><script type="text/javascript" src="scripts/jquery-1.9.1.min.js"></script> </head><body><a id="testJSON" href="testJSON">testJSON</a></body></html></body></html> |
原理
HttpMessageConverter<T>:
HttpMessageConverter<T>是 Spring3.0 新添加的一个接口,负责将请求信息转换为一个对象(类型为T),将对象(类型为T)输出为响应信息
HttpMessageConverter<T>接口定义的方法:
Boolean canRead(Class<?> clazz,MediaType mediaType): 指定转换器可以读取的对象类型,即转换器是否可将请求信息转换为 clazz 类型的对象,同时指定支持 MIME 类型(text/html,applaiction/json等)
Boolean canWrite(Class<?> clazz,MediaType mediaType):指定转换器是否可将 clazz 类型的对象写到响应流中,响应流支持的媒体类型在MediaType 中定义。
List<MediaType>getSupportMediaTypes():该转换器支持的媒体类型。
T read(Class<? extends <T> clazz,HttpInputMessage inputMessage):将请求信息流转换为 T 类型的对象。
void write(T t,MediaType contnetType,HttpOutputMessgae outputMessage):将T类型的对象写到响应流中,同时指定相应的媒体类型为 contentType。
12345678910111213141516171819202122 |
package org.springframework.http; import java.io.IOException;import java.io.InputStream; public interface HttpInputMessage extends HttpMessage { InputStream getBody() throws IOException; } package org.springframework.http; import java.io.IOException;import java.io.OutputStream; public interface HttpOutputMessage extends HttpMessage { OutputStream getBody() throws IOException; } |
DispatcherServlet 默认装配 RequestMappingHandlerAdapter ,而 RequestMappingHandlerAdapter 默认装配如下 HttpMessageConverter:
加入 jackson jar 包后, RequestMappingHandlerAdapter 装配的 HttpMessageConverter 如下:
默认情况下数组长度是6个;增加了jackson的包,后多个一个MappingJackson2HttpMessageConverte
文件上传
Spring MVC 为文件上传提供了直接的支持,这种支持是通过即插即用的 MultipartResolver 实现的。
Spring 用 Jakarta Commons FileUpload 技术实现了一个 MultipartResolver 实现类:CommonsMultipartResolver
Spring MVC上下文中默认没有装配MultipartResovler,因此默认情况下不能处理文件的上传工作,如果想使用 Spring 的文件上传功能,需现在上下文中配置 MultipartResolver
配置MultipartResolver defaultEncoding: 必须和用户JSP 的 pageEncoding 属性一致,以便正确解析表单的内容,为了让 CommonsMultipartResolver 正确工作,必须先将 Jakarta Commons FileUpload 及 Jakarta Commons io 的类包添加到类路径下。
案例
SpringFileHandler
12345678910111213141516171819202122232425 |
/** * 文件的上传 * 上传的原理:将本地文件上传到服务器端 */ @RequestMapping("/upload") public void testUploadFile(@RequestParam("desc") String desc, @RequestParam("uploadFile") MultipartFile uploadFile, HttpSession session) throws IOException { //获取到上传文件的名字 String uploadFileName = uploadFile.getOriginalFilename(); //获取输入流 InputStream in = uploadFile.getInputStream(); //获取服务器端的uploads的真实路径 ServletContext sc = session.getServletContext(); String realPath = sc.getRealPath("uploads"); System.out.println(realPath); File targetFile = new File(realPath + "/" + uploadFileName); FileOutputStream os = new FileOutputStream(targetFile); //写文件 int i; while ((i = in.read()) != -1) { os.write(i); } in.close(); os.close(); System.out.println(uploadFileName + "上传成功!"); } |
springmvc.xml
1234567891011121314151617181920212223242526 |
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd"> <!-- 组件扫描 --> <context:component-scan base-package="com.hph.springmvc"></context:component-scan> <!-- 视图解析器 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/views/"></property> <property name="suffix" value=".jsp"></property> </bean> <mvc:default-servlet-handler/> <mvc:annotation-driven/> <!--配置文件上传 必须配置ie--> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <!-- 保证与上传表单所在的Jsp页面的编码一致. --> <property name="defaultEncoding" value="utf-8"></property> <property name="maxUploadSize" value="10485760"></property> </bean></beans> |
web.xml配置
12345678910111213141516171819202122232425262728293031323334353637383940414243 |
<?xml version="1.0" encoding="UTF-8"?><web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"> <!-- 字符编码过滤器 --> <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> <!-- REST 过滤器 --> <filter> <filter-name>HiddenHttpMethodFilter</filter-name> <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class> </filter> <filter-mapping> <filter-name>HiddenHttpMethodFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!-- 前端控制器 --> <servlet> <servlet-name>springDispatcherServlet</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:springmvc.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>springDispatcherServlet</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping></web-app> |
index.jsp
12345678910111213141516 |
<%@ page contentType="text/html;charset=UTF-8" language="java" %><html><head> <title>FileTest</title></head><body> <form action="upload" method="post" enctype="multipart/form-data"> 上传文件:<input type="file" name="uploadFile"> <br> 文件描述:<input type="text" name="desc"> <br> <input type="submit" value="上传"></form></body></html> |
测试
成功上传到服务器端
多文件上传
SpringFileHandler
123456789101112131415 |
/** * 上传多个文件 */ @RequestMapping(value = "/manyFileUpload", method = RequestMethod.POST) public String manyFileUpload(@RequestParam("files") MultipartFile[] file, HttpSession session) throws IOException { //获取服务器端的uploads的真实路径 ServletContext sc = session.getServletContext(); String realPath = sc.getRealPath("uploads"); for (MultipartFile multipartFile : file) { if (!multipartFile.isEmpty()) { multipartFile.transferTo(new File(realPath + "/" + multipartFile.getOriginalFilename())); } } return "success"; } |
index.jps
1234567891011121314151617181920212223 |
<%@ page contentType="text/html;charset=UTF-8" language="java" %><html><head> <title>FileTest</title></head><body> <form action="upload" method="post" enctype="multipart/form-data"> 上传文件:<input type="file" name="uploadFile"> <br> 文件描述:<input type="text" name="desc"> <br> <input type="submit" value="上传"></form><br><h2>上传多个文件 实例</h2><form action="manyFileUpload" method="post" enctype="multipart/form-data"> <p>选择文件:<input type="file" name="files"></p> <p>选择文件:<input type="file" name="files"></p> <p><input type="submit" value="提交"></p></form></body></html> |
测试
文件下载
数据准备
SpringFileHandler
12345678910111213141516171819202122232425262728293031 |
/** * 使用HttpMessageConveter完成下载功能 * 支持 @RequestBody @ResponsBody Httpentity ResponseEntity * <p> * 下载的原理: 将服务器端的文件已流的形式写到客户端 * ResponseEntity:将要在的文件数据,以及一些响应信息封装到ResponseEntity对象中,浏览器通过解析发送回去的解析发送回去的响应数据就可以进行下载操作 */ @RequestMapping("/download") public ResponseEntity<byte[]> testDownload(HttpSession session) throws Exception { //将要下载的文件读取成一个z字节数组 byte[] imgs; ServletContext sc = session.getServletContext(); InputStream in = sc.getResourceAsStream("image/test.png"); imgs = new byte[in.available()]; in.read(imgs); //响应数据,以及响应头信息封装到ResponseEntity中 /** * 参数: * 1.要发送给浏览器的数据 * 2.设置响应头 * 3.设置响应码 */ HttpHeaders headers = new HttpHeaders(); headers.add("Content-Disposition", "attachment;filename=test.png"); HttpStatus statusCode = HttpStatus.OK; //200 ResponseEntity<byte[]> re = new ResponseEntity<byte[]>(imgs, headers, statusCode); return re; } |
拦截器
Spring MVC也可以使用拦截器对请求进行拦截处理,用户可以自定义拦截器来实现特定的功能,自定义的拦截器必须实现HandlerInterceptor接口
preHandle():这个方法在业务处理器处理请求之前被调用,在该方法中对用户请求 request 进行处理。如果程序员决定该拦截器对请求进行拦截处理后还要调用其他的拦截器,或者是业务处理器去进行处理,则返回true;如果程序员决定不需要再调用其他的组件去处理请求,则返回fals。
postHandle():这个方法在业务处理器处理完请求后,但是DispatcherServlet 向客户端返回响应前被调用,在该方法中对用户请求request进行处理。
afterCompletion():这个方法在 DispatcherServlet 完全处理完请求后被调用,可以在该方法中进行一些资源清理的操作。
12345678910111213141516171819202122232425262728293031 |
package com.hph.springmvc.interceptor; import org.springframework.stereotype.Component;import org.springframework.web.servlet.HandlerInterceptor;import org.springframework.web.servlet.ModelAndView; import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse; /** * 自定义拦截器 */@Componentpublic class MyFirstInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception { System.out.println("MyFirstInterceptor preHandler"); return true; } @Override public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception { System.out.println("MyFirstInterceptor postHandle"); } @Override public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception { System.out.println("MyFirstInterceptor afterCompletion"); }} |
案例
springmvc.xml
12345678910111213141516171819202122232425262728293031 |
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd"> <!-- 组件扫描 --> <context:component-scan base-package="com.hph.springmvc"></context:component-scan> <!-- 视图解析器 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/views/"></property> <property name="suffix" value=".jsp"></property> </bean> <mvc:default-servlet-handler/> <mvc:annotation-driven/> <!--配置文件上传 必须配置ie--> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <!-- 保证与上传表单所在的Jsp页面的编码一致. --> <property name="defaultEncoding" value="utf-8"></property> <property name="maxUploadSize" value="10485760"></property> </bean> <!--配置拦截器--> <mvc:interceptors> <!--1.拦截所有的请求--> <bean class="com.hph.springmvc.interceptor.MyFirstInterceptor"></bean> </mvc:interceptors></beans> |
MyFirstInterceptor
12345678910111213141516171819202122232425262728293031 |
package com.hph.springmvc.interceptor; import org.springframework.stereotype.Component;import org.springframework.web.servlet.HandlerInterceptor;import org.springframework.web.servlet.ModelAndView; import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse; /** * 自定义拦截器 */@Componentpublic class MyFirstInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception { System.out.println("MyFirstInterceptor preHandler"); return true; } @Override public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception { System.out.println("MyFirstInterceptor postHandle"); } @Override public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception { System.out.println("MyFirstInterceptor afterCompletion"); }} |
测试
多个拦截器配置
MyFirstInterceptor
12345678910111213141516171819202122232425262728293031 |
package com.hph.springmvc.interceptor; import org.springframework.stereotype.Component; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * 自定义拦截器 */@Componentpublic class MyFirstInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception { System.out.println("MyFirstInterceptor preHandler"); return true; } @Override public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception { System.out.println("MyFirstInterceptor postHandle"); } @Override public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception { System.out.println("MyFirstInterceptor afterCompletion"); }} |
MySecondInterceptor
12345678910111213141516171819202122232425262728 |
package com.hph.springmvc.interceptor; import org.springframework.web.servlet.HandlerInterceptor;import org.springframework.web.servlet.ModelAndView; import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse; public class MySecondInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception { System.out.println("[MySecondInterceptor preHandler]"); return false; } @Override public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception { System.out.println("[MySecondInterceptor postHandle]"); } @Override public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception { System.out.println("[MySecondInterceptor afterCompletion]"); }} |
SpringMVC处理Json、文件上传、拦截器相关推荐
- spring文件上传拦截器及异常处理
1文件上传 当enctype="multipart/form-data"时request.getParameter()方法失效 单文件上传 导入坐标 <dependency& ...
- jquery.form.js java_使用jQuery.form.js/springmvc框架实现文件上传功能
使用的技术有jquery.form.js框架, 以及springmvc框架.主要实现异步文件上传的同时封装对象,以及一些注意事项. 功能本身是很简单的,但是涉及到一些传递参数类型的问题.例如:jque ...
- (转)SpringMVC学习(九)——SpringMVC中实现文件上传
http://blog.csdn.net/yerenyuan_pku/article/details/72511975 这一篇博文主要来总结下SpringMVC中实现文件上传的步骤.但这里我只讲单个文 ...
- SpringMVC中的文件上传与下载
文件上传: apache上传组件方案 添加依赖 <!-- https://mvnrepository.com/artifact/commons-fileupload/commons-fileup ...
- [C# 网络编程系列]专题十一:实现一个基于FTP协议的程序——文件上传下载器...
引言: 在这个专题将为大家揭开下FTP这个协议的面纱,其实学习知识和生活中的例子都是很相通的,就拿这个专题来说,要了解FTP协议然后根据FTP协议实现一个文件下载器,就和和追MM是差不多的过程的,相信 ...
- java mvc上传文件进度_java相关:springMVC+ajax实现文件上传且带进度条实例
java相关:springMVC+ajax实现文件上传且带进度条实例 发布于 2020-7-5| 复制链接 本篇文章主要介绍了springMVC+ajax实现文件上传且带进度条实例,具有一定的参考价值 ...
- 使用SpringMVC框架实现文件上传和下载功能
使用SpringMVC框架实现文件上传和下载功能 (一)单个文件上传 ①配置文件上传解释器 <!-配置文件上传解释器 --> <mvc:annotation-driven>&l ...
- SpringMVC之多文件上传表单
上文简单介绍了springMVC之单文件上传 ,本文继续介绍多文件上传表单.包含单文件上传的表单已经能够满足大部分功能需求,但任然不够完善.实际业务中可能会包含多个文件同时上传,例如:商家在电商平台申 ...
- c++读取json文件_[SpringMVC]-SpringMVC架构-07-SpringMVC文件上传
SpringMVC学习 SpringMVC文件上传 文件上传相关 操作步骤: a.在pom.xml中添加文件上传相关jar包 b.配置文件解析器(在核心配置文件springmvc.xml.相关jsp文 ...
- SpringMVC中的文件上传与下载,json转换,及三大框架的整合
文章目录 文件上传 准备一个文件上传的表单 导入文件上传需要的jar包 配置文件上传解析器 编写文件上传的Controller控制器中的代码: 使用ResponseEntity返回值处理文件下载 使用 ...
最新文章
- Hibernate事务处理
- prooerties mysql_MySQL_第八章
- 【译】The challenge of verification and testing of machine learning
- shell脚本_Shell脚本
- 20179214 《网络攻防实践》第五周学习
- POI(java 操作excel,word等)编程
- python 归一化_数据的标准化和归一化
- 关于如何修改ISA server 防火墙并行最大TCP连接数问题和优化ISA 服务器淹没缓解设置
- 47. 全排列 II
- 二叉树 -- 5.1.1 Binary Tree Level Order Traversal-1 -- 图解
- 计算机系统更新不上怎么办理,电脑系统更新打不开怎么办
- ajax请求进error怎么弹出错诶信息,在ajax请求jqgrid之后出现错误时显示错误消息...
- 苏宁有货:为“轻创业”而来
- 红队web打点信息收集
- 余弦窗cosine window
- alot英文怎么读_漂亮的英文是什么英语怎么说
- 抖音电商直播基地项目运营规划商业品牌计划书方案模板
- APP 跳转微信小程序和回调
- Apache Ambari 简介
- 基础数据结构(二):字典树、并查集、堆、哈希表、字符串的哈希方式、STL的常见容器及其接口
热门文章
- python批量导入网页信息_python批量导入数据进Elasticsearch的实例
- 对CloseHandle用法的理解
- 有规律的进行效果最好--打扫有感
- Cygwin Application initialization failed: no display name and no $DISPLAY environment
- vbox设置剪切板共享
- 广度优先搜索(BFS)——抓住那头牛(POJ 4001)
- C语言课后习题(27)
- C语言课后习题(3)
- mysql私房菜_老男孩MySQL私房菜深入浅出精品视频第7章备份与恢复基础实践视频课程...
- 批处理等待上一条完成再执行下面的_分布式批处理实现方案