Spring MVC 中的常见注解的用法(下)

简介: Spring MVC 中的常见注解的用法

上传文件 @RequestPart


@RestController
@RequestMapping("/user")
public class UserController {
    @RequestMapping("/upload")
    //myfile 是接收的参数名, 赋值给 file
    public String upload(@RequestPart("myfile") MultipartFile file) throws IOException {
        String path = "E:\\image\\img.png";
        //保存文件
        file.transferTo(new File(path));
        return path;
    }
}

853cf5818094e519ed8ad49c58138db7_fc3bfecebaec4822b5a9463fdf802c84.png

11ec375d561c1a2906f18f06f55c476e_c471cd4777a540dbb90b9dd4389a0e32.png


该路径下确实保存了 img.png 图片

0f9a07771ac03ce77941f8c176d5d399_efa8acda90d04e6182161e9ee9db949e.png


上面的代码写法是有问题的, 如果有很多用户都要保存文件, 那文件名就不能写死了, 必须保证每次保存的文件名都不一样, 可以使用 UUID :


@RestController
@RequestMapping("/user")
public class UserController {
    @RequestMapping("/upload")
    public String upload(@RequestPart("myfile") MultipartFile file) throws IOException {
      //得到 UUID 并去掉 "-"
        String name = UUID.randomUUID().toString().replace("-","");
        //file.getOriginalFilename() 得到文件名
        //file.getOriginalFilename().lastIndexOf(".") 得到最后一个"."的下标
        //整个就是 name 拼接上 .后缀名
        name += file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf("."));
        String path = "E:\\image\\" + name;
        //保存文件
        file.transferTo(new File(path));
        return path;
    }
}

aabb8efb7b0066c015a74835ef55cf4c_90047f21bbb1400bad79f148620cccd7.png

多次提交得到的文件 :

f36c4ecebc68cefb73f837d369edc978_3027a779ec4d45aa95798359b3ff8302.png


获取 Cookie/Session/Header


  1. 获取 Cookie
@RestController
@RequestMapping("/user")
public class UserController {
    @RequestMapping("/get_cookie")
    public String getCookie(@CookieValue(value = "myCookie", required = false) String ck) {
        return ck;
    }
}

没有输出 :

5fc8389ea5f0b97cb0ece886d5467264_defe6c0b6bdc413ab2905ca6d8a4049e.png

通过前端构建一个 key 为 myCookie 的 cookie :

812b61bda01cea34dbb4d0bdeabf427e_1e941035f44c4a578806cc2ed770f8f2.png


  1. 获取 Session


要想获取 Session 首先要有 Session, 我们可以上传一个 Session :


@RestController
@RequestMapping("/user")
public class UserController {
    @RequestMapping("/set_session")
    public String setSession(HttpServletRequest request) {
        HttpSession session = request.getSession();
        if(session != null) {
            session.setAttribute("SESSION_KEY","张三");
            return "session set success";
        }
        return "session set fail";
    }
    @RequestMapping("/get_session")
    public String getSession(@SessionAttribute(required = false, value = "SESSION_KEY") String name) {
        return name;
    }
}

183e0f79c5cba92a88384aaea1f5512b_b6a57595f1a541b99826840d5612eb3b.png

3606b369b66cd5d68b3b363053f6f156_30f8caf2d87d4cf2b48da43d9df6df64.png

3. 获取 Header


@RestController
@RequestMapping("/user")
public class UserController {
    @RequestMapping("/get_header")
    public String getHeader(@RequestHeader("User-Agent") String userAgent) {
        return "UserAgent : " + userAgent;
    }
}

07ec896029390516b6dc3905f5ab22b6_0a5f125ad3de463d91abd9ac369d85b9.png

可以通过 fiddler 来抓包验证一下 :

ae7baff7f2ad779c292a8163bca49fde_634ec7f45d8e49c6b31e509384ebe280.png


3. 返回数据


默认请求下⽆论是 Spring MVC 或者是 Spring Boot 返回的都是 html 格式,如果需要返回非 html 格式数据, 就得使用 @ResponseBody 注解了, 我们之前一直使用的 @RestController 便是 @ResponseBody + @Controller 注解.


验证返回数据的默认格式 :


@Controller
public class Test {
    @RequestMapping("/b")
    public String t() {
        return "hello.html";
    }
}


因为没有这个前端页面, 所以返回出错 :


9a31eef995474cc613ec3937ae716435_e25be2dc3b8e4765800dd8f6fef32fe0.png

抓包(返回的是 html 格式) :

9ebdc7d4f5e8fce74f4a2908ca65fb5f_1bbe8f14106840de910f28216a539c50.png


