Java小白学习指南【day37】---SpringMVC进阶&JSON

1、Hello JSON

  • 在实际开发中,通常需要和别的系统交换数据,数据交换的格式通常有XML和JSON等;
  • JSON(JavaScript Object Notation:JavaScript对象表示法)是一种基于JavaScript 语法开放的轻量级数据交换格式,使用js语法来描述数据对象;
  • JSON作为一个轻量级的数据格式,相对于XML,文档更小,结构清晰简洁,读写效率更高

2、SpringMVC如何返回JSON格式数据

动态web项目---->搭建SpringMVC环境(Spring-mvc.xml文件配置)---->导入JSON的jar包---->返回值上打注解@ResponseBody---->不会走视图解析器,向前台直接传输数据

1、日期对象返回格式

在向浏览器返回时间日期时,格式为时间戳,而我们希望的是指定规则的日期字符串,所以在从后台向前台传输时需要在日期的getter属性上加上格式化标签@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone="GMT+8")

;从前台向后台传输时,需要在setter方法上,添加注解@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")

4、实现文件上传

1、准备

  • 表单必须是post请求,要传输较大数据
  • enctype=multipart/form-data w3cSchoole-html-form表单enctype属性值查阅
<%@ 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>
	<!-- enctype="multipart/form-data":告诉浏览器表单中有复杂表单项 -->
	<form action="/file/upload" method="post" enctype="multipart/form-data">
	 	<h2>演示头像上传</h2>
	 	用户:<input name="name" value="name"/> <br/> <br/><!-- 普通表单项 -->
	 	头像:<input type="file" name="photo"/><br/> <br/><!-- 复杂表单项 -->
	 	<input type="submit" value="提交"/>
	</form>
</body>
</html>

2、后台代码

  • 要进行jar导入 com.springsource.org.apache.commons.photo-1.2.0.jar

    com.springsource.org.apache.commons.io-1.4.0.jar

  • 配置Spring-mvc.xml文件解析器

<!-- 配置文件上传解析器:将表单中的复杂表单项解析成一个MultipartFile对象 -->
<bean id="multipartResolver"   class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
		<!-- 设置上传文件的最大尺寸为1MB -->
		<property name="maxUploadSize">
			<value>#{1024*1024}</value>
		</property>
</bean>
  • 后台代码
/**
 * @author wang
 *获取前台传输的文件,下载到本地
 *下列可能出现的问题
 *①用户如果没有上传文件
  ②获取服务器所在磁盘真实路劲保存文件
  ③服务器上传文件路劲不存在
  ④文件名重复
 */
