一、springboot与MVC
首先我们应该知道springboot、springMVC、spring的关系
- springboot:只是一个配置工具,整合工具,辅助工具
- springMVC:是spring处理Web模块的一个框架,项目中实际运行的代码
- Spring :spring框架就像一个家族,有众多衍生产品例如 boot、security、jpa等等。但他们的基础都是Spring 的ioc和 aop. ioc 提供了依赖注入的容器, aop解决了面向横切面的编程,然后在此两者的基础上实现了其他延伸产品的高级功能。
Spring MVC是基于Servlet 的一个 MVC 框架主要解决 WEB 开发的问题,因为 Spring 的配置非常复杂,各种XML、 JavaConfig、hin处理起来比较繁琐。于是为了简化开发者的使用,从而创造性地推出了Spring boot,约定优于配置,简化了spring的配置流程。
说得更简便一些:Spring 最初利用“工厂模式”(DI)和“代理模式”(AOP)解耦应用组件。大家觉得挺好用,于是按照这种模式搞了一个 MVC框架(一些用Spring 解耦的组件),用开发 web 应用( SpringMVC )。然后发现每次开发都写很多样板代码,为了简化工作流程,于是开发出了一些“懒人整合包”(starter),这套就是 Spring Boot。
Spring MVC的功能
Spring MVC提供了一种轻度耦合的方式来开发web应用。
Spring MVC是Spring的一个模块,式一个web框架。通过Dispatcher Servlet, ModelAndView 和 View Resolver,开发web应用变得很容易。解决的问题领域是网站应用程序或者服务开发——URL路由、Session、模板引擎、静态Web资源等等。
Spring Boot的功能
Spring Boot实现了自动配置,降低了项目搭建的复杂度。
Spring Boot只是承载者,辅助你简化项目搭建过程的。如果承载的是WEB项目,使用Spring MVC作为MVC框架,那么工作流程和你上面描述的是完全一样的,因为这部分工作是Spring MVC做的而不是Spring Boot。
对使用者来说,换用Spring Boot以后,项目初始化方法变了,配置文件变了,另外就是不需要单独安装Tomcat这类容器服务器了,maven打出jar包直接跑起来就是个网站,但你最核心的业务逻辑实现与业务流程实现没有任何变化。
所以,用最简练的语言概括就是:
Spring 是一个“引擎”;
Spring MVC 是基于Spring的一个 MVC 框架;
Spring Boot 是基于Spring4的条件注册的一套快速开发整合包。
二、在springMVC中返回前端对象由三种形式(设置上下文)
- ModelAndView (推荐)
- Model
- WebRequest或者原生的HttpServletRequest(不推荐)
用法:
ModelAndView :返回对象即可,整合了视图和页面模块。
@RequestMapping(value = "/", method = RequestMethod.GET)
public ModelAndView index() {
// 设置跳转页面
ModelAndView mav = new ModelAndView("index");
// 添加数据
mav.addObject("emps", emps);
return mav;
}
Model 相对于ModelAndView 来说,调用方式多传递个参数,耦合度更高,返回格式为页面
@RequestMapping(value = "/model", method = RequestMethod.GET)
public String index(Model model) {
model.addAttribute("empsModel", emps);
return "index";
}
WebRequest
@RequestMapping(value = "/Web", method = RequestMethod.GET)
public String index(WebRequest req, HttpServletRequest httpServletRequest) {
// setAttribute 在当前请求中放入对象,这种方式与J2EE web容器强耦合
req.setAttribute("empsWeb", emps,0);
httpServletRequest.setAttribute("empsHttp", emps);
return "index";
}
这里推荐使用ModelAndView,因为相对于另外两个,耦合度更低,更加符合“高内聚,低耦合”设计原则。
三、文件上传
文件上传三个条件:
1、post提交
2、具备file组件
3、设置表单的enctype=“multipart/form-data”
上代码
<form action="/create" method="post" enctype="multipart/form-data">
<div class="form-group">
<label for="phone">员工照片</label>
<input type="file" id="phone" name="phone"/>
</div>
</form>
@Value("${app.upload.location}")
private String path = null;
@PostMapping("/create")
public ModelAndView create(Emp emp, @RequestParam("phone") MultipartFile phone) throws IOException {
// 原始文件名,为了防止文件名相同,采用时间戳
String fileName = new SimpleDateFormat("yyyyMMddHHmmssSSS").format(new Date());
// 获取文件后缀名
String suffix = phone.getOriginalFilename().substring(phone.getOriginalFilename().lastIndexOf("."));
if (".jpg".equals(suffix)) {
throw new RuntimeException("无效的图片格式!");
}
// 将临时文件夹中的文件复制到指定目录
FileCopyUtils.copy(phone.getInputStream(), new FileOutputStream(path + fileName + suffix));
emp.setPhotoFile(fileName + suffix);
emps.add(emp);
// 请求转发到根路径地址
ModelAndView mav = new ModelAndView("redirect:/");
return mav;
}
四、静态资源配置和访问
在springboot 2.X中访问 /resource/static 下静态资源时,很多人都碰到过404访问不到的问题
通过配置文件(.properties / .yml)
spring:
mvc:
# 配置静态资源路径,默认为/**
static-path-pattern: /static/**
resources:
# 这里设置要指向的路径,多个使用英文逗号隔开,在前面的优先级高
static-locations: classpath:/META-INF/resources/,classpath:/resources/, classpath:/static/, classpath:/public/
如果定义
static-path-pattern: /static/**,则访问static-locations里目录时都应加上”/static/”,
spring.mvc.static-path-pattern 只可以定义一个,目前不支持多个逗号分割的方式。
spring.resources.static-locations 可以指向静态资源路径,支持多个逗号分割。