在静态文件中加入 hello.html 文件 :

359591846fecf11117b518548110154b_db72229d16374ea386dae98e3f663b25.png


再次访问 :

43b38bbb5dce34e85deeaba424917c91_d97dac0f35d64dc9b7973ed832dc49d8.png


使用 @ResponseBody 返回字符串 :


@Controller
public class Test {
    @ResponseBody
    @RequestMapping("/a")
    public String t2() {
        return "hello.html";
    }
}

be056ca0bd4996f20c5bd6b9df1bd43c_5786be0219f24917a8e0b24f2762188d.png


或者使用 @RestController 也可以.


相关文章
|
1月前
|
Java Spring 容器
如何解决spring EL注解@Value获取值为null的问题
本文探讨了在使用Spring框架时,如何避免`@Value("${xxx.xxx}")`注解导致值为null的问题。通过具体示例分析了几种常见错误场景,包括类未交给Spring管理、字段被`static`或`final`修饰以及通过`new`而非依赖注入创建对象等,提出了相应的解决方案,并强调了理解框架原理的重要性。
106 4
|
16天前
|
Java Spring
在使用Spring的`@Value`注解注入属性值时,有一些特殊字符需要注意
【10月更文挑战第9天】在使用Spring的`@Value`注解注入属性值时,需注意一些特殊字符的正确处理方法,包括空格、引号、反斜杠、新行、制表符、逗号、大括号、$、百分号及其他特殊字符。通过适当包裹或转义,确保这些字符能被正确解析和注入。
|
5天前
|
XML JSON Java
SpringBoot必须掌握的常用注解!
SpringBoot必须掌握的常用注解!
23 4
SpringBoot必须掌握的常用注解!
|
29天前
|
XML Java 数据格式
Spring从入门到入土(bean的一些子标签及注解的使用)
本文详细介绍了Spring框架中Bean的创建和使用,包括使用XML配置文件中的标签和注解来创建和管理Bean,以及如何通过构造器、Setter方法和属性注入来配置Bean。
59 9
Spring从入门到入土(bean的一些子标签及注解的使用)
|
7天前
|
存储 缓存 Java
Spring缓存注解【@Cacheable、@CachePut、@CacheEvict、@Caching、@CacheConfig】使用及注意事项
Spring缓存注解【@Cacheable、@CachePut、@CacheEvict、@Caching、@CacheConfig】使用及注意事项
40 2
|
7天前
|
JSON Java 数据库
SpringBoot项目使用AOP及自定义注解保存操作日志
SpringBoot项目使用AOP及自定义注解保存操作日志
25 1
|
21天前
|
架构师 Java 开发者
得物面试:Springboot自动装配机制是什么?如何控制一个bean 是否加载,使用什么注解?
在40岁老架构师尼恩的读者交流群中,近期多位读者成功获得了知名互联网企业的面试机会,如得物、阿里、滴滴等。然而,面对“Spring Boot自动装配机制”等核心面试题,部分读者因准备不足而未能顺利通过。为此,尼恩团队将系统化梳理和总结这一主题,帮助大家全面提升技术水平,让面试官“爱到不能自已”。
得物面试:Springboot自动装配机制是什么?如何控制一个bean 是否加载,使用什么注解?
|
1天前
|
存储 安全 Java
springboot当中ConfigurationProperties注解作用跟数据库存入有啥区别
`@ConfigurationProperties`注解和数据库存储配置信息各有优劣,适用于不同的应用场景。`@ConfigurationProperties`提供了类型安全和模块化的配置管理方式,适合静态和简单配置。而数据库存储配置信息提供了动态更新和集中管理的能力,适合需要频繁变化和集中管理的配置需求。在实际项目中,可以根据具体需求选择合适的配置管理方式,或者结合使用这两种方式,实现灵活高效的配置管理。
6 0
|
26天前
|
XML Java 数据库
Spring boot的最全注解
Spring boot的最全注解
|
25天前
|
JSON 前端开发 Java
SSM:SpringMVC
本文介绍了SpringMVC的依赖配置、请求参数处理、注解开发、JSON处理、拦截器、文件上传下载以及相关注意事项。首先,需要在`pom.xml`中添加必要的依赖,包括Servlet、JSTL、Spring Web MVC等。接着,在`web.xml`中配置DispatcherServlet,并设置Spring MVC的相关配置,如组件扫描、默认Servlet处理器等。然后,通过`@RequestMapping`等注解处理请求参数,使用`@ResponseBody`返回JSON数据。此外,还介绍了如何创建和配置拦截器、文件上传下载的功能,并强调了JSP文件的放置位置,避免404错误。