《Day10》springMVC超详细注解介绍以及使用【springMVC制作网页文件上传和下载案例】

本文详述了SpringMVC中返回值处理的三种方式:String、ModelAndView和void。深入探讨了常用的注解如@RequestMapping、@RequestParam、@RequestHeader等的用法,并通过实际案例展示了文件上传和下载的实现。文章适合SpringMVC初学者和进阶者阅读。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、springMVC返回值的处理

1、返回值是String类型

在这里插入图片描述
返回的字符串就是逻辑视图,需要和视图解析器前缀和后缀拼接为一个真正的视图
在这里插入图片描述
在springMVC中,如果需要使用springMVC的处理器来处理请求,但是又不需要访问视图解析器固定的文件夹,可以采用两种方式来解决:
在返回的字符串上使用固定的单词:
转发:只能在当前项目中转发
返回forward地址
在这里插入图片描述
测试
在这里插入图片描述
重定向:可以跳转其他的项目资源
redirect:资源地址
在这里插入图片描述
测试
在这里插入图片描述

2、返回值是ModelAndView

返回的的视图和模型:
在这里插入图片描述

3、返回值是viod

可以使用servletAPI重定向或者转发
在这里插入图片描述
测试
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

可以返回一个json串
在这里插入图片描述
测试
在这里插入图片描述

二、srpingMVC的常用注解

(一)@RequestMapping *

1、该注解添加在handler(方法)上:
在这里插入图片描述
测试
在这里插入图片描述
如果在注解中只写一个路径是默认设置的value值:
在这里插入图片描述
在这里插入图片描述

测试; 如果限定了访问方法,就会抛出405异常
在这里插入图片描述
在这里插入图片描述
属性params 限制请求的参数
在这里插入图片描述

测试:
在这里插入图片描述
如果不传递name
在这里插入图片描述
在这里插入图片描述

  1. name 传递的参数中必须是name属性的传参
  2. !name 不能有name属性传参
  3. name=zsan 必须有name属性而且值必须是zsan
  4. name!=zsan 传递的参数如果有name属性 该属性值不能是zsan

2、注解添加在类上

添加到类上,该类下所有的requestMapping的url地址都添加该属性
访问当前类下url成为
在这里插入图片描述
作用:用来区别不同的controller,因为在项目开发中 可能多个控制层中不同的方法名称会出现重复。

(二)@requestParam *

如果传递的参数和handler中入参名称写的不一样 不能获取到

在这里插入图片描述
在这里插入图片描述
添加数据的时候如果提交的和后台的名称不一样:
在这里插入图片描述
在这里插入图片描述
注意:
在这里插入图片描述
可以通过requestParam来修改:
在这里插入图片描述
测试:
在这里插入图片描述
在这里插入图片描述
可以为当前的参数设置默认值:
在这里插入图片描述
测试:
在这里插入图片描述
在这里插入图片描述
属性required 设置当前的参数是必须要提交的:
在这里插入图片描述
测试:
在这里插入图片描述
添加name
在这里插入图片描述

(三)@RequestHeader

获取请求的头信息:
在这里插入图片描述
可以在后台获取到请求头信息:
在这里插入图片描述

测试:
在这里插入图片描述
在这里插入图片描述

(四)@ResponseBody *

将返回任意的数据转化为json对象
如果要使用该注解,必须要导入对应的依赖:

  <!--springMVC转化为json依赖包-->
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-core</artifactId>
            <version>2.9.8</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.9.8</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-annotations</artifactId>
            <version>2.9.8</version>
        </dependency>

创建一个新的类:
在这里插入图片描述

写handler
在这里插入图片描述

测试:
在这里插入图片描述
可以将任意的数据类型转化为json:
在这里插入图片描述

测试:
在这里插入图片描述
可以在异步中使用:
在这里插入图片描述
在这里插入图片描述
注意:js导包进去点锤子!!!!

(五)@RequestBody

获取请求体,可以ajax异步获取请求体:
在这里插入图片描述
测试
在这里插入图片描述
后台
在这里插入图片描述

(六)@SessionAttrbutes

将当前请求中request中对应的数据存放到session
springmvc如果要传输数据,是默认放在request域中的,如果要传输数据到session,就必须将session获取到,来传输数据。
该注解是写在类上的,该类下所有对应的handler中都会自动放数据
在这里插入图片描述
在这里插入图片描述
测试
demo02:
在这里插入图片描述

demo01:

在这里插入图片描述

当demo02controller添加注解
02:
在这里插入图片描述
01:
在这里插入图片描述
可以存放多个数据:
02中:
在这里插入图片描述

01中:
在这里插入图片描述
总结:存放多个值后会将这些值都存入session中

(七)@ModelAttribut

该注解是写在方法上面的,如果不带属性:
在这里插入图片描述
在这里插入图片描述
如果在注解中使用了属性,会将属性对应的值作为key,方法返回的值作为value放入到request域中
在这里插入图片描述
只要访问当前类中的hanler 都会默认存放 对应的数据
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
测试:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

(八)@CookieValue

