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项目时,在测试环境是一套数 ...
随机推荐
- restTemplate getForObject中map传参问题
在使用restTemplate中getForObject的map传参形式时: 开始时我是这么调用的: RestTemplate rest = new RestTemplate(); Map<St ...
- Validator 常用注解
说明 Validator主要是校验用户提交的数据的合理性的,比如是否为空了,密码长度是否大于6位,是否是纯数字的,等等.那么在spring boot怎么使用这么强大的校验框架呢. 常用 @null 验 ...
- PhantomJS not found on PATH
使用vue-cli创建项目后,npm init常出现以下问题:PhantomJS not found on PATH 这是因为文件phantomjs-2.1.1-windows.zip过大,网络不好容 ...
- Linux低权限用户记录ssh密码
0x01 场景 现在有个攻击场景,就是你拿到了linux外网服务器的webshell,要做内网渗透前肯定要收集信息.其中可以做的一个工作是重新编译ssh来记录管理员的密码信息,信息可以用来撞其他机器的 ...
- VBS 去除文件夹下 Excel 的公式
注意问题 window 环境下运行, 代码 ANSI 编码格式保存. 直接放到需要转换的文件夹下,双击运行. 代码 function getfolder() getfolder=left(wscrip ...
- JavaScript中Array(数组) 对象
JavaScript中Array 对象 JavaScript中创建数组有两种方式 (一)使用直接量表示法: var arr4 = []; //创建一个空数组var arr5 = [20]; // 创建 ...
- 关于Mapper.xml生效的问题
昨天在新建Springboot启动后,发现执行相关的SQL报错,具体报错信息如下: org.apache.ibatis.binding.BindingException: Invalid bound ...
- go-go协程
package main import ( "fmt" "runtime" "time" ) func test() { defer fmt ...
- 开普勒云平台:如何配置gitlab与Jenkins
一.Kplcloud是什么? kplcloud是一个基于Kubernetes的轻量级PaaS平台,通过可视化的界面对应用进行管理,降低应用容器化的对度,从而减少应用容器化的时间成本. Kplcloud ...
- 算法<初级> - 第二章 队列、栈、哈希表相关问题
算法 - 第二章 数据结构 题目一 用数组实现大小固定的队列和栈(一面题) 数组实现大小固定栈 /*** * size是对头索引(initSize是固定大小) 也是当前栈大小 * size=下个进队i ...