文章目錄
文件上傳
單文件上傳
創建工程,添加依賴
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--用於上傳文件-->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.5</version>
</dependency>
配置控制器
@PostMapping("/upload")
public String upload(MultipartFile uploadFile, HttpServletRequest req) {
/**獲取相對路徑 */
String realPath = "D:/IDEA/SpringBoot/web-fileupload/upload";
/*req.getSession().getServletContext().getRealPath("/uploadFile/");*/
/**設置時間格式 */
String format = sdf.format(new Date());
/**創建文件 */
File folder = new File(realPath + format);
/** 如果folder不存在,那就創建*/
if (!folder.isDirectory()) {
folder.mkdir();
}
/**獲取上傳文件的文件名作爲舊的文件名 */
String oldName = uploadFile.getOriginalFilename();
/** 截取上傳文件的後綴名作爲新文件的後綴名*/
String newName = UUID.randomUUID().toString() +
oldName.substring(oldName.lastIndexOf("."), oldName.length());
File newFile = new File(folder.getAbsolutePath() + File.separator + newName);
try {
/**將上傳的文件轉移到新文件上 */
/**uploadFile.transferTo(new File(folder, newName));*/
/*FileUtils要使用commons的jar*/
FileUtils.copyInputStreamToFile(uploadFile.getInputStream(), newFile);
/**getScheme()返回當前鏈接使用的協議;比如,一般應用返回http;SSL返回https; */
String filePath = req.getScheme() + "://" + req.getServerName() + ":" +
req.getServerPort() + "/upload/" + format + newName;
return filePath;
} catch (IOException e) {
e.printStackTrace();
}
return "上傳失敗!";
}
創建視圖
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="/upload" method="post" enctype="multipart/form-data">
<input type="file" name="uploadFile" value="請選擇文件">
<input type="submit" value="上傳">
</form>
</body>
</html>
多文件上傳
配置控制器
@PostMapping("/uploads")
public String upload(MultipartFile[] uploadFiles, HttpServletRequest req) {
for (int i = 0; i < uploadFiles.length; i++) {
/**獲取相對路徑 */
String realPath = "D:/IDEA/SpringBoot/web-fileupload/upload";
/*req.getSession().getServletContext().getRealPath("/uploadFile/");*/
/**設置時間格式 */
String format = sdf.format(new Date());
/**創建文件 */
File folder = new File(realPath + format);
/** 如果folder不存在,那就創建*/
if (!folder.isDirectory()) {
folder.mkdir();
}
/**獲取上傳文件的文件名作爲舊的文件名 */
String oldName = uploadFiles[i].getOriginalFilename();
/** 截取上傳文件的後綴名作爲新文件的後綴名*/
String newName = UUID.randomUUID().toString() +
oldName.substring(oldName.lastIndexOf("."), oldName.length());
File newFile = new File(folder.getAbsolutePath() + File.separator + newName);
try {
/**將上傳的文件轉移到新文件上 */
/**uploadFile.transferTo(new File(folder, newName));*/
/*FileUtils要使用commons的jar*/
FileUtils.copyInputStreamToFile(uploadFiles[i].getInputStream(), newFile);
/**getScheme()返回當前鏈接使用的協議;比如,一般應用返回http;SSL返回https; */
String filePath = req.getScheme() + "://" + req.getServerName() + ":" +
req.getServerPort() + "/upload/" + format + newName;
System.out.println(filePath);
} catch (IOException e) {
e.printStackTrace();
}
}
return "上傳失敗!";
}
創建視圖
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="/uploads" method="post" enctype="multipart/form-data">
<!--添加了multiple-->
<input type="file" name="uploadFiles" value="請選擇文件" multiple >
<input type="submit" value="上傳" >
</form>
</body>
</html>
@ControllerAdvice
@ControllerAdvice用的最多的場景就是全局異常處理,通過@ControllerAdvice和@ExceptionHandler定義全局異常捕獲機制,如下代碼所示:
@ControllerAdvice
public class CustomExceptionHandler {
/** @ExceptionHandler:用於處理異常,參數中可以添加各種類型異常*/
@ExceptionHandler(MaxUploadSizeExceededException.class)
public void uploadException(MaxUploadSizeExceededException e, HttpServletResponse resp)
throws IOException {
resp.setContentType("text/html;charset=utf-8");
PrintWriter out = resp.getWriter();
out.write("上傳文件大小超出限制!");
out.flush();
out.close();
}
}
CORS支持
CORS(Cross-Origin Resources Sharing)是由W3C制定的一種跨域資源共享技術標準,其目標是解決前端的跨域請求。在SpringBoot中配置CORS的步驟如下:
創建工程,添加依賴
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
創建控制器
@RestController
@RequestMapping("/book")
public class BookController {
/** 添加書籍*/
@PostMapping("/")
public String addBook(String name) {
return "receive:" + name;
}
/** 刪除書籍*/
@DeleteMapping("/{id}")
public String deleteBook(@PathVariable Long id) {
return String.valueOf(id);
}
}
配置跨域
@Configuration
public class MyWebMvcConfig implements WebMvcConfigurer {
/** 對匹配的請求路徑進行跨域處理*/
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/book/**")
.allowedHeaders("*")
.allowedMethods("*")
.maxAge(1800)
.allowedOrigins("http://localhost:8081");
}
}
測試
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>index</title>
<script src="jquery-3.5.1.js"></script>
</head>
<body>
<div id="contentDiv"></div>
<div id="deleteResult"></div>
<input type="button" value="提交數據" onclick="getData()"><br>
<input type="button" value="刪除數據" onclick="deleteData()"><br>
<script>
function deleteData() {
$.ajax({
url: 'http://localhost:8080/book/99',
type: 'delete',
success: function (msg) {
$("#deleteResult").html(msg);
}
})
}
function getData() {
$.ajax({
url: 'http://localhost:8080/book/',
type: 'post',
data: {name:'三國演義'},
success: function (msg) {
$("#contentDiv").html(msg);
}
})
}
</script>
</body>
</html>
之後將項目的端口修改爲8081,輸入http://localhost:8081/index.html運行查看結果
註冊攔截器
SpringBoot中攔截器的註冊更加方便,步驟如下:
創建攔截器
public class MyInterceptor1 implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
System.out.println("MyInterceptor1 >>> preHandle");
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
System.out.println("MyInterceptor1 >>> postHandle");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler,
Exception ex) throws Exception {
System.out.println("MyInterceptor1 >>> afterCompletion");
}
}
配置攔截器
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new MyInterceptor1())
.addPathPatterns("/**")
.excludePathPatterns("/hello");
}
}
測試
在controller類中添加兩個接口,對進行了攔截器配置的hello1進行訪問
@RestController
public class Hello1 {
@RequestMapping("/hello1")
public String sayHello1() {
return "Hello1!";
}
@RequestMapping("/hello")
public String sayHello() {
return "Hello!";
}
}
結果如下:
配置AOP
創建工程,添加依賴
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--添加aop功能-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
創建Service類
@Service
public class UserService {
public String getUserById(Integer id) {
System.out.println("get...");
return "user";
}
public void deleteUserById(Integer id) {
System.out.println("delete...");
}
}
創建切面類
@Component
@Aspect
public class LogAspect {
/** 定義切入點表達式*/
@Pointcut("execution(* com.lwz.demo.service.*.*(..))")
public void pc1() {
}
/** 定義前置通知*/
@Before(value = "pc1()")
public void before(JoinPoint jp) {
String name = jp.getSignature().getName();
System.out.println(name + "方法開始執行...");
}
/** 定義final通知*/
@After(value = "pc1()")
public void after(JoinPoint jp) {
String name = jp.getSignature().getName();
System.out.println(name + "方法開始結束...");
}
/** 用於定義後置通知:可以獲取目標方法的返回值*/
@AfterReturning(value = "pc1()", returning = "result")
public void afterReturning(JoinPoint jp, Object result) {
String name = jp.getSignature().getName();
System.out.println(name + "方法返回值爲" + result);
}
/** 用於定義異常通知*/
@AfterThrowing(value = "pc1()", throwing = "e")
public void afterThrowing(JoinPoint jp, Exception e) {
String name = jp.getSignature().getName();
System.out.println(name + "方法拋出異常了,異常是" + e.getMessage());
}
/** 用於定義環繞通知:可以實現以上的所有通知*/
@Around(value = "pc1()")
public Object around(ProceedingJoinPoint pjp) throws Throwable {
return pjp.proceed();
}
}
創建Controller類
@RestController
public class UserController {
@Autowired
private UserService userService;
@GetMapping("/getUserById/{id}")
public String getUserById(@PathVariable("id") Integer id) {
return userService.getUserById(id);
}
@RequestMapping("/deleteUserById/{id}")
public void deleteUserById(@PathVariable("id") Integer id) {
userService.deleteUserById(id);
}
}