From 47d65ac6b32ce16d2f1609b0f10859c51decdd19 Mon Sep 17 00:00:00 2001
From: luoxiang <2806718453@qq.com>
Date: Wed, 19 Dec 2018 21:59:45 +0800
Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=BB=A3=E7=A0=81=E8=AF=B4?=
=?UTF-8?q?=E6=98=8E?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
spring/springmvc-base-annotation/README.md | 559 +++++++++++++++++-
spring/springmvc-base/README.md | 558 ++++++++++++++++-
.../heibaiying/controller/FileController.java | 3 +
3 files changed, 1118 insertions(+), 2 deletions(-)
diff --git a/spring/springmvc-base-annotation/README.md b/spring/springmvc-base-annotation/README.md
index bc681ea..fb7ab04 100644
--- a/spring/springmvc-base-annotation/README.md
+++ b/spring/springmvc-base-annotation/README.md
@@ -369,4 +369,561 @@ public class HelloController {
}
```
-注:调用这个controller时,同时也可以验证在拦截器部分提到的:如果对应的程序报错,拦截器不一定会进入postHandle这个方法 但一定会进入afterCompletion这个方法
\ No newline at end of file
+注:调用这个controller时,同时也可以验证在拦截器部分提到的:如果对应的程序报错,拦截器不一定会进入postHandle这个方法 但一定会进入afterCompletion这个方法
+
+
+
+## 四、参数绑定
+
+### 4.1 参数绑定
+
+1.新建Programmer.java
+
+```java
+package com.heibaiying.bean;
+
+import lombok.Data;
+
+/**
+ * @author : heibaiying
+ * @description :
+ */
+@Data
+public class Programmer {
+
+ private String name;
+
+ private int age;
+
+ private float salary;
+
+ private String birthday;
+}
+
+```
+
+注:@Data 是lombok包下的注解,用来生成相应的set、get方法和全参、无参构造器,使得类的书写更为简洁。
+
+2.新建ParamBindController.java 文件
+
+```java
+package com.heibaiying.controller;
+
+import com.heibaiying.bean.Programmer;
+import org.springframework.format.annotation.DateTimeFormat;
+import org.springframework.format.datetime.DateFormatter;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.WebDataBinder;
+import org.springframework.web.bind.annotation.InitBinder;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import java.util.Date;
+
+/**
+ * @author : heibaiying
+ * @description :参数绑定
+ */
+@Controller
+public class ParamBindController {
+
+ @InitBinder
+ protected void initBinder(WebDataBinder binder) {
+ binder.addCustomFormatter(new DateFormatter("yyyy-MM-dd HH:mm:ss"));
+ }
+
+
+ // 参数绑定与日期格式转换
+ @RequestMapping("param")
+ public String param(String name, int age, double salary, @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") Date birthday, Model model) {
+ model.addAttribute("name", name);
+ model.addAttribute("age", age);
+ model.addAttribute("salary", salary);
+ model.addAttribute("birthday", birthday);
+ return "param";
+ }
+
+ @RequestMapping("param2")
+ public String param2(String name, int age, double salary, Date birthday, Model model) {
+ model.addAttribute("name", name);
+ model.addAttribute("age", age);
+ model.addAttribute("salary", salary);
+ model.addAttribute("birthday", birthday);
+ return "param";
+ }
+
+
+ @PostMapping("param3")
+ public String param3(Programmer programmer, String extendParam, Model model) {
+ System.out.println("extendParam" + extendParam);
+ model.addAttribute("p", programmer);
+ return "param";
+ }
+
+}
+
+```
+
+3.新建param.jsp 文件
+
+```jsp
+<%@ page contentType="text/html;charset=UTF-8" language="java" %>
+
+
+ Restful
+
+
+
+ - 姓名:${empty name ? p.name : name}
+ - 年龄:${empty age ? p.age : age}
+ - 薪酬:${empty salary ? p.salary : salary}
+ - 生日:${empty birthday ? p.birthday : birthday}
+
+
+
+
+```
+
+4.启动tomcat,用[postman](https://www.getpostman.com/)软件发送请求进行测试
+
+### 4.2 关于日期格式转换的三种方法
+
+1.如上实例代码所示,在对应的controller中初始化绑定
+
+```java
+@InitBinder
+ protected void initBinder(WebDataBinder binder) {
+ binder.addCustomFormatter(new DateFormatter("yyyy-MM-dd HH:mm:ss"));
+ }
+```
+
+2.利用@DateTimeFormat注解,如果是用实体类去接收参数,则在对应的属性上声明
+
+```java
+public String param(@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") Date birthday)
+```
+
+3.使用全局的日期格式绑定,新建自定义日期格式转化类,之后在ServletConfig.java中进行注册
+
+```java
+package com.heibaiying.convert;
+
+import org.springframework.core.convert.converter.Converter;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+/**
+ * @author : heibaiying
+ * @description :
+ */
+public class CustomDateConverter implements Converter {
+
+ public Date convert(String s) {
+ try {
+ SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+ return simpleDateFormat.parse(s);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ return null;
+ }
+}
+
+```
+
+ServletConfig.java
+
+```java
+/**
+ * 添加全局日期处理
+ */
+public void addFormatters(FormatterRegistry registry) {
+ registry.addConverter(new CustomDateConverter());
+}
+```
+
+
+
+## 五、数据校验
+
+1.spring支持的数据校验是JSR303的标准,需要引入依赖的jar包
+
+```java
+
+
+ org.hibernate.validator
+ hibernate-validator
+ 6.0.13.Final
+
+
+ javax.validation
+ validation-api
+ 2.0.1.Final
+
+```
+
+2.新建测试ParamValidController.java,主要是在需要校验的参数前加上@Validated,声明参数需要被校验,同时加上bindingResult参数,这个参数中包含了校验的结果
+
+```java
+package com.heibaiying.controller;
+
+import com.heibaiying.bean.Programmer;
+import org.hibernate.validator.constraints.Length;
+import org.springframework.format.annotation.DateTimeFormat;
+import org.springframework.format.datetime.DateFormatter;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.validation.BindingResult;
+import org.springframework.validation.ObjectError;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.WebDataBinder;
+import org.springframework.web.bind.annotation.InitBinder;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.validation.constraints.Min;
+import javax.validation.constraints.NotNull;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @author : heibaiying
+ * @description :数据校验
+ */
+@RestController
+public class ParamValidController {
+
+
+ @PostMapping("validate")
+ public void valid(@Validated Programmer programmer,
+ BindingResult bindingResult) {
+ List allErrors = bindingResult.getAllErrors();
+ for (ObjectError error : allErrors) {
+ System.out.println(error.getDefaultMessage());
+ }
+ }
+
+}
+
+```
+
+3.在Programmer.java的对应属性上加上注解约束(支持的注解可以在javax.validation.constraints包中查看)
+
+```java
+package com.heibaiying.bean;
+
+import lombok.Data;
+
+import javax.validation.constraints.Min;
+import javax.validation.constraints.NotNull;
+
+/**
+ * @author : heibaiying
+ * @description :
+ */
+@Data
+public class Programmer {
+
+ @NotNull
+ private String name;
+
+ @Min(value = 0,message = "年龄不能为负数!" )
+ private int age;
+
+ @Min(value = 0,message = "薪酬不能为负数!" )
+ private float salary;
+
+ private String birthday;
+}
+
+```
+
+## 六、文件上传与下载
+
+#### 6.1 文件上传
+
+1.在ServletConfig.java中进行配置,使之支持文件上传
+
+```java
+/**
+* 配置文件上传
+*/
+@Bean
+public CommonsMultipartResolver multipartResolver(){
+ CommonsMultipartResolver resolver = new CommonsMultipartResolver();
+ resolver.setMaxUploadSize(1024*1000*10);
+ resolver.setMaxUploadSizePerFile(1024*1000);
+ resolver.setDefaultEncoding("utf-8");
+ return resolver;
+}
+```
+
+2.新建测试上传的FileController.java
+
+```java
+package com.heibaiying.controller;
+
+import com.heibaiying.utils.FileUtil;
+import org.apache.commons.io.FileUtils;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.MediaType;
+import org.springframework.http.ResponseEntity;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.http.HttpSession;
+import java.io.File;
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.net.URLEncoder;
+
+/**
+ * @author : heibaiying
+ * @description : 文件上传
+ */
+
+@Controller
+public class FileController {
+
+ @GetMapping("file")
+ public String filePage() {
+ return "file";
+ }
+
+
+ /***
+ * 单文件上传
+ */
+ @PostMapping("upFile")
+ public String upFile(MultipartFile file, HttpSession session) {
+ //保存在项目根目录下image文件夹下,如果文件夹不存在则创建
+ FileUtil.saveFile(file, session.getServletContext().getRealPath("/image"));
+ // success.jsp 就是一个简单的成功页面
+ return "success";
+ }
+
+ /***
+ * 多文件上传 多个文件用同一个名字
+ */
+ @PostMapping("upFiles")
+ public String upFiles(@RequestParam(name = "file") MultipartFile[] files, HttpSession session) {
+ for (MultipartFile file : files) {
+ FileUtil.saveFile(file, session.getServletContext().getRealPath("images"));
+ }
+ return "success";
+ }
+
+ /***
+ * 多文件上传方式2 分别为不同文件指定不同名字
+ */
+ @PostMapping("upFiles2")
+ public String upFile(String extendParam,
+ @RequestParam(name = "file1") MultipartFile file1,
+ @RequestParam(name = "file2") MultipartFile file2, HttpSession session) {
+ String realPath = session.getServletContext().getRealPath("images2");
+ FileUtil.saveFile(file1, realPath);
+ FileUtil.saveFile(file2, realPath);
+ System.out.println("extendParam:" + extendParam);
+ return "success";
+ }
+}
+
+```
+
+3.其中工具类FileUtil.java代码如下
+
+```java
+package com.heibaiying.utils;
+
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.*;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * @author : heibaiying
+ * @description : 文件上传工具类
+ */
+public class FileUtil {
+
+ public static String saveFile(MultipartFile file, String path) {
+ String fullPath = path + File.separator + file.getOriginalFilename();
+ try {
+ File saveDir = new File(path);
+ if (!saveDir.exists()) {
+ saveDir.mkdirs();
+ }
+ FileOutputStream outputStream = new FileOutputStream(new File(fullPath));
+ InputStream inputStream = file.getInputStream();
+ byte[] bytes = new byte[1024 * 1024];
+ int read;
+ while ((read = inputStream.read(bytes)) != -1) {
+ outputStream.write(bytes, 0, read);
+ }
+
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ return fullPath;
+ }
+
+}
+
+```
+
+4.新建用于上传的jsp页面,上传文件时表单必须声明 enctype="multipart/form-data"
+
+```jsp
+<%@ page contentType="text/html;charset=UTF-8" language="java" %>
+
+
+ 文件上传
+
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+#### 6.2 文件下载
+
+1.在fileController.java中加上方法:
+
+```java
+ /***
+ * 上传用于下载的文件
+ */
+ @PostMapping("upFileForDownload")
+ public String upFileForDownload(MultipartFile file, HttpSession session, Model model) throws UnsupportedEncodingException {
+ String path = FileUtil.saveFile(file, session.getServletContext().getRealPath("/image"));
+ model.addAttribute("filePath", URLEncoder.encode(path,"utf-8"));
+ model.addAttribute("fileName", file.getOriginalFilename());
+ return "fileDownload";
+ }
+
+ /***
+ * 下载文件
+ */
+ @GetMapping("download")
+ public ResponseEntity downloadFile(String filePath) throws IOException {
+ HttpHeaders headers = new HttpHeaders();
+ File file = new File(filePath);
+ // 解决文件名中文乱码
+ String fileName=new String(file.getName().getBytes("UTF-8"),"iso-8859-1");
+ headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
+ headers.setContentDispositionFormData("attachment", fileName);
+
+ return new ResponseEntity(FileUtils.readFileToByteArray(file),
+ headers, HttpStatus.CREATED);
+ }
+```
+
+2.其中fileDownload.jsp 如下:
+
+```jsp
+<%@ page contentType="text/html;charset=UTF-8" language="java" %>
+
+
+ 文件下载
+
+
+ ${fileName}
+
+
+```
+
+
+
+## 七、Restful风格的请求
+
+1.新建Pet.java实体类
+
+```java
+package com.heibaiying.bean;
+
+import lombok.Data;
+
+/**
+ * @author : heibaiying
+ * @description :测试restful风格的实体类
+ */
+
+@Data
+public class Pet {
+
+ private String ownerId;
+
+ private String petId;
+}
+
+```
+
+2.新建RestfulController.java,用@PathVariable和@ModelAttribute注解进行参数绑定。
+
+注: 在REST中,资源通过URL进行识别和定位。REST中的行为是通过HTTP方法定义的。在进行不同行为时对应HTTP方法和Spring注解分别如下:
+
+- 创建资源时:POST(PostMapping)
+- 读取资源时:GET( @GetMapping)
+- 更新资源时:PUT或PATCH(PutMapping、PatchMapping)
+- 删除资源时:DELETE(DeleteMapping)
+
+```java
+package com.heibaiying.controller;
+
+import com.heibaiying.bean.Pet;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * @author : heibaiying
+ * @description : Restful 风格的请求
+ */
+
+@RestController
+public class RestfulController {
+
+ @GetMapping("restful/owners/{ownerId}/pets/{petId}")
+ public void get(@PathVariable String ownerId, @PathVariable String petId) {
+ System.out.println("ownerId:" + ownerId);
+ System.out.println("petId:" + petId);
+ }
+
+ @GetMapping("restful2/owners/{ownerId}/pets/{petId}")
+ public void get(@ModelAttribute Pet pet) {
+ System.out.println("ownerId:" + pet.getOwnerId());
+ System.out.println("petId:" + pet.getPetId());
+ }
+
+}
+
+```
+
diff --git a/spring/springmvc-base/README.md b/spring/springmvc-base/README.md
index 2dcd54d..239fc12 100644
--- a/spring/springmvc-base/README.md
+++ b/spring/springmvc-base/README.md
@@ -361,4 +361,560 @@ public class HelloController {
}
```
-注:调用这个controller时,同时也可以验证在拦截器部分提到的:如果对应的程序报错,拦截器不一定会进入postHandle这个方法 但一定会进入afterCompletion这个方法
\ No newline at end of file
+注:调用这个controller时,同时也可以验证在拦截器部分提到的:如果对应的程序报错,拦截器不一定会进入postHandle这个方法 但一定会进入afterCompletion这个方法
+
+
+
+## 四、参数绑定
+
+### 4.1 参数绑定
+
+1.新建Programmer.java
+
+```java
+package com.heibaiying.bean;
+
+import lombok.Data;
+
+/**
+ * @author : heibaiying
+ * @description :
+ */
+@Data
+public class Programmer {
+
+ private String name;
+
+ private int age;
+
+ private float salary;
+
+ private String birthday;
+}
+
+```
+
+注:@Data 是lombok包下的注解,用来生成相应的set、get方法和全参、无参构造器,使得类的书写更为简洁。
+
+2.新建ParamBindController.java 文件
+
+```java
+package com.heibaiying.controller;
+
+import com.heibaiying.bean.Programmer;
+import org.springframework.format.annotation.DateTimeFormat;
+import org.springframework.format.datetime.DateFormatter;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.WebDataBinder;
+import org.springframework.web.bind.annotation.InitBinder;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import java.util.Date;
+
+/**
+ * @author : heibaiying
+ * @description :参数绑定
+ */
+@Controller
+public class ParamBindController {
+
+ @InitBinder
+ protected void initBinder(WebDataBinder binder) {
+ binder.addCustomFormatter(new DateFormatter("yyyy-MM-dd HH:mm:ss"));
+ }
+
+
+ // 参数绑定与日期格式转换
+ @RequestMapping("param")
+ public String param(String name, int age, double salary, @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") Date birthday, Model model) {
+ model.addAttribute("name", name);
+ model.addAttribute("age", age);
+ model.addAttribute("salary", salary);
+ model.addAttribute("birthday", birthday);
+ return "param";
+ }
+
+ @RequestMapping("param2")
+ public String param2(String name, int age, double salary, Date birthday, Model model) {
+ model.addAttribute("name", name);
+ model.addAttribute("age", age);
+ model.addAttribute("salary", salary);
+ model.addAttribute("birthday", birthday);
+ return "param";
+ }
+
+
+ @PostMapping("param3")
+ public String param3(Programmer programmer, String extendParam, Model model) {
+ System.out.println("extendParam" + extendParam);
+ model.addAttribute("p", programmer);
+ return "param";
+ }
+
+}
+
+```
+
+3.新建param.jsp 文件
+
+```jsp
+<%@ page contentType="text/html;charset=UTF-8" language="java" %>
+
+
+ Restful
+
+
+
+ - 姓名:${empty name ? p.name : name}
+ - 年龄:${empty age ? p.age : age}
+ - 薪酬:${empty salary ? p.salary : salary}
+ - 生日:${empty birthday ? p.birthday : birthday}
+
+
+
+
+```
+
+4.启动tomcat,用[postman](https://www.getpostman.com/)软件发送请求进行测试
+
+### 4.2 关于日期格式转换的三种方法
+
+1.如上实例代码所示,在对应的controller中初始化绑定
+
+```java
+@InitBinder
+ protected void initBinder(WebDataBinder binder) {
+ binder.addCustomFormatter(new DateFormatter("yyyy-MM-dd HH:mm:ss"));
+ }
+```
+
+2.利用@DateTimeFormat注解,如果是用实体类去接收参数,则在对应的属性上声明
+
+```java
+public String param(@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") Date birthday)
+```
+
+3.使用全局的日期格式绑定,新建自定义日期格式转化类,之后在springApplication.xml中进行注册
+
+```java
+package com.heibaiying.convert;
+
+import org.springframework.core.convert.converter.Converter;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+/**
+ * @author : heibaiying
+ * @description :
+ */
+public class CustomDateConverter implements Converter {
+
+ public Date convert(String s) {
+ try {
+ SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+ return simpleDateFormat.parse(s);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ return null;
+ }
+}
+
+```
+
+springApplication.xml
+
+```xml
+
+
+
+
+
+
+
+
+```
+
+
+
+## 五、数据校验
+
+1.spring支持的数据校验是JSR303的标准,需要引入依赖的jar包
+
+```java
+
+
+ org.hibernate.validator
+ hibernate-validator
+ 6.0.13.Final
+
+
+ javax.validation
+ validation-api
+ 2.0.1.Final
+
+```
+
+2.新建测试ParamValidController.java,主要是在需要校验的参数前加上@Validated,声明参数需要被校验,同时加上bindingResult参数,这个参数中包含了校验的结果
+
+```java
+package com.heibaiying.controller;
+
+import com.heibaiying.bean.Programmer;
+import org.hibernate.validator.constraints.Length;
+import org.springframework.format.annotation.DateTimeFormat;
+import org.springframework.format.datetime.DateFormatter;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.validation.BindingResult;
+import org.springframework.validation.ObjectError;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.WebDataBinder;
+import org.springframework.web.bind.annotation.InitBinder;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.validation.constraints.Min;
+import javax.validation.constraints.NotNull;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @author : heibaiying
+ * @description :数据校验
+ */
+@RestController
+public class ParamValidController {
+
+
+ @PostMapping("validate")
+ public void valid(@Validated Programmer programmer,
+ BindingResult bindingResult) {
+ List allErrors = bindingResult.getAllErrors();
+ for (ObjectError error : allErrors) {
+ System.out.println(error.getDefaultMessage());
+ }
+ }
+
+}
+
+```
+
+3.在Programmer.java的对应属性上加上注解约束(支持的注解可以在javax.validation.constraints包中查看)
+
+```java
+package com.heibaiying.bean;
+
+import lombok.Data;
+
+import javax.validation.constraints.Min;
+import javax.validation.constraints.NotNull;
+
+/**
+ * @author : heibaiying
+ * @description :
+ */
+@Data
+public class Programmer {
+
+ @NotNull
+ private String name;
+
+ @Min(value = 0,message = "年龄不能为负数!" )
+ private int age;
+
+ @Min(value = 0,message = "薪酬不能为负数!" )
+ private float salary;
+
+ private String birthday;
+}
+
+```
+
+## 六、文件上传与下载
+
+#### 6.1 文件上传
+
+1.在springApplication.xml中进行配置,使之支持文件上传
+
+```xml
+
+
+
+
+
+
+
+
+```
+
+2.新建测试上传的FileController.java
+
+```java
+package com.heibaiying.controller;
+
+import com.heibaiying.utils.FileUtil;
+import org.apache.commons.io.FileUtils;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.MediaType;
+import org.springframework.http.ResponseEntity;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.http.HttpSession;
+import java.io.File;
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.net.URLEncoder;
+
+/**
+ * @author : heibaiying
+ * @description : 文件上传
+ */
+
+@Controller
+public class FileController {
+
+ @GetMapping("file")
+ public String filePage() {
+ return "file";
+ }
+
+
+ /***
+ * 单文件上传
+ */
+ @PostMapping("upFile")
+ public String upFile(MultipartFile file, HttpSession session) {
+ //保存在项目根目录下image文件夹下,如果文件夹不存在则创建
+ FileUtil.saveFile(file, session.getServletContext().getRealPath("/image"));
+ // success.jsp 就是一个简单的成功页面
+ return "success";
+ }
+
+ /***
+ * 多文件上传 多个文件用同一个名字
+ */
+ @PostMapping("upFiles")
+ public String upFiles(@RequestParam(name = "file") MultipartFile[] files, HttpSession session) {
+ for (MultipartFile file : files) {
+ FileUtil.saveFile(file, session.getServletContext().getRealPath("images"));
+ }
+ return "success";
+ }
+
+ /***
+ * 多文件上传方式2 分别为不同文件指定不同名字
+ */
+ @PostMapping("upFiles2")
+ public String upFile(String extendParam,
+ @RequestParam(name = "file1") MultipartFile file1,
+ @RequestParam(name = "file2") MultipartFile file2, HttpSession session) {
+ String realPath = session.getServletContext().getRealPath("images2");
+ FileUtil.saveFile(file1, realPath);
+ FileUtil.saveFile(file2, realPath);
+ System.out.println("extendParam:" + extendParam);
+ return "success";
+ }
+}
+
+```
+
+3.其中工具类FileUtil.java代码如下
+
+```java
+package com.heibaiying.utils;
+
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.*;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * @author : heibaiying
+ * @description : 文件上传工具类
+ */
+public class FileUtil {
+
+ public static String saveFile(MultipartFile file, String path) {
+ String fullPath = path + File.separator + file.getOriginalFilename();
+ try {
+ File saveDir = new File(path);
+ if (!saveDir.exists()) {
+ saveDir.mkdirs();
+ }
+ FileOutputStream outputStream = new FileOutputStream(new File(fullPath));
+ InputStream inputStream = file.getInputStream();
+ byte[] bytes = new byte[1024 * 1024];
+ int read;
+ while ((read = inputStream.read(bytes)) != -1) {
+ outputStream.write(bytes, 0, read);
+ }
+
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ return fullPath;
+ }
+
+}
+
+```
+
+4.新建用于上传的jsp页面,上传文件时表单必须声明 enctype="multipart/form-data"
+
+```jsp
+<%@ page contentType="text/html;charset=UTF-8" language="java" %>
+
+
+ 文件上传
+
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+#### 6.2 文件下载
+
+1.在fileController.java中加上方法:
+
+```java
+ /***
+ * 上传用于下载的文件
+ */
+ @PostMapping("upFileForDownload")
+ public String upFileForDownload(MultipartFile file, HttpSession session, Model model) throws UnsupportedEncodingException {
+ String path = FileUtil.saveFile(file, session.getServletContext().getRealPath("/image"));
+ model.addAttribute("filePath", URLEncoder.encode(path,"utf-8"));
+ model.addAttribute("fileName", file.getOriginalFilename());
+ return "fileDownload";
+ }
+
+ /***
+ * 下载文件
+ */
+ @GetMapping("download")
+ public ResponseEntity downloadFile(String filePath) throws IOException {
+ HttpHeaders headers = new HttpHeaders();
+ File file = new File(filePath);
+ // 解决文件名中文乱码
+ String fileName=new String(file.getName().getBytes("UTF-8"),"iso-8859-1");
+ headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
+ headers.setContentDispositionFormData("attachment", fileName);
+
+ return new ResponseEntity(FileUtils.readFileToByteArray(file),
+ headers, HttpStatus.CREATED);
+ }
+```
+
+2.其中fileDownload.jsp 如下:
+
+```jsp
+<%@ page contentType="text/html;charset=UTF-8" language="java" %>
+
+
+ 文件下载
+
+
+ ${fileName}
+
+
+```
+
+
+
+## 七、Restful风格的请求
+
+1.新建Pet.java实体类
+
+```java
+package com.heibaiying.bean;
+
+import lombok.Data;
+
+/**
+ * @author : heibaiying
+ * @description :测试restful风格的实体类
+ */
+
+@Data
+public class Pet {
+
+ private String ownerId;
+
+ private String petId;
+}
+
+```
+
+2.新建RestfulController.java,用@PathVariable和@ModelAttribute注解进行参数绑定。
+
+注: 在REST中,资源通过URL进行识别和定位。REST中的行为是通过HTTP方法定义的。在进行不同行为时对应HTTP方法和Spring注解分别如下:
+
+- 创建资源时:POST(PostMapping)
+- 读取资源时:GET( @GetMapping)
+- 更新资源时:PUT或PATCH(PutMapping、PatchMapping)
+- 删除资源时:DELETE(DeleteMapping)
+
+```java
+package com.heibaiying.controller;
+
+import com.heibaiying.bean.Pet;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * @author : heibaiying
+ * @description : Restful 风格的请求
+ */
+
+@RestController
+public class RestfulController {
+
+ @GetMapping("restful/owners/{ownerId}/pets/{petId}")
+ public void get(@PathVariable String ownerId, @PathVariable String petId) {
+ System.out.println("ownerId:" + ownerId);
+ System.out.println("petId:" + petId);
+ }
+
+ @GetMapping("restful2/owners/{ownerId}/pets/{petId}")
+ public void get(@ModelAttribute Pet pet) {
+ System.out.println("ownerId:" + pet.getOwnerId());
+ System.out.println("petId:" + pet.getPetId());
+ }
+
+}
+
+```
+
diff --git a/spring/springmvc-base/src/main/java/com/heibaiying/controller/FileController.java b/spring/springmvc-base/src/main/java/com/heibaiying/controller/FileController.java
index 27eb8c9..dfefb4c 100644
--- a/spring/springmvc-base/src/main/java/com/heibaiying/controller/FileController.java
+++ b/spring/springmvc-base/src/main/java/com/heibaiying/controller/FileController.java
@@ -69,6 +69,9 @@ public class FileController {
}
+ /***
+ * 上传用于下载的文件
+ */
@PostMapping("upFileForDownload")
public String upFileForDownload(MultipartFile file, HttpSession session, Model model) throws UnsupportedEncodingException {
String path = FileUtil.saveFile(file, session.getServletContext().getRealPath("/image"));