获取cookie数据的注解,直接根据cookie对应的key获取数据:
在这里插入图片描述

查看当前使用的sessionid
在这里插入图片描述
结果:
在这里插入图片描述

(九)@PathVarable *

在restFul中使用 在rest风格中传参基本上不使用?传参使用url路径传参
在springMVC中 不能直接获取路径的参数
修改web.xml拦截路径:
在这里插入图片描述
访问html:
在这里插入图片描述
创建rest风格的handler:
在这里插入图片描述
测试:
在这里插入图片描述
后台:
在这里插入图片描述
可以传递多个参数
在这里插入图片描述
测试:
在这里插入图片描述
后台
在这里插入图片描述

三、springMVC的文件上传和下载

(一)文件上传
使用文件上传需要依赖第三方的插件,fileUpload

 <!--文件上传的依赖-->
        <dependency>
            <groupId>commons-fileupload</groupId>
            <artifactId>commons-fileupload</artifactId>
            <version>1.4</version>
        </dependency>

修改web.xml 使用后缀拦截:
在这里插入图片描述

核心配置文件中 要告诉springmvc做文件上传
在这里插入图片描述
创建前台页面:文件上传的三要素
在这里插入图片描述
创建文件上传的后台handler:

package com.csdn.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.util.UUID;

@Controller
@RequestMapping("/demo03")
public class Demo03Controller {
    //单文件上传
    @RequestMapping("/fileupload.do")
    public String fileUpLoad(String name, MultipartFile fileUpLoad, Model model){
        //MultipartFile springMVC文件上传的类 有两个方法
        //getOriginalFilename 获取上传文件的名称 (包含路径)
        String filename = fileUpLoad.getOriginalFilename();
        //处理文件名问题
        filename = filename.substring(filename.lastIndexOf("\\") + 1);
        //添加uuid唯一名称
        filename = UUID.randomUUID()+filename;
        //创建一个文件 上传地址的文件
        File file = new File("G:\\imgs",filename);
        //处理异常

        try {
            //上传文件 transferTo将文件上传到固定的目录
            fileUpLoad.transferTo(file);
            //上传成功后的信息
            model.addAttribute("message",name+",您上传的文件已成功");
        } catch (IOException e) {
            model.addAttribute("message",name+",您上传的文件未成功");
        }
        return "success";

    }

}

测试:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
如果上传的文件超过设计的字节数:
在这里插入图片描述
在这里插入图片描述
多文件上传:
两种方式:
可以通过单文件上传的进行拓展:
在这里插入图片描述
在这里插入图片描述
第二种:设置文件标签的属性:
在这里插入图片描述
页面:可以选择多个文件
在这里插入图片描述
完成多文件上传:
创建文件上传页面:
在这里插入图片描述
后台:文件上传使用的是数组,必须添加@RequestParam注解

package com.csdn.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.util.UUID;

@Controller
@RequestMapping("/demo04")
public class Demo04Controller {
    @RequestMapping("/fileuploads.do")
    public String fileUpLoad(String name, @RequestParam MultipartFile[] file01, Model model){
        //设置一参数
        int count = 0;
        //遍历数组
        for(MultipartFile multipartFile : file01){
            //判断文件是否为空 不能用null判断
            if (multipartFile.getSize() > 0){
                String filename= multipartFile.getOriginalFilename();
            //处理文件名问题
                filename = filename.substring(filename.lastIndexOf("\\")+1);
                //添加唯一名称uuid
                filename = UUID.randomUUID()+filename;
                //创建一个文件 上传地址文件
                File file = new File("G:\\imgs",filename);
               //处理异常
                try {
                    //上传文件transferTo将文件上传到固定的目录
                    multipartFile.transferTo(file);
                    //上传成功后此时+1
                    count++;
                } catch (IOException e) {
                    System.out.println("上传文件失败一次");
                }
            }
        }

        //遍历结束 判断上传的成功个数
        if (count==0){
            model.addAttribute("message",name+",您本次上传文件一个都未成功");
        }else{
            model.addAttribute("message",name+",您本次上传文件:"+file01.length+"个,上传成功:"+count+"个.");
        }
        return "success";
    }

}

测试:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

(二)文件下载

文件下载只支持单文件下载
后台实现单文件下载:

//文件下载
    @RequestMapping("/fileDown.do")
    public ResponseEntity<byte[]> fileDown(String path) throws IOException {
        //创建下载文件的父文件
        File file = new File("G:\\imgs");
        //解决下载中文乱码问题
        String newFileName = new String(path.getBytes("UTF-8"),"ISO-8859-1");
        //创建下载文件的file类
        File file1 = new File(file,path);
        //创建下载的文件头信息
        HttpHeaders headers = new HttpHeaders();
        //设置头信息下载的文件名称
        headers.setContentDispositionFormData("attachment",newFileName);
        //设置下载响应的类型 字节流类型
        headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
        //返回结果
        return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file1),headers, HttpStatus.OK);
    }

前台页面
在这里插入图片描述
测试:
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿福真的不想掉头发

大爷?赏点?

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值