【SpringBoot 2.x】 开发实战day5,springboot与MVC、文件上传以及静态资源访问

本文探讨了SpringBoot与Spring MVC的关系,Spring MVC的功能是提供轻度耦合的web应用开发,而Spring Boot简化了项目搭建并实现了自动配置。在Spring MVC中,返回前端对象主要通过ModelAndView。文件上传需要满足三个条件,而静态资源配置可通过调整Spring Boot的配置文件来实现。
摘要由CSDN通过智能技术生成

一、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中返回前端对象由三种形式(设置上下文)

  1. ModelAndView (推荐)
  2. Model
  3. 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 可以指向静态资源路径,支持多个逗号分割。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值