当前位置: 首页 > news >正文

【SpringMVC】参数传递 重定向与转发 REST风格

文章目录

    • 参数传递
    • 重定向与转发
    • REST风格

参数传递

ModelAndView:包含视图信息和模型数据信息

public ModelAndView index1(){// 返回页面ModelAndView modelAndView = new ModelAndView("视图名");// 或// ModelAndView modelAndView = new ModelAndView();// modelAndView.setViewName("视图名");// 添加数据模型 可在视图中使用 作用域为请求范围(request scope)modelAndView.addObject("键","值");return modelAndView;
}

Model:以Map方式进行存储,用于向作用域中存值

public String index1(Model model){// 在 Model 中增加模型数据 作用域为请求范围(request scope)model.addAttribute("userName","张三");return "/user.jsp";
}

在 Model 中增加模型数据,若不指定 key,则默认使用对象的类型作为 key

Map:以Map方式进行存储,用于向作用域中存值

public String index1(Map<String ,Object> map){map.put("userName","张三");return "/user.jsp";
}

使用 @ModelAttribute@SessionAttributes 注解来处理模型数据和会话数据。

@ModelAttribute 注解用于将方法参数绑定到模型中,或者将方法返回值添加到模型中。它可以在方法级别或方法参数级别使用。

@Controller
public class UserController {@RequestMapping(value = "/user")public String index1(@ModelAttribute("user") User user) {user.setUserName("张三");System.out.println(user.getUserName());return "/user.jsp";}
}

@SessionAttributes 注解用于将特定的模型属性存储在 HTTP 会话中。它可以定义在控制器类上,以指定哪些模型属性需要存储在会话中。

