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

測試查看結果

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章