SpringBoot Web篇(二)
摘要
继上一篇 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篇(二)的更多相关文章
- SpringBoot Web篇笔记(一)
摘要 文章是根据江南一点雨(松哥)的视频进行总结 江南一点雨博客 全局异常处理 通常情况下,我们都需要对自己定义的异常进行相应的处理.捕获指定的异常方式如下: @ControllerAdvice pu ...
- (二)SpringBoot基础篇- 静态资源的访问及Thymeleaf模板引擎的使用
一.描述 在应用系统开发的过程中,不可避免的需要使用静态资源(浏览器看的懂,他可以有变量,例:HTML页面,css样式文件,文本,属性文件,图片等): 并且SpringBoot内置了Thymeleaf ...
- Spring Boot 入门之 Web 篇(二)
原文地址:Spring Boot 入门之 Web 篇(二) 博客地址:http://www.extlight.com 一.前言 上一篇<Spring Boot 入门之基础篇(一)>介绍了 ...
- 源码学习系列之SpringBoot自动配置(篇二)
源码学习系列之SpringBoot自动配置(篇二)之HttpEncodingAutoConfiguration 源码分析 继上一篇博客源码学习系列之SpringBoot自动配置(篇一)之后,本博客继续 ...
- SpringBoot系列之集成logback实现日志打印(篇二)
SpringBoot系列之集成logback实现日志打印(篇二) 基于上篇博客SpringBoot系列之集成logback实现日志打印(篇一)之后,再写一篇博客进行补充 logback是一款开源的日志 ...
- SpringBoot系列教程web篇之全局异常处理
当我们的后端应用出现异常时,通常会将异常状况包装之后再返回给调用方或者前端,在实际的项目中,不可能对每一个地方都做好异常处理,再优雅的代码也可能抛出异常,那么在 Spring 项目中,可以怎样优雅的处 ...
- SpringBoot系列教程web篇之过滤器Filter使用指南扩展篇
前面一篇博文介绍了在 SpringBoot 中使用 Filter 的两种使用方式,这里介绍另外一种直接将 Filter 当做 Spring 的 Bean 来使用的方式,并且在这种使用方式下,Filte ...
- SpringBoot系列教程Web篇之开启GZIP数据压缩
本篇可以归纳在性能调优篇,虽然内容非常简单,但效果可能出乎预料的好: 分享一个真实案例,我们的服务部署在海外,国内访问时访问服务时,响应有点夸张:某些返回数据比较大的接口,耗时在 600ms+上,然而 ...
- SpringBoot系列之profles配置多环境(篇二)
SpringBoot系列之profles配置多环境(篇二) 继续上篇博客SpringBoot系列之profles配置多环境(篇一)之后,继续写一篇博客进行补充 写Spring项目时,在测试环境是一套数 ...
随机推荐
- centos7升级openssl、openssh常见问题及解决方法
升级至openssl 1.1.1版本 升级至openssh 8.0版本 openssl version -a 当前查看版本 一.安装telnet (以防升级失败,连不上服务器,建议弄) #查看是否 ...
- 让你如“老”绅士般编写 Python 命令行工具的开源项目:docopt
作者:HelloGitHub-Prodesire HelloGitHub 的<讲解开源项目>系列,项目地址:https://github.com/HelloGitHub-Team/Arti ...
- python学习(索引/切片)
一.索引 1.索引值从左到右-->从0开始,索引值从右到左-->从-1开始 取值格式var[index] >>> name = "xinfangshuo&quo ...
- shark恒破解笔记1-壳内寻找注册码
记录学习shark恒大教程的学习记录 壳内寻找注册码 OD打开 明显有壳 F9先运行程序 2.Ctrl+G输入401000到解码段,如果出现db ** 说明已经解码过,脱离了程序本身的壳 鼠标右键-& ...
- std::shared_future/future
std::future提供了一种访问异步操作结果的机制.
- 概念理解:boost::asio::定时器1
同步定时器 #include <cstdio> #include <iostream> #include <boost/asio.hpp> #include < ...
- 原来热加载如此简单,手动写一个 Java 热加载吧
1. 什么是热加载 热加载是指可以在不重启服务的情况下让更改的代码生效,热加载可以显著的提升开发以及调试的效率,它是基于 Java 的类加载器实现的,但是由于热加载的不安全性,一般不会用于正式的生产环 ...
- SpringBoot中如何优雅的读取yml配置文件?
YAML是一种简洁的非标记语言,以数据为中心,使用空白.缩进.分行组织数据,从而使得表示更加简洁易读.本文介绍下YAML的语法和SpringBoot读取该类型配置文件的过程. 本文目录 一.YAML基 ...
- java.sql.SQLException: Access denied for user 'root'@'localhost' (using password: NO)报错
今天用spring整合mybatis的时候,报了这个错误.去网上查了一下,网上大多数都是用户权限问题,但是我用SQLyog视图使用root用户crud没有问题,排除了是权限的问题,后面发现是idea提 ...
- Java线程切换(一)
(本文由言念小文原创,转载请注明出处) 一 前言有Android开发经验的同学都清楚,UI的更新必须在主线程中进行,且主线程不能被阻塞,否则系统ANR异常.我们往往做一些数据处理是耗时操作,必须要在 ...