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 也可以.


相关文章
|
11月前
|
XML 安全 Java
使用 Spring 的 @Aspect 和 @Pointcut 注解简化面向方面的编程 (AOP)
面向方面编程(AOP)通过分离横切关注点,如日志、安全和事务,提升代码模块化与可维护性。Spring 提供了对 AOP 的强大支持,核心注解 `@Aspect` 和 `@Pointcut` 使得定义切面与切入点变得简洁直观。`@Aspect` 标记切面类,集中处理通用逻辑;`@Pointcut` 则通过表达式定义通知的应用位置,提高代码可读性与复用性。二者结合,使开发者能清晰划分业务逻辑与辅助功能,简化维护并提升系统灵活性。Spring AOP 借助代理机制实现运行时织入,与 Spring 容器无缝集成,支持依赖注入与声明式配置,是构建清晰、高内聚应用的理想选择。
913 0
|
11月前
|
缓存 监控 Java
SpringBoot @Scheduled 注解详解
使用`@Scheduled`注解实现方法周期性执行,支持固定间隔、延迟或Cron表达式触发,基于Spring Task,适用于日志清理、数据同步等定时任务场景。需启用`@EnableScheduling`,注意线程阻塞与分布式重复问题,推荐结合`@Async`异步处理,提升任务调度效率。
1628 128
|
XML JSON Java
Spring框架中常见注解的使用规则与最佳实践
本文介绍了Spring框架中常见注解的使用规则与最佳实践,重点对比了URL参数与表单参数的区别,并详细说明了@RequestParam、@PathVariable、@RequestBody等注解的应用场景。同时通过表格和案例分析,帮助开发者正确选择参数绑定方式,避免常见误区,提升代码的可读性与安全性。
|
11月前
|
Java 测试技术 API
将 Spring 的 @Embedded 和 @Embeddable 注解与 JPA 结合使用的指南
Spring的@Embedded和@Embeddable注解简化了JPA中复杂对象的管理,允许将对象直接嵌入实体,减少冗余表与连接操作,提升数据库设计效率。本文详解其用法、优势及适用场景。
503 126
|
10月前
|
前端开发 Java 微服务
《深入理解Spring》:Spring、Spring MVC与Spring Boot的深度解析
Spring Framework是Java生态的基石,提供IoC、AOP等核心功能;Spring MVC基于其构建,实现Web层MVC架构;Spring Boot则通过自动配置和内嵌服务器,极大简化了开发与部署。三者层层演进,Spring Boot并非替代,而是对前者的高效封装与增强,适用于微服务与快速开发,而深入理解Spring Framework有助于更好驾驭整体技术栈。
|
11月前
|
Java 测试技术 数据库
使用Spring的@Retryable注解进行自动重试
在现代软件开发中,容错性和弹性至关重要。Spring框架提供的`@Retryable`注解为处理瞬时故障提供了一种声明式、可配置的重试机制,使开发者能够以简洁的方式增强应用的自我恢复能力。本文深入解析了`@Retryable`的使用方法及其参数配置,并结合`@Recover`实现失败回退策略,帮助构建更健壮、可靠的应用程序。
1171 1
使用Spring的@Retryable注解进行自动重试
|
10月前
|
XML Java 应用服务中间件
【SpringBoot(一)】Spring的认知、容器功能讲解与自动装配原理的入门,带你熟悉Springboot中基本的注解使用
SpringBoot专栏开篇第一章,讲述认识SpringBoot、Bean容器功能的讲解、自动装配原理的入门,还有其他常用的Springboot注解!如果想要了解SpringBoot,那么就进来看看吧!
807 2
|
11月前
|
XML Java 数据格式
常用SpringBoot注解汇总与用法说明
这些注解的使用和组合是Spring Boot快速开发和微服务实现的基础,通过它们,可以有效地指导Spring容器进行类发现、自动装配、配置、代理和管理等核心功能。开发者应当根据项目实际需求,运用这些注解来优化代码结构和服务逻辑。
714 12
|
11月前
|
传感器 Java 数据库
探索Spring Boot的@Conditional注解的上下文配置
Spring Boot 的 `@Conditional` 注解可根据不同条件动态控制 Bean 的加载,提升应用的灵活性与可配置性。本文深入解析其用法与优势,并结合实例展示如何通过自定义条件类实现环境适配的智能配置。
623 0
探索Spring Boot的@Conditional注解的上下文配置