写点什么

Spring 框架(五)SpringMVC 高级

  • 2021 年 11 月 11 日
  • 本文字数:4046 字

    阅读完需:约 13 分钟

File file=new File(path);


//判断文件夹是否存在


if (!file.exists()){


//创建文件夹


file.mkdirs();


}


//创建上传对象


ServletFileUpload upload=new ServletFileUpload(new DiskFileItemFactory());


//获得文件列表


List<FileItem> fileItems= upload.parseRequest(request);


for (FileItem item:fileItems){


//判断文件是不是普通表单项


if (item.isFormField()){


//如果是普通表单项,打印表单项名和值


System.out.println(item.getFieldName());


System.out.println(item.getString());


}else{


//如果是文件,截取后缀名


String filename= item.getName();


String suffix = filename.substring(filename.lastIndexOf("."));


//创建唯一的文件名


String uuid= UUID.randomUUID().toString().replace("-","");


filename = uuid + suffix;


//完成文件上传


item.write(new File(path,filename));


System.out.println("上传完毕");


}


}


//跳转到 success 页面


return "success";


}


2.1.2 SpringMVC 文件上传




依赖和表单和上面一样


上传方法中使用 MultipartFile 参数获得上传文件


@RequestMapping("/upload")


public String fileupload(HttpServletRequest request, MultipartFile upload) throws Exception {


//获取项目目录下的 upload 目录路径


String path = request.getSession().getServletContext().getRealPath("/upload/");


System.out.println(path);


File file = new File(path);


if (!file.exists()) {


file.mkdirs();


}


//获取上传文件名字


String filename = upload.getOriginalFilename();


String suffix = filename.substring(filename.lastIndexOf("."));


//创建唯一的文件名


String uuid= UUID.randomUUID().toString().replace("-","");


filename = uuid + suffix;


//完成文件上传


upload.transferTo(new File(path,filename));


return "success";


}


需要在 springmvc 的配置中添加上传处理器


<bean class="org.springframework.web.multipart.commons.CommonsMultipartResolver" id="multipartResolver">


<property name="maxUploadSize" value="10485760"/>


</bean>


2.1.3 SpringMVC 多文件上传




给表单添加多个文件项


<form action="/upload" method="post" enctype="multipart/form-data">


<input type="file" name="uploads">


<input type="file" name="uploads">


<input type="file" name="uploads">


<input type="submit" value="MVC 多文件上传">


</form>


添加 MultipartFile 数组为参数,参数名和表单 name 一致


@RequestMapping("/upload3")


public String fileupload3(HttpServletRequest request, MultipartFile[] uploads) throws Exception {


//获取 tomcat 项目目录下的 upload 目录路径


String path = request.getSession().getServletContext().getRealPath("/upload/");


System.out.println(path);


File file = new File(path);


if (!file.exists()) {


file.mkdirs();


}


for(MultipartFile upload : uploads) {


//获取上传文件名字


String filename = upload.getOriginalFilename();


String suffix = filename.substring(filename.lastIndexOf("."));


//创建唯一的文件名


String uuid = UUID.randomUUID().toString().replace("-", "");


filename = uuid + "-" + suffix;


//完成文件上传


upload.transferTo(new File(path, filename));


}


return "success";


}


2.1.4 SpringMVC 其它上传类




SpringMVC 还提供了其它 API 支持上传:


  • CommonsMultipartResolver 多部分解析器,用于判断请求是否存在上传文件

  • MultipartHttpServletRequest 多部分请求,用于获得文件相关信息


具体用法:


@RequestMapping("upload4")


public String fileupload4(HttpServletRequest request) throws IllegalStateException, IOException


{


String path = request.getSession().getServletContext().getRealPath("/upload/");


//创建多部分解析器


CommonsMultipartResolver multipartResolver=new CommonsMultipartResolver(


request.getSession().getServletContext());


//检查表单是否支持文件上传


if(multipartResolver.isMultipart(request)){


//将请求转换为多部分请求,支持上传


MultipartHttpServletRequest multiRequest=(MultipartHttpServletRequest)request;


//获取请求中所有的文件名


Iterator iter=multiRequest.getFileNames();


while(iter.hasNext()) {


//遍历所有文件


MultipartFile file=multiRequest.getFile(iter.next().toString());


if(file!=null) {


//获取上传文件名字


String filename = file.getOriginalFilename();


String suffix = filename.substring(filename.lastIndexOf("."));


//创建唯一的文件名


String uuid = UUID.randomUUID().toString().replace("-", "");


filename = uuid + suffix;


//上传


file.transferTo(new File(path,filename));


}


}


}


return "success";


}




2.2 文件下载




/**


  • 下载控制器


*/


@Controller


public class DownloadController {


@RequestMapping("download")


public void download(String file, HttpServletResponse response) throws IOException {


//下载文件的路径


String path = "D:\install\";


File downFile = new File(path+file);


if(downFile.exists()){


//设置浏览器下载内容类型,响应头


response.setContentType("application/x-msdownload");


response.setHeader("Content-Disposition","attachment;filename="+file);


//通过流发送文件


Files.copy(downFile.toPath(),response.getOutputStream());


}


}


}


