欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Java入门基础--SpringMVC进阶和JSON应用

程序员文章站 2022-03-27 10:25:51
1、Hello JSON在实际开发中,通常需要和别的系统交换数据,数据交换的格式通常有XML和JSON等;JSON(JavaScript Object Notation:JavaScript对象表示法)是一种基于JavaScript 语法开放的轻量级数据交换格式,使用js语法来描述数据对象;JSON作为一个轻量级的数据格式,相对于XML,文档更小,结构清晰简洁,读写效率更高2、SpringMVC如何返回JSON格式数据动态web项目---->搭建SpringMVC环境(Spring-mv...

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执行流程[面试题]

Java入门基础--SpringMVC进阶和JSON应用

  1. 发送请求到达DispatcherServlet

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

  3. HandleAdapter数据验证处理数据

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

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

本文地址:https://blog.csdn.net/WLK0423/article/details/111060583