@Controller
@RequestMapping("/file")
public class LoadController {
    
    
	@RequestMapping("/upload")
	public void uploadFile(MultipartFile photo,String name,HttpServletRequest req) throws IOException{
    
    
		System.out.println(name);
		System.out.println(photo);//图片已经放进对象里面了,现在要在本地进行获取
		
		// 0.上传表单信息:注意MultipartFile对象的名称必须与上传表单项的name属性值一致
		System.out.println("上传文件是否为空:" + photo.isEmpty());
		System.out.println("上传文件的大小(字节):" + photo.getSize());
		System.out.println("上传文件的类型:" + photo.getContentType());
		System.out.println("上传表单name属性值:" + photo.getName());
		String filename = photo.getOriginalFilename();//上传的文件名
		System.out.println("上传文件名:" + photo.getOriginalFilename());
		//获取文件真是路径
		String realPath = req.getServletContext().getRealPath("/img");
		File parent = new File(realPath);
		//判断文件夹不存在
		if (!parent.exists()) {
    
    //文件夹不存在,需要创建文件夹
			parent.mkdirs();
		}
		//解决文件名重复的情况,使用随机数
		filename = UUID.randomUUID().toString().replaceAll("-", "")+"_"+filename;
		//如果存在,就输出
		File file = new File(parent, filename);
		// 1、先获取输入流
		InputStream in = photo.getInputStream();
		// 2、获取输出流
		FileOutputStream ou = new FileOutputStream(file);
		// 3、边读边保存(可以用到IOUtil工具)
		IOUtils.copy(in, ou);
		// 关流
		ou.close();
		in.close();
	}

5、文件下载

1、准备

<%@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>
	<ul>
		<h1>文件下载</h1><br/>
		<li><a href="file/download?name=1.jpg">1.jpg</a></li>
		<!-- 处理IE浏览器不能够显示中文 -->
		<li><a href="file/download?name=<%=URLEncoder.encode("嘿嘿.jpg", "UTF-8") %>">嘿嘿.jpg</a></li>
		<li><a href="file/download?name=abc.mp4">abc.mp4</a></li>
		<li><a href="file/download?name=<%=URLEncoder.encode("嘿嘿.7z", "UTF-8") %>">嘿嘿.7z</a></li>
	</ul>
</body>
</html>

2、后台代码实现

@Controller
@RequestMapping("/file")
public class LoadController {
    
    
//文件下载
	@RequestMapping("/download")
	public void downloadFile(String name ,HttpServletRequest req , HttpServletResponse resp) 
			throws IOException{
    
    //这里的名字要和xml里面的保持一致
		System.out.println(name);
		//找寻文件在服务器的绝对路径
		String path = req.getServletContext().getRealPath("/img")+"/"+name;
		//1、先获取输入流
		FileInputStream in = new FileInputStream(path);
//-----------------响应,对浏览器进行判断区分-------------------------------------------------------------	
		//在找到文件后,进行转码
		//转码的方式获取默认编码是ISO-8859-1后台代码utf-8
		//name = new String(name.getBytes("UTF-8"),"ISO-8859-1");
		if(req.getHeader("User-Agent").toUpperCase().indexOf("TRIDENT")!=-1){
    
    //IE
			name = URLEncoder.encode(name, "utf-8");
		}else if(req.getHeader("User-Agent").toUpperCase().indexOf("EDGE")!=-1){
    
    //电脑自带edge【edʒ】浏览器	
			name = URLEncoder.encode(name, "utf-8");
		}else{
    
    //其他浏览器
			name = new String(name.getBytes("UTF-8"),"ISO-8859-1");//转码的方式获取默认编码是ISO-8859-1后台代码utf-8
		};
//----------------------------------------------------------------------------------
		//设置相应头,告诉浏览器需要下载,这里是下载的内容
		resp.setHeader("Content-Disposition", "attachment; filename=" + name);
		//2、获取输出流,给客户端,会知晓向哪个客户端进行输出
		ServletOutputStream ou = resp.getOutputStream();
		//3、进行拷贝
		IOUtils.copy(in, ou);
		//关流
		ou.close();
		in.close();
	}
}

6、SpringMVC拦截器

(1) 过滤器属于web程序配置在web.xml,是对请求对象的拦截

(2) 拦截器属于SpringMVC应当配置在Spring-mvc.xml中:是对【控制器对象】请求方法的拦截

(3) 创建拦截器

//HandlerInterceptor   处理器 拦截器
public class MyInterceptor implements HandlerInterceptor{
    
    
	@Override
	public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)throws Exception {
    
    
		System.out.println("请求完成DispatcherServlet请求响应完成之后执行...可以对资源做一些清理");
	}
	@Override
	public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
			throws Exception {
    
    
		System.out.println("在controller处理器执行之后执行.但在DispatcherServlet向客户端返回响应之前,对reuqest处理");
	}
	//preHandle -- pre【prevoius】 在...之前   post在...之后
	@Override
	public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception {
    
    
		System.out.println("在controller处理器执行之前执行...");
//return false;//阻止了
		return true;//放行
	}
}

spring-mvc.xml中配置拦截器

<!-- 配置拦截器 -->
	<mvc:interceptors>
		<mvc:interceptor>
			<!-- 拦截所有请求   /*拦截一级请求    /**拦截所有请求  -->
			<mvc:mapping path="/**"/>
			<!-- 不拦截哪些请求 -->
			<mvc:exclude-mapping path="/upload"/>
			<mvc:exclude-mapping path="/download"/>
			<bean class="cn.xxxx.interceptor.MyInterceptor"></bean>
		</mvc:interceptor>
	</mvc:interceptors>

7、SpringMVC执行流程[面试题]

image-20201209110635293

扫描二维码关注公众号,回复: 12600285 查看本文章
  1. 发送请求到达DispatcherServlet

  2. 根据xml 注解的方式 查找映射器管理器HandleMapping 返回执行链

  3. HandleAdapter数据验证处理数据

  4. Controller 执行方法处理封装成ModelAndView

  5. 视图解析器解析ViewResolver 解析 response响应

猜你喜欢

转载自blog.csdn.net/WLK0423/article/details/111060583