Spring MVC(三)——拦截器、文件上传(两种方式上传)、文件下载(通用方式和MVC框架自带方式)、跨域问题、Spring 整合 Spring MVC
一、拦截器

1、前期准备


2、拦截器的使用方式和注意事项
首先使用拦截器先要实现一个接口:HandlerInterceptor

然后就是需要实现三个方法:


spring-servlet.xml 配置拦截器:

结果就不放出来了。
二、文件上传
文件上传有两种方式,一种是新版的,一种是旧版的。先看新版的
1、新版文件上传方式
先是 spring-servlet 配置:

然后是 web.xml 配置:

然后就是 java 代码:
SimpleDateFormat sdf = new SimpleDateFormat("/yyyy/MM/dd/");
@PostMapping("/upload")
public String upload(MultipartFile file, String name, HttpServletRequest req){
System.out.println("name = "+name);
// 1.获取文件保存路径
String format = sdf.format(new Date());
// 获取项目运行路径 + 日期 组成一个完整路径
String realPath = req.getServletContext().getRealPath("/img") + format;
System.out.println(realPath);
File folder = new File(realPath);
if (!folder.exists()){
folder.mkdirs();
}
// 2.文件重命名
String oldName = file.getOriginalFilename();
String newName = UUID.randomUUID().toString() + oldName.substring(oldName.lastIndexOf("."));
// 保存文件
try {
file.transferTo(new File(folder,newName)); // 第一个参数是文件夹,第二个参数是文件名。
// 返回文件路径
String url = req.getScheme()+"://"+req.getServerName() + ":" + req.getServerPort() + req.getContextPath() + "/img" + format + newName;
System.out.println("url="+url);
return url;
} catch (IOException e) {
e.printStackTrace();
}
return null;
2、旧版文件上传方式
区别在于,代码不变,主要是配置有区别:

移除这个:

添加一个 bean:

那么到此为止,旧版的上传方式就配好了。
三、文件下载
有文件上传就有文件下载。
文件下载有两种方式:
1、第一种方式——通用的方式
@GetMapping("/download/{year}/{month}/{day}/{filename}")
// 下载的图片的名字。 路径中接收 年 月 日,方便后面拼接。
public void downloadImg(@PathVariable String filename, @PathVariable String year, @PathVariable String month, @PathVariable String day,HttpServletRequest req, HttpServletResponse resp) throws IOException {
// 在访问的基础上,加上响应头信息就能下载;就是告诉浏览器,是要下载,不是打开文件,要弹个对话框出来保存文件。
resp.addHeader("content-disposition", "attachment;filename="+filename);
// 获取文件的绝对路径。 separator:Linux 和 windows 不同操作系统上请求访问的斜杠不同,一个是 \ ,一个是 / ,所以通过这个属性去根据系统获取这个斜杠。
String filepath = req.getServletContext().getRealPath("/img") + File.separator + year + File.separator + month + File.separator + day + File.separator + filename;
// 获取字节流
ServletOutputStream out = resp.getOutputStream();
FileInputStream fis = new FileInputStream(filepath);
byte[] buf = new byte[1024];
int len = 0;
while ((len = fis.read(buf)) != -1){
out.write(buf,0,len);
}
out.flush();
}
上面的代码中,如果图片路径中有中文,就会乱码,且访问不能下载。
乱码的原因是因为浏览器下载这块编码格式是 ISO-8859-1,而我们在这里面的编码是 utf-8,把编码改成 ISO-8859-1 即可使用中文:


可以看到弹框的的确是中文。不过如果此时地址栏还不能显示中文,浏览器需要在相应的设置里修改下。(这里就不细说了,感兴趣的可以百度)
2、第二种方式——MVC 框架自带的方式

四、跨域问题
1、是什么跨域

2、解决跨域问题
解决跨域问题可以前端解决也可以后端解决。
解决跨域问题很简单,就一个注解的事:

如果希望有个全局的配置,就需要到 spring-servlet 配置文件里面去写:

五、Spring 整合 Spring MVC
1、整合思路

2、整合技巧

3、开始整合
先看下大体结构:

分层不用管,主要是两个配置文件:spring-servket.xml 和 applicationContext.xml 。
spring-servket.xml: 这个配置文件只配置和页面相关的以及 Controller 相关的。(负责 Spring MVC)
applicationContext.xml :这个配置文件只配置 Service 和 Dao,还涉及到 数据源、事务。(负责 spring)
a、spring-servket.xml 配置文件

b、applicationContext.xml 配置文件

c、web.xml 配置文件
还有个 web.xml 配置文件,这个配置文件就需要配置两个东西了:

4、题外话
如果就是想要把 Spring 的配置内容都放到 MVC配置文件中,这是当然可以的(如果是 ssh 就不能这么干)。不过建议还是分开来。
但是如果是把 MVC 的配置内容放到 Spring 里面,这就不行。
本文详细介绍了SpringMVC中的拦截器使用方法及注意事项,并演示了新版与旧版的文件上传方式,提供了两种文件下载方案,探讨了跨域问题及其解决方案,最后讲解了Spring与SpringMVC的整合方法。
——拦截器、文件上传(两种方式上传)、文件下载(通用方式和MVC框架自带方式)、跨域问题、Spring 整合 Spring MVC&spm=1001.2101.3001.5002&articleId=122458485&d=1&t=3&u=cd8019c71e4a409586a26d0a9ebedca2)
4225

被折叠的 条评论
为什么被折叠?



