SpringBoot系列三:整合Web开发


文件上传

单文件上传

创建工程,添加依赖

<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);
    }
}

测试查看结果

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_43894879/article/details/106911902