@Controller
@SessionAttributes(value = {"userName"})
public class IndexController {@RequestMapping("/user")public ModelAndView index() {ModelAndView modelAndView = new ModelAndView("/user.jsp");// 存入 Request 作用域和 Session 作用域modelAndView.addObject("userName", "张三");return modelAndView;}
}

@SessionAttributes 的不同用法

// 按属性名存储:将 model 中指定名称的模型属性存储在会话中。
@SessionAttributes(value = {"userName", "userPwd"})
// 按类型存储:将 model 中所有指定类型的模型属性存储在会话中。
@SessionAttributes(types = User.class)
@SessionAttributes(types = {User.class, Dept.class})
// 按属性名和类型存储:将 model 中所有指定名称和类型的模型属性存储在会话中。
@SessionAttributes(value = {"user1", "user2"}, types = {Dept.class})
// 组合存储:将 model 中多个属性名和类型的模型属性存储在会话中。
@SessionAttributes(value = {"user1", "user2"}, types = {User.class, Dept.class})

servlet 方式

<!-- 引入servlet-api -->
<dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>3.1.0</version><scope>provided</scope>
</dependency>
public String cs(HttpServletRequest request, HttpServletResponse response, HttpSession session){session.setAttribute("userName","123");return "/user.jsp";
}

使用 Servlet 方式直接操作 HttpSession 对象,只存入 session 作用域中。

重定向与转发

@Controller
public class IndexController {@RequestMapping(value = "/index1", method = RequestMethod.GET)public String index1(User user, Model model) {// 设置用户姓名user.setUser_name("张三");model.addAttribute("user", user);// 重定向到 /user.jsp// return "redirect:/user.jsp";// 转发到 /user.jsp(forward:可省略)return "forward:user";}
}

配置视图解析器确保视图名称能够正确解析为视图文件。使用 InternalResourceViewResolver 示例配置:

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"><property name="prefix" value="/WEB-INF/views/"/><property name="suffix" value=".jsp"/>
</bean>

InternalResourceViewResolver 被配置为前缀为 /WEB-INF/views/,后缀为 .jsp,当控制器返回 forward:user 时,视图解析器会将 user 解析为 /WEB-INF/views/user.jsp

@ResponseBody:返回JSON数据 一般用于方法上

1、首先确保你的项目中已经包含了 Jackson 库

<!-- JSON依赖 -->
<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-core</artifactId><version>2.4.3</version>
</dependency>
<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.4.3</version>
</dependency>

2、在 User 实体类上添加注解,控制 JSON 序列化

使用 @JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL)来指定当属性为null时不序列化该属性。

@JsonInclude(JsonInclude.Include.NON_NULL) // 代替@JsonSerialize
public class User {}

前端也能判断,一般不加注解。

3、调整 Controller

确保 Controller 可以正确处理请求并返回 JSON 格式的数据

@RestController // @Controller + @ResponseBody
@RequestMapping("/api")
public class UserController {@Autowiredprivate UserService userService;@GetMapping("/testjson")public User jsons(@RequestParam long userId) {User user = this.userService.getUserById(userId);return user; // 直接返回对象}
}

使用 ResultJSON 工具类

public class ResultJSON<T> {private Integer code;private String msg;private T data;public ResultJSON(Integer code, String msg,T data) {this.code = code;this.msg = msg;this.data = data;}public static <T> ResultJSON success(T data){return new ResultJSON(200,"操作成功",data);}public static ResultJSON success(){return new ResultJSON(200,"操作成功",null);}public static ResultJSON success(Integer code,String msg){return new ResultJSON(code,msg,null);}public static ResultJSON error(){return new ResultJSON(400,"操作失败",null);}public static ResultJSON error(Integer code,String msg){return new ResultJSON(code,msg,null);}...
}
@RestController // @Controller + @ResponseBody
@RequestMapping("/provider")
public class ProviderController {@RequestMapping(value = "/findProviderById", method = RequestMethod.GET)public ResultJSON<Provider> findProviderById(@RequestParam Integer id) {// 创建一个示例Provider对象Provider provider = new Provider();provider.setId(111);provider.setProName("小米科技");// 返回成功结果(JSON数据)return ResultJSON.success(provider);}
}

可以返回集合

List<Provider> list = Arrays.asList(provider,provider1,provider2);
return ResultJSON.success(list);

@DateTimeFormat:用户对象属性,控制入参时日期类型转换

@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") // 年月日时分秒
private Date userLoginEndtime;

@JsonFormat:返回 JSON 数据时日期类型处理

@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss")
private Date userLoginEndtime;

最常用的还是把日期类型改为字符串(前端取到的数据是 String)

private String userLoginEndtime;

@RequestHeader:获取请求头中的参数

在这里插入图片描述

@ResponseBody
@RequestMapping(value = "/index",method = RequestMethod.POST)
public User index(@RequestHeader(value = "token",defaultValue = "1",required = false) int tokenid){......
}

从 HTTP 头中获取名为 token 的值。如果这个头部信息不存在,它将使用默认值1。

REST风格

REST(Representational State Transfer)设计风格基于 HTTP 协议,利用 HTTP 的方法(如GET、POST、PUT、DELETE等)来操作资源。

在REST中,每个事物都被视为一种资源,可以是一个实体(例如用户、产品)、集合(例如用户列表)或更抽象的概念。每个资源都有一个唯一的标识符(URI),客户端通过这个标识符来访问资源。

@Controller
public class UserController {@RequestMapping(value = "/user/{userId}.html")public String index1(@PathVariable("userId") Long userId) {System.out.println("id : " + userId);return "user";  // 返回视图名称}
}
// 请求路径为:
.../user/userId.html 如 .../user/12.html

相关文章:

【SpringMVC】参数传递 重定向与转发 REST风格

文章目录 参数传递重定向与转发REST风格 参数传递 ModelAndView&#xff1a;包含视图信息和模型数据信息 public ModelAndView index1(){// 返回页面ModelAndView modelAndView new ModelAndView("视图名");// 或// ModelAndView modelAndView new ModelAndView(…...

性能测试需求分析(超详细总结)

&#x1f345; 点击文末小卡片 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 1、客户方提出 客户方能提出明确的性能需求&#xff0c;说明对方很重视性能测试&#xff0c;这样的企业一般是金融、电信、银行、医疗器械等&#xff1b;他们…...

显卡(Graphics Processing Unit,GPU)架构详细解读

显卡架构主要分为两大类&#xff1a;GPU 核心架构&#xff08;也称为图形处理单元架构&#xff09;和显卡的其他组件&#xff08;如内存、控制器、输出接口等&#xff09;。本篇文章将对显卡架构进行详细分析&#xff0c;重点介绍 GPU 核心架构、显卡计算单元、显存结构、显卡管…...

【大语言模型】ACL2024论文-24 图像化歧义:Winograd Schema 挑战的视觉转变

【大语言模型】ACL2024论文-24 图像化歧义&#xff1a;Winograd Schema 挑战的视觉转变 目录 文章目录 【大语言模型】ACL2024论文-24 图像化歧义&#xff1a;Winograd Schema 挑战的视觉转变目录摘要研究背景问题与挑战如何解决核心创新点算法模型实验效果&#xff08;包含重要…...

AcWing 2868. 子串分值

文章目录 前言代码思路 前言 还是实力不允许啊&#xff0c;要是实力允许我就一道一道中等题刷了。简单题真够呛。有些题看题解都是看老半天看不懂&#xff0c;假设是这种我是真感觉没必要钻研。我现在大三&#xff0c;要是看一遍题解看不懂就算了&#xff0c;果断放弃。真可以…...

如何进行 JavaScript 性能优化?

要进行 JavaScript 性能优化&#xff0c;我们可以从多个角度进行思考&#xff0c;主要包括减少页面渲染时间、减少内存占用、优化代码执行效率等。以下是优化的一些方法&#xff0c;并结合实际项目代码示例讲解。 目录结构 减少 DOM 操作 缓存 DOM 元素批量更新 DOM 优化 Jav…...

使用TCP编程实现简单登录功能

在Java中&#xff0c;使用TCP编程实现登录功能通常涉及以下步骤&#xff1a; 创建服务器端&#xff0c;监听特定端口&#xff0c;等待客户端连接。创建客户端&#xff0c;连接到服务器端。客户端发送用户名和密码到服务器端。服务器端验证用户名和密码。服务器端返回验证结果给…...

卷积神经网络(CNN)的层次结构

卷积神经网络&#xff08;CNN&#xff09;是一种以其处理图像和视频数据的能力而闻名的深度学习模型&#xff0c;其基本结构通常包括以下几个层次&#xff0c;每个层次都有其特定的功能和作用&#xff1a; 1. 输入层&#xff08;Input Layer&#xff09;&#xff1a; 卷积神经网…...

操作系统文件管理相关习题2

文件管理的任务和功能文件管理 任务&#xff1a;对用户文件和系统文件进行组织管理&#xff0c;以方便用户使用&#xff0c;并保证文件的安全 功能&#xff1a;文件存储空间的管理&#xff0c;目录管理&#xff0c;文件读写管理和保护 目录管理 对目录管理的要求 实现按名存…...

react 通过ref调用子组件的方法

背景 父组件内引入了一个弹窗组件&#xff0c;弹窗组件使用了完全内聚的开发方法&#xff1b; 实现思路 父组件内通过ref获取的子组件&#xff0c;通过current调用子组件的方法&#xff0c;子组件需要通过forwardRef进行“包装”导出&#xff0c;通过useImperativeHandle暴露…...

【计算机网络】 —— 数据链路层(壹)

文章目录 前言 一、概述 1. 基本概念 2. 数据链路层的三个主要问题 二、封装成帧 1. 概念 2. 帧头、帧尾的作用 3. 透明传输 4. 提高效率 三、差错检测 1. 概念 2. 奇偶校验 3. 循环冗余校验CRC 1. 步骤 2. 生成多项式 3. 例题 4. 总结 四、可靠传输 1. 基本…...

AcWing 93. 递归实现组合型枚举

文章目录 前言代码思路 前言 今天晚上还有三个小时&#xff0c;写一晚上简单题。划水。 代码 #include<bits/stdc.h> using namespace std; int n,m; void dfs(int u,int sum,int state){if(sumn-u<m){return;//sum 表示当前选了 sum 个数字&#xff0c;假设把所有…...

vscode 折叠范围快捷键

vscode 折叠范围快捷键 问答 原文网址:https://www.n.cn/search/c830b29cb76146d08cae5074acfd4785 VSCode 折叠范围快捷键 在使用Visual Studio Code&#xff08;VSCode&#xff09;进行代码编辑时&#xff0c;掌握一些快捷键可以大大提高工作效率。以下是关于VSCode中折叠和…...

RabbitMQ 实现分组消费满足服务器集群部署

实现思路 使用扇出交换机&#xff08;Fanout Exchange&#xff09;&#xff1a;扇出交换机会将消息广播到所有绑定的队列&#xff0c;确保每个消费者组都能接收到相同的消息。为每个消费者组创建独立的队列&#xff1a;每个消费者组拥有自己的队列&#xff0c;所有属于该组的消…...

Chromium网络调试篇-Fiddler 5.21.0 使用指南:捕获浏览器HTTP(S)流量(二)

概述 在上一篇文章中&#xff0c;我们介绍了Fiddler的基础功能和如何安装它。今天我们将深入探讨如何使用Fiddler来捕获HTTP请求&#xff0c;这是Fiddler的一个核心能力&#xff0c;对于前端开发者、测试人员以及安全研究人员来说非常有用。捕获HTTP请求可以帮助我们更好地理解…...

个人IP建设:简易指南

许多个体创业者面临的一个关键挑战是如何为其企业创造稳定的需求。 作为个体创业者&#xff0c;您无法使用营销团队&#xff0c;因此许多人通过推荐和他们的网络来产生需求。因此&#xff0c;扩大您的网络是发展您的业务和产生持续需求的最佳策略。 这就是个人IP和品牌发挥作…...

智能指针【C++11】

文章目录 智能指针std::auto_ptr std::unique_ptrstd::shared_ptrstd::shared_ptr的线程安全问题std::weak_ptr 智能指针 std::auto_ptr 管理权转移 auto_ptr是C98中引入的智能指针&#xff0c;auto_ptr通过管理权转移的方式解决智能指针的拷贝问题&#xff0c;保证一个资源…...

【Linux 篇】Docker 启动和停止的精准掌舵:操控指南

文章目录 【Linux篇】Docker 启动和停止的精准掌舵&#xff1a;操控指南前言docker基本命令1. 帮助手册 2. 指令介绍 常用命令1. 查看镜像2. 搜索镜像3. 拉取镜像4. 删除镜像5. 从Docker Hub拉取 容器的相关命令1. 查看容器2. 创建与启动容器3. 查看镜像4. 启动容器5. 查看容器…...

Cursor vs VSCode:主要区别与优势分析

Cursor - The AI Code Editor 1. AI 集成能力 Cursor的优势 原生AI集成&#xff1a; # Cursor可以直接通过快捷键调用AI # 例如&#xff1a;按下 Ctrl K 可以直接获取代码建议 def complex_function():# 在这里&#xff0c;你可以直接询问AI如何实现功能# AI会直接在编辑器中…...

从单体到微服务:如何借助 Spring Cloud 实现架构转型

一、Spring Cloud简介 Spring Cloud 是一套基于 Spring 框架的微服务架构解决方案&#xff0c;它提供了一系列的工具和组件&#xff0c;帮助开发者快速构建分布式系统&#xff0c;尤其是微服务架构。 Spring Cloud 提供了诸如服务发现、配置管理、负载均衡、断路器、消息总线…...

【JVM】- 内存结构

引言 JVM&#xff1a;Java Virtual Machine 定义&#xff1a;Java虚拟机&#xff0c;Java二进制字节码的运行环境好处&#xff1a; 一次编写&#xff0c;到处运行自动内存管理&#xff0c;垃圾回收的功能数组下标越界检查&#xff08;会抛异常&#xff0c;不会覆盖到其他代码…...

在四层代理中还原真实客户端ngx_stream_realip_module

一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡&#xff08;如 HAProxy、AWS NLB、阿里 SLB&#xff09;发起上游连接时&#xff0c;将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后&#xff0c;ngx_stream_realip_module 从中提取原始信息…...

Keil 中设置 STM32 Flash 和 RAM 地址详解

文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...

【python异步多线程】异步多线程爬虫代码示例

claude生成的python多线程、异步代码示例&#xff0c;模拟20个网页的爬取&#xff0c;每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程&#xff1a;允许程序同时执行多个任务&#xff0c;提高IO密集型任务&#xff08;如网络请求&#xff09;的效率…...

AspectJ 在 Android 中的完整使用指南

一、环境配置&#xff08;Gradle 7.0 适配&#xff09; 1. 项目级 build.gradle // 注意&#xff1a;沪江插件已停更&#xff0c;推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...

Springboot社区养老保险系统小程序

一、前言 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;社区养老保险系统小程序被用户普遍使用&#xff0c;为方…...

九天毕昇深度学习平台 | 如何安装库?

pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple --user 举个例子&#xff1a; 报错 ModuleNotFoundError: No module named torch 那么我需要安装 torch pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple --user pip install 库名&#x…...

RSS 2025|从说明书学习复杂机器人操作任务:NUS邵林团队提出全新机器人装配技能学习框架Manual2Skill

视觉语言模型&#xff08;Vision-Language Models, VLMs&#xff09;&#xff0c;为真实环境中的机器人操作任务提供了极具潜力的解决方案。 尽管 VLMs 取得了显著进展&#xff0c;机器人仍难以胜任复杂的长时程任务&#xff08;如家具装配&#xff09;&#xff0c;主要受限于人…...

第7篇:中间件全链路监控与 SQL 性能分析实践

7.1 章节导读 在构建数据库中间件的过程中&#xff0c;可观测性 和 性能分析 是保障系统稳定性与可维护性的核心能力。 特别是在复杂分布式场景中&#xff0c;必须做到&#xff1a; &#x1f50d; 追踪每一条 SQL 的生命周期&#xff08;从入口到数据库执行&#xff09;&#…...

手机平板能效生态设计指令EU 2023/1670标准解读

手机平板能效生态设计指令EU 2023/1670标准解读 以下是针对欧盟《手机和平板电脑生态设计法规》(EU) 2023/1670 的核心解读&#xff0c;综合法规核心要求、最新修正及企业合规要点&#xff1a; 一、法规背景与目标 生效与强制时间 发布于2023年8月31日&#xff08;OJ公报&…...