SpringMVC:处理Json&上传下载文件

处理JSON

加入jar包

jackson-annotations-2.1.5.jar
jackson-core-2.1.5.jar
jackson-databind-2.1.5.jar

修改springMVC.xml

	<mvc:default-servlet-handler/>
	<mvc:annotation-driven></mvc:annotation-driven>

编写处理器方法

在这里插入图片描述

增加页面链接

在这里插入图片描述

HttpMessageConverter原理

HttpMessageConverter

1)HttpMessageConverter 是 Spring3.0 新添加的一个接口,负责将请求信息转换为一个对象(类型为 T),将对象(类型为 T)输出为响应信息

2)HttpMessageConverter接口定义的方法:

  • ①Boolean canRead(Class<?> clazz,MediaType mediaType): 指定转换器可以读取的对象类型,即转换器是否可将请求信息转换为 clazz 类型的对象,同时指定支持 MIME 类型(text/html,applaiction/json等)

  • ②Boolean canWrite(Class<?> clazz,MediaType mediaType):指定转换器是否可将 clazz 类型的对象写到响应流中,响应流支持的媒体类型在MediaType 中定义。

  • ③List getSupportMediaTypes():该转换器支持的媒体类型。
  • ④T read(Class<? extends T> clazz,HttpInputMessage inputMessage):将请求信息流转换为 T 类型的对象。

  • ⑤void write(T t,MediaType contnetType,HttpOutputMessgae outputMessage):将T类型的对象写到响应流中,同时指定相应的媒体类型为 contentType。

  • 在这里插入图片描述

  • 3)DispatcherServlet 默认装配 RequestMappingHandlerAdapter ,
    而 RequestMappingHandlerAdapter 默认装配如下 HttpMessageConverter:
    在这里插入图片描述
    4)加入 jackson jar 包后, RequestMappingHandlerAdapter
    装配的 HttpMessageConverter 如下:
    在这里插入图片描述

文件下载

@Controller
public class SrpingMVCHandler {
	/**
	 * 使用HttpMessageConveter完成下载功能:
	 * 
	 * 支持  @RequestBody   @ResponseBody   HttpEntity  ResponseEntity
	 * 
	 * 下载的原理:  将服务器端的文件 以流的形式  写到 客户端. 
	 * ResponseEntity: 将要下载的文件数据, 以及响应信息封装到ResponseEntity对象中,浏览器端通过解析
	 * 				       发送回去的响应数据, 就可以进行一个下载操作. 
	 */
	@RequestMapping(value = "/download")
	public ResponseEntity<byte[]> testPara(HttpSession session) throws Exception  {
		//将响应数据  以及一些响应头信息封装到ResponseEntity中
		
		//发送给浏览器端的数据
		InputStream in = session.getServletContext().getResourceAsStream("images/aa.jpg");
		byte [] imgs = new byte[in.available()];
		in.read(imgs);
		
		// 设置响应头
		HttpHeaders  headers = new HttpHeaders();
		headers.add("Content-Disposition", "attachment;filename=songlaoshi.jpg");
		
		//设置响应码
		HttpStatus statusCode = HttpStatus.OK;  // 200
		return new ResponseEntity<byte[]>(imgs, headers, statusCode);
	}
}

文件上传

简介

1)SpringMVC为文件上传提供了直接的支持,这种支持是通过即插即用的MultipartResolver实现的

2)Spring用** Jakarta Commons FileUpload**技术实现了一个 MultipartResolver 实现类:CommonsMultipartResolver

3)配置 MultipartResolver
defaultEncoding:必须和用户JSP的pageEncoding属性一致,以便正确解析表单的内容,为了让CommonsMultipartResolver正确工作,必须先将 Jakarta Commons FileUpload 及 Jakarta Commons io 的添加到类路径下。
在这里插入图片描述

代码

加入jar

commons-fileupload-1.2.1.jar
commons-io-2.0.jar

配置文件上传解析器

修改springmvc.xml

	<!-- 配置文件上传解析器
    id必须是"multipartResolver",否则,会报错误:
    java.lang.IllegalArgumentException: Expected MultipartHttpServletRequest: is a MultipartResolver configured?
     -->
	<bean id="multipartResolver"
 		class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
		<property name="defaultEncoding" value="UTF-8"></property>
		<property name="maxUploadSize" value="1024000"></property>
	</bean>

上传页面

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<form action="testUpload" method="post" enctype="multipart/form-data">
		文件: <input type="file" name="file"/><br><br>
		描述: <input type="text" name="desc"/><br><br>
	<input type="submit" value="提交"/>
</form>
</body>
</html>

控制器方法

@Controller
public class SrpingMVCHandler {
	
	@RequestMapping(value = "/testUpload", method=RequestMethod.POST)
	public String testParam(@RequestParam("desc")String desc,
			@RequestParam("file")MultipartFile multipartFile,
			HttpSession session) throws Exception  {
		
		//获取到上传文件的名字
		String uploadFileName = multipartFile.getOriginalFilename();
		
		// 获取服务器端的upload文件夹的真实路径
		String realPath = session.getServletContext().getRealPath("uploads");
		File targetFile = new File(realPath + "/" + uploadFileName);
		System.out.println(realPath);
         
		/*
        //获取输入/输出流
    	InputStream in = multipartFile.getInputStream();
    	FileOutputStream  os = new FileOutputStream(targetFile);
		//写文件
		int i ; 
		while((i =  in.read())!=-1) {
			os.write(i);
		}
		
		in.close();
		os.close();
		*/
		multipartFile.transferTo(targetFile);
		
		return "success";
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值