摘要

继上一篇 SpringBoot Web篇(一)

文件上传

当我们服务器需要接收用户上传的文件时,就需要使用MultipartFile作为参数接收文件。如下:

    @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[]:

   <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,代码实现如下:

@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类型。

AOP

Spring AOP面向切面编程,可以切入到业务逻辑中做统一处理。例如事务、做日志、权限验证、请求...,

pom.xml下添加如下依赖:

        <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♪(・ω・)ノ。

个人博客网址: https://colablog.cn/

如果我的文章帮助到您,可以关注我的微信公众号,第一时间分享文章给您

SpringBoot Web篇(二)的更多相关文章

  1. SpringBoot Web篇笔记(一)

    摘要 文章是根据江南一点雨(松哥)的视频进行总结 江南一点雨博客 全局异常处理 通常情况下,我们都需要对自己定义的异常进行相应的处理.捕获指定的异常方式如下: @ControllerAdvice pu ...

  2. (二)SpringBoot基础篇- 静态资源的访问及Thymeleaf模板引擎的使用

    一.描述 在应用系统开发的过程中,不可避免的需要使用静态资源(浏览器看的懂,他可以有变量,例:HTML页面,css样式文件,文本,属性文件,图片等): 并且SpringBoot内置了Thymeleaf ...

  3. Spring Boot 入门之 Web 篇(二)

    原文地址:Spring Boot 入门之 Web 篇(二) 博客地址:http://www.extlight.com 一.前言 上一篇<Spring Boot 入门之基础篇(一)>介绍了 ...

  4. 源码学习系列之SpringBoot自动配置(篇二)

    源码学习系列之SpringBoot自动配置(篇二)之HttpEncodingAutoConfiguration 源码分析 继上一篇博客源码学习系列之SpringBoot自动配置(篇一)之后,本博客继续 ...

  5. SpringBoot系列之集成logback实现日志打印(篇二)

    SpringBoot系列之集成logback实现日志打印(篇二) 基于上篇博客SpringBoot系列之集成logback实现日志打印(篇一)之后,再写一篇博客进行补充 logback是一款开源的日志 ...

  6. SpringBoot系列教程web篇之全局异常处理

    当我们的后端应用出现异常时,通常会将异常状况包装之后再返回给调用方或者前端,在实际的项目中,不可能对每一个地方都做好异常处理,再优雅的代码也可能抛出异常,那么在 Spring 项目中,可以怎样优雅的处 ...

  7. SpringBoot系列教程web篇之过滤器Filter使用指南扩展篇

    前面一篇博文介绍了在 SpringBoot 中使用 Filter 的两种使用方式,这里介绍另外一种直接将 Filter 当做 Spring 的 Bean 来使用的方式,并且在这种使用方式下,Filte ...

  8. SpringBoot系列教程Web篇之开启GZIP数据压缩

    本篇可以归纳在性能调优篇,虽然内容非常简单,但效果可能出乎预料的好: 分享一个真实案例,我们的服务部署在海外,国内访问时访问服务时,响应有点夸张:某些返回数据比较大的接口,耗时在 600ms+上,然而 ...

  9. SpringBoot系列之profles配置多环境(篇二)

    SpringBoot系列之profles配置多环境(篇二) 继续上篇博客SpringBoot系列之profles配置多环境(篇一)之后,继续写一篇博客进行补充 写Spring项目时,在测试环境是一套数 ...

随机推荐

  1. Java总结---继承(不断完善ing..)

    java三大特性:封装.继承.多态 继承 一.目的:实现代码的复用 二.简单例子(A继承了C): public class A extends C { //检测哪些可以在子类里使用 public vo ...

  2. Windows 7 SP1官方原版ISO系统镜像所有版本下载集合

    ========================================================================== Windows 7 With SP1 32位简体中 ...

  3. [BZOJ4990][Usaco2017 Feb]Why Did the Cow Cross the Road II

    Description Farmer John is continuing to ponder the issue of cows crossing the road through his farm ...

  4. MyBatis 开发手册

    这一遍看Mybatis的原因是怀念一下去年的 10月24号我写自己第一个项目时使用全配置文件版本的MyBatis,那时我们三个人刚刚大二,说实话,当时还是觉得MyBatis挺难玩的,但是今年再看最新版 ...

  5. 可实现的全局唯一有序ID生成策略

    在博客园搜素全局唯一有序ID,罗列出来的文章大致讲述了以下几个问题,常见的生成全局唯一id的常见方法 :使用数据库自动增长序列实现 : 使用UUID实现:  使用redis实现: 使用Twitter的 ...

  6. 数据结构c语言

    这篇博客是为了对数据结构进行一系列的学习整理,包括线性表,栈和队列,串,数组和广义表,树和二叉树,图,动态储存管理,查找,内部排序,外部排序文件进行部分笔记的记录. 基本概念和术语 数据:是对客观事物 ...

  7. JavaScript如何工作:垃圾回收机制 + 常见的4种内存泄漏

    原文地址: How JavaScript works: memory management + how to handle 4 common memory leaks 本文永久链接:https://d ...

  8. mysql字段按逗号,拆分并按条件查找

    mysql字段按逗号,拆分并按条件查找 mysql 表结构 CREATE TABLE `subid` ( `id1` varchar(255) DEFAULT NULL, `id2` varchar( ...

  9. 后台添加Textbox

    /// <summary> /// behind add textbox /// </summary> private void AddTextToTextBox() { Te ...

  10. C语言中的isalpha,isdigit,islower,isupper等一系列函数

    TITLE:c语言中的isalpha,isdigit,islower,isupper等一系列函数 已经全部验证检查,无任何错误 isalnum(测试字符是否为英文或数字) 相关函数 isalpha,i ...