SpringBoot Web篇(二)

摘要

繼上一篇 SpringBoot Web篇(一)html


文件上傳

當咱們服務器須要接收用戶上傳的文件時,就須要使用MultipartFile做爲參數接收文件。以下:java

@PostMapping("/upload")
    public String uploadFile(MultipartFile file, HttpServletRequest request) {
        String format = sdf.format(new Date()); //格式化當前日期
        //文件保存的目錄, 根據本身需求定義
        String filePath = request.getServletContext().getRealPath("/img") + format;
        File folder = new File(filePath);

        if (!folder.exists()) {
            folder.mkdirs(); // 注意是mkdirs 不是mkdir,須要遞歸生成目錄
        }

        // 獲取上傳的文件名
        String oldName = file.getOriginalFilename();
        // 使用UUID和文件後綴組成新的文件名
        String newName = UUID.randomUUID().toString() + oldName.substring(oldName.lastIndexOf("."));

        try {
            // 保存文件
            file.transferTo(new File(folder, newName));
            // 返回保存的路徑
            String url = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + "/img" + format + newName;
            return url;
        } catch (IOException e) {
            e.printStackTrace();
        }

        return "error";
    }

當上傳多文件時,使用MultipartFile[]進行接收,或是多個MultipartFile, 這個須要根據表單上傳的方式決定。
若是表單上傳方式以下:則使用MultipartFile[]spring

<input type="file" name="files" multiple>

若是表單上傳方式以下:則使用多個MultipartFile編程

<input type="file" name="file1">
   <input type="file" name="file2">


路徑映射

當咱們直接能夠訪問某個動態頁面而不須要通過控制器時,咱們能夠以下設置:瀏覽器

@Configuration
public class WebMvcConfig implements WebMvcConfigurer {

    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("/java")
                .setViewName("hello");
    }
}

輸入localhost:8080/java時,會直接訪問到hello頁面緩存


類型轉換器

當用戶輸入 2019-11-14 這樣的數據時,如何在後臺轉換爲Date類型呢?以下:服務器

@GetMapping("/hello")
    public void hello(Date birth){
        System.out.println(birth);
    }

這時就能夠用到Spring的轉換器Converter,代碼實現以下:app

@Component
public class DateConverter implements Converter<String, Date> {

    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");

    @Override
    public Date convert(String s) {
        if (s != null && "".equals(s)) {
            try {
                return sdf.parse(s);
            } catch (ParseException e) {
                e.printStackTrace();
            }
        }
        return null;
    }
}

訪問localhost:8080/hello?birth=2019-11-14的url時,會自動幫你把2019-11-14轉爲Date類型。dom


AOP

Spring AOP面向切面編程,能夠切入到業務邏輯中作統一處理。例如事務、作日誌、權限驗證、請求...,
pom.xml下添加以下依賴:ide

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
        </dependency>

AOP切入類以下, 須要在切入類添加@Aspect註解,詳細的說明請在代碼中查看

@Component
@Aspect
public class AopComponent {

    /**
     * 設置切入點
     * org.java表明目錄,
     * 第一個 * 表明該目錄下的全部類
     * 第二個 * 表明類下的全部方法
     * (..) 表明方法下全部的參數
     * 得出:切入org.java目錄下的全部方法
     */
    @Pointcut("execution(* org.java.*.*(..))")
    public void pcl() {
    }

    /**
     * 進入方法前調用
     */
    @Before(value = "pcl()")
    public void before(JoinPoint jp) {
        String name = jp.getSignature().getName(); //方法名
        System.out.println("before--" + name);
    }

    /**
     * 方法結束後調用
     */
    @After(value = "pcl()")
    public void after(JoinPoint jp) {
        String name = jp.getSignature().getName();
        System.out.println("after--" + name);
    }

    /**
     * 有返回值才調用,且在@After前調用,並獲取到result(返回值)
     */
    @AfterReturning(value = "pcl()", returning = "result")
    public void afterReturning(JoinPoint jp, Object result) {
        String name = jp.getSignature().getName();
        System.out.println("afterReturning--" + name + "----" + result);
    }

    /**
     * 拋異常時調用
     * 不會調用@AfterReturning和不會調用around(由於沒有返回值)
     */
    @AfterThrowing(value = "pcl()", throwing = "e")
    public void afterThrowing(JoinPoint jp, Exception e) {
        String name = jp.getSignature().getName();
        System.out.println("afterThrowing--" + name + "----" + e.getMessage());
    }

    /**
     * 有返回值才調用
     * 對返回的數據進行處理,例如response設置統一返回格式
     * 在@AfterReturning前調用
     */
    @Around("pcl()")
    public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
        Object proceed = joinPoint.proceed();
        System.out.println("around--" + proceed.toString());
        return proceed;
    }
}

總的來講,內容以下:

@Aspect: 標明該類爲切面類
@Pointcut: 設置切入點
@Before: 進入方法前調用
@After: 方法結束後調用
@AfterReturning: 有返回值才調用,且在@After前調用,並獲取到result(返回值)
@AfterThrowing: 拋異常時調用,不會調用@AfterReturning和不會調用around(由於沒有返回值)
@Around: 有返回值才調用,對返回數據進行處理,在@AfterReturning前調用


瀏覽器的標籤圖標

就是修改瀏覽器上面的這個圖標:

把名爲favicon.ico圖標放在下面這兩個目錄均可以:

resources.static
resources

我是使用的時Google瀏覽器,更換後沒有即刻生效
從新打開瀏覽器就行了,應該時瀏覽器訪問後就會把favicon.ico緩存起來。


除去自動化配置

通常來講使用SpringBoot都不會用到,使用SpringBoot不就是貪圖他的自動化配置嗎?不過他仍是提供了除去自動化配置的功能:

方式一 Application

在你的啓動文件xxxApplication中, 例如除去ErrorMvcAutoConfiguration:

@SpringBootApplication(exclude = ErrorMvcAutoConfiguration.class)
...

方式二 properties或yml

spring.autoconfigure.exclude=...ErrorMvcAutoConfiguration


若文章有錯誤或疑問,可在下方評論,Thanks♪(・ω・)ノ。

相關文章
相關標籤/搜索