来自 技术 2019-03-16 00:00 的文章

由@ModelAttribute想到的

开发十年,就只剩下这套架构体系了!>>>

有个哥们在公司里做了两天,匆匆忙忙完成了一个功能,跑路了,然后我就被指定接手了这个摊子。

功能很简单,上传一个固件升级文件,并为固件提供一个下载链接。他的代码是这么写的:

package com.zk.controller;import com.zk.model.Product;import com.zk.service.ProductTemplateService;import com.zk.util.Result;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.beans.factory.annotation.Value;import org.springframework.web.bind.annotation.*;import org.springframework.web.multipart.MultipartFile;import java.io.File;import java.io.IOException;@RequestMapping("/file")@RestControllerpublic class FileController { @Value("${web.file-path}") private String filePath; @Autowired private ProductTemplateService productTemplateService; @Value("${myhost}") private String myhost; @PostMapping("/upload") @ResponseBody public Result upload(@RequestParam("file") MultipartFile file, @ModelAttribute Product product){ Result result=Result.error(""); //文件判空 if(!file.isEmpty()){ String fileName =file.getOriginalFilename().replace("-",""); try { //创建文件 File file1 = new File(filePath + fileName); //创建url String url=myhost+fileName; //封装产品属性 product.setUrl(url); product.setFileName(fileName); //判断目录是否存在,不存在则创建 if(!file1.exists()){ file1.mkdirs(); } //写入至本地 file.transferTo(file1); result.setMsg("上传成功"); }catch (IOException e){ e.printStackTrace(); result.setMsg("上传失败"); } } return result; }}

方法参数中神奇地用到了@ModelAttribute, @ModelAttribute的主要作用是数据添加到Model对象中,用于视图页面的展示。

它的详细用法在此不做详述,它是Spring MVC提供的注解,当然在Spring Boot中也可以使用。

所以在这里用@ModelAttribute显得莫名其妙,我们的服务器并没有View,而实际上现在成熟的服务开发,特别是互联网公司的服务端开发已经彻底摆脱了MVC模式,视图的工作有专业的前端进行开发,数据通过Ajax或者websocket的方式实现前后端的交互。服务器更多扮演的是一个Restful resource的角色,也因此,@RestController还持续使用,但是ModelAndView已经极少再用了。专业的人做专业的事,我想这也是MVC模式out的原因吧,没有几个服务端开发人员会自己写模板了,不管是古董JSP,还是Spring Boot所支持的Thymeleaf。

看来摊子有点烂,代码要大改!