3、RestFul


==============================================


【一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义】
浏览器打开:qq.cn.hn/FTf 免费领取
复制代码


=========================


3.1 前后端分离



3.1.1 前后端分离是什么

前端项目(html5、小程序、移动端),后端项目(java、数据库、tomcat)分开开发和部署

3.1.2 前后端分离优势

1)开发分工明确,前端团队和后端团队同时分工合作开发


2)项目分开部署不同的服务器,如:Tomcat 适合部署动态资源,Nginx 适合部署静态资源


3)便于测试和维护

3.1.3 前后端开发人员的交互方式

1)设计人员根据需求设计接口,提供接口文档


1)后端根据接口文档开发后台接口


2)前端通过接口请求数据,渲染页面


[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5TpfgxFJ-1608513277531)(SpringMVC.assets/clipboard-1608100199709.png)]


3.2 RESTFul



3.2.1 RESTFul 是什么

RESTFul 是一种网络应用程序的设计风格和开发方式,基于 HTTP,可以使用 XML 格式定义或 JSON 格式定义。适用于移动互联网厂商作为业务使能接口的场景,实现第三方调用移动网络资源的功能,动作类型为新增、变更、删除所调用资源。


RESTful 架构,是目前最流行的一种互联网软件架构。它结构清晰、符合标准、易于理解、扩展方便,所以正得到越来越多网站的采用。


3.2.2 RESTFul 架构的特点




  1. 每一个 URI 对应服务器上的一个资源(数据库数据、方法等)

  2. 通过不同 Http 请求方法来区别增删改查操作


  • GET --> 查询

  • POST --> 添加

  • PUT --> 更新

  • DELETE --> 删除


  1. 通信的格式是 JSON

3.2.3 RESTFul 风格的 API

传统 API 设计,常用动词定义 API,如:find、get、save、update、delete 等


查询所有书籍:


http://域名/book/findAll


查询一本书:


http://域名/book/findById?id=1


添加书籍:


http://域名/book/saveBook


更新书籍:


http://域名/book/updateBook


删除书籍:


http://域名/book/deleteBook?id=1


RESTFul 风格 API 设计,只使用名词,使用不同的请求方法来区别增删改查


查询所有书籍: GET


http://域名/books


查询一本书: GET


http://域名/book/1


添加书籍: POST


http://域名/book


更新书籍: PUT


http://域名/book


删除书籍: DELETE


http://域名/book/1


Restful 风格的控制器的实现


@RestController


public class BookController {


@Autowired


private BookService bookService;


@GetMapping("/books")


public JsonResult findAll(){


try {


List<Book> list = bookService.list();


return new JsonResult(1,list);


}catch (Exception ex){


ex.printStackTrace();


return new JsonResult(0,null);


}


}


@GetMapping("/book/{id}")


public JsonResult findById(@PathVariable("id")Integer id){


try {


Book book = bookService.getById(id);


return new JsonResult(1,book);


}catch (Exception ex){


ex.printStackTrace();


return new JsonResult(0,null);


}


}


@PostMapping("/book")


public JsonResult saveBook(@RequestBody Book book){


try {


bookService.save(book);


return new JsonResult(1,null);


}catch (Exception ex){


ex.printStackTrace();


return new JsonResult(0,null);


}


}


@PutMapping("/book")


public JsonResult updateBook(@RequestBody Book book){


try {


bookService.updateById(book);


return new JsonResult(1,null);


}catch (Exception ex){


ex.printStackTrace();


return new JsonResult(0,null);


}


}


@DeleteMapping("/book/{id}")


public JsonResult delBook(@PathVariable("id")Integer id){


try {


bookService.removeById(id);


return new JsonResult(1,null);


}catch (Exception ex){


ex.printStackTrace();


return new JsonResult(0,null);


}


}


}

3.2.4 浏览器支持 DELETE 和 PUT

浏览器默认只支持 GET 和 POST 请求,如果要表单提交 DELETE 或 PUT 请求,需要通过 SpringMVC 的过滤器来实现


web.xml 添加:


<filter>


<filter-name>HiddenHttpMethodFilter</filter-name>


<filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>


</filter>


<filter-mapping>


<filter-name>HiddenHttpMethodFilter</filter-name>


<url-pattern>/*</url-pattern>


</filter-mapping>


HiddenHttpMethodFilter 过滤器的作用是:过滤表单中名称为_method 的隐藏域,如果值是 DELETE 就将请求方法转换为 DELETE,是 PUT 就将请求方法转换为 PUT。


表单


<form action="/testDelete" method="post">


<input name="name" placeholder="输入姓名"><br>


<input type="hidden" name="_method" value="DELETE"/>


<input type="submit" value="提交">


</form>


结束

评论

发布
暂无评论
Spring框架(五)SpringMVC高级