文章目录
文件上传
单文件上传
创建工程,添加依赖
<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);
}
}