SpringMVC转发和重定向, 以及文件功能的处理
一、SpringMVC中的转发和重定向
请求转发,请求重定向的区别和使用场景:
请求转发
特点:
请求转发是在服务器内部进行的,客户端不会察觉到。
转发是直接将请求传递给另一个组件,而不需要浏览器的参与。
转发是通过使用 RequestDispatcher 接口的 forward() 方法来实现的。
使用场景:
当两个组件共享相同的请求信息时,可以使用请求转发。
适用于在同一 web 应用程序内部的不同组件之间进行通信,如 Servlet 到 JSP 页面的转发。
请求重定向:特点:
请求重定向是通过发送一个 HTTP 重定向响应给客户端来实现的。
客户端收到响应后,会发起一个新的请求到指定的 URL。
重定向导致客户端和服务器之间产生两次请求-响应往返。
使用场景:
当两个组件不共享相同的请求信息,或者要将请求发送到不同的 web 应用程序时,可以使用请求重定向。
适用于在不同的 web 应用程序之间导航,或者在同一应用程序内部的不同上下文之间导航。
传统方式开发:
请求转发:
java
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@Controller
@RequestMapping("/user")
public class UserController() {
@GetMapping("/getUser")
public void getUser(HttpServletRequest request, HttpServletResponse response) {
request.getRequestDispatcher("/user/addUser").forward(request,response);
}
@PostMapping("/addUser")
public String addUser() {
// 返回页面
return "user";
}
}
请求重定向:
java
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@Controller
@RequestMapping("/user")
public class UserController() {
@GetMapping("/getUser")
public void getUser(HttpServletRequest request, HttpServletResponse response) {
response.sendRedirect("/user/addUser");
}
@PostMapping("/addUser")
public String addUser() {
// 返回页面
return "user";
}
}
使用SpringMVC框架之后
请求转发
java
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@Controller
@RequestMapping("/user")
public class UserController() {
@GetMapping("/getUser")
public String getUser(HttpServletRequest request, HttpServletResponse response) {
return "forward:/user/addUser";
}
@PostMapping("/addUser")
public String addUser() {
// 返回页面
return "user";
}
}
请求重定向
java
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@Controller
@RequestMapping("/user")
public class UserController() {
@GetMapping("/getUser")
public String getUser(HttpServletRequest request, HttpServletResponse response) {
return "redirect:/user/addUser";
}
@PostMapping("/addUser")
public String addUser() {
// 返回页面
return "user";
}
}
二、SpringMVC中的文件的上传和下载
一、引入依赖
xml
<properties>
<!--统一版本管理-->
<spring.version>5.3.6</spring.version>
</properties>
<dependencies>
<!--spring 的 核心包 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<!--springmvc的核心依赖 web-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<!--servlet api-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<!--thymeleaf api-->
<dependency>
<groupId>org.thymeleaf</groupId>
<artifactId>thymeleaf-spring5</artifactId>
<version>3.0.12.RELEASE</version>
</dependency>
<!--文件上传依赖-->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.4</version>
</dependency>
</dependencies>
二、 配置 spring的配置文件
xml
<?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:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
<!--开启包扫描-->
<context:component-scan base-package="com.atguigu.controller"/>
<!--配置 视图控制器-->
<mvc:view-controller path="/" view-name="index"></mvc:view-controller>
<!-- 开启springmvc容器-->
<mvc:annotation-driven></mvc:annotation-driven>
<!-- 配置Thymeleaf视图解析器 -->
<bean id="viewResolver" class="org.thymeleaf.spring5.view.ThymeleafViewResolver">
<!--配置视图解析器的优先级-->
<property name="order" value="1"/>
<!--配置视图解析器的字符编码方式-->
<property name="characterEncoding" value="UTF-8"/>
<!--配置视图解析器的模板-->
<property name="templateEngine">
<bean class="org.thymeleaf.spring5.SpringTemplateEngine">
<property name="templateResolver">
<bean class="org.thymeleaf.spring5.templateresolver.SpringResourceTemplateResolver">
<!-- 视图前缀 -->
<property name="prefix" value="/WEB-INF/templates/"/>
<!-- 视图后缀 -->
<property name="suffix" value=".html"/>
<property name="templateMode" value="HTML5"/>
<property name="characterEncoding" value="UTF-8" />
</bean>
</property>
</bean>
</property>
</bean>
<!--注入文件上传解析器-->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize" value="1048576"></property>
</bean>
</beans>
第三步: 创建配置类
java
package com.atguigu.controller;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.UUID;
@Controller
@RequestMapping("/file")
public class FileController {
/**
* 文件下载
* @param file
* @return
* @throws IOException
*/
@GetMapping("/getFile")
public ResponseEntity<byte[]> downFile(MultipartFile file) throws IOException {
// 1.获取文件的路径
String filePath = "E:/file/mybatis思维导图.png";
// 2.获取一个输入流
InputStream in = new FileInputStream(filePath);
// 2. 返回响应
byte[] bytes = new byte[in.available()];
in.read(bytes);
HttpHeaders headers = new HttpHeaders();
// 讲UTF-8 转化为 ISO-8859-1
String fileName = new String("mybatis思维导图.png".getBytes("UTF-8"),"ISO-8859-1");
headers.add("Content-Disposition","attachment;filename="+fileName);
return new ResponseEntity<>(bytes,headers, HttpStatus.OK);
}
/**
* 文件上传
*
* @return
*/
@PostMapping("/uploadFile")
public String uploadFile(MultipartFile file) throws IOException {
// 文件夹前半段
String dirPath = "E:/file";
SimpleDateFormat dateFormat = new SimpleDateFormat("/yyyy/MM/DD/");
dirPath += dateFormat.format(new Date());
File fileDirPath = new File(dirPath);
// 如果文件夹不存在则创建该文件夹
if (!fileDirPath.exists()){
fileDirPath.mkdirs();
}
// 文件的全名 从前端传过来的
String fileFullName = file.getOriginalFilename();
// 文件后缀名
String fileSuffixName = fileFullName.substring(fileFullName.lastIndexOf("."));
// 文件的保存名字
String fileName = UUID.randomUUID().toString().replace("-","")+fileSuffixName;
file.transferTo(new File(dirPath+fileName));
return "success_file";
}
}
第四步: 创建html页面进行测试
html
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>文件的上传和下载</title>
<base th:href="@{/}">
</head>
<body>
<a href="file/getFile">下载文件</a>
<br>
<form method="post" action="file/uploadFile" enctype="multipart/form-data">
<!--这里的 name 要和 配置类中的参数名相同 -->
<input type="file" name="file">
<button type="submit">上传</button>
</form>
</body>
</html>
html
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>文件的上传和下载</title>
<base th:href="@{/}">
</head>
<body>
<p>文件上传成功</p>
<br>
</body>
</html>