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

news2024/12/26 11:29:44

文章目录

    • 参数传递
    • 重定向与转发
    • 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 {
    @Autowired
    private 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2254613.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Vue网页屏保

Vue网页屏保 在vue项目中&#xff0c;如果项目长时间未操作需要弹出屏幕保护程序&#xff0c;以下为网页屏保效果&#xff0c;看板内容为连接的资源。 屏保组件 <template><div v-if"isActive" class"screensaver" click"disableScreens…

计算机网络复习5——运输层

运输层解决的是进程之间的逻辑通信问题 两个主机进行通信归根结底是两个主机中的应用程序互相通信&#xff0c;又称为“端到端的通信” 端口 运行在计算机中的进程是用进程标识符来标志的。但不同的操作系统标识进程的方法不统一&#xff0c;因特网重新以统一的方法对TCP/IP…

qtcanpool 知 10:包管理雏形

文章目录 前言痛点转机雏形实践后语 前言 曾听闻&#xff1a;C/Qt 没有包管理器&#xff0c;开发起来太不方便。这是一个有过 node.js 开发经验的人对 Qt 的吐槽。 确实&#xff0c;像 python、golang、node.js 这些编程语言都有包管理器&#xff0c;给用户带来了极佳的开发体…

ASP.NET Core 9.0 静态资产传递优化 (MapStaticAssets )

一、结论 &#x1f4a2;先看结论吧&#xff0c; MapStaticAssets 在大多数情况下可以替换 UseStaticFiles&#xff0c;它已针对为应用在生成和发布时了解的资产提供服务进行了优化。 如果应用服务来自其他位置&#xff08;如磁盘或嵌入资源&#xff09;的资产&#xff0c;则应…

LeetCode 力扣 热题 100道(十五)搜索插入位置(C++)

给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 代码如下所示&#xff1a; class Solution { public:int searchIns…

WPF+LibVLC开发播放器-音量控制和倍速控制

界面 界面上增加音量的控件和倍速控制控件 音量控制 主要也是一个Slider进度条控件来实现音量调节 我们这里设置默认的最大值为100&#xff0c;默认Value值也为100&#xff0c;默认声音开到最大 这里目前完全由前端控制音量调节&#xff0c;可以直接使用ValueChanged事件实…

Vue3技术开发,使用纯CSS3动手制作一个3D环绕的相册展示效果,支持传入任意图片.3D轮播相册的组件

主要讲述封装一个3D轮播相册的组件&#xff0c;效果图如下&#xff0c;仅仅传入一个图片的数组即可&#xff0c;效果如下&#xff1a; 使用Vue3技术开发&#xff0c;支持传入任意张数的图片。 使用方法 <template><Swiper :list"list" /> </templat…

python怎么将字母大写

Python中有三种将字母转换为大写的方法&#xff1a;upper()、capitalize()、title()。 下面通过实例给大家介绍具体用法&#xff1a; str "www.php.com" print(str.upper()) # 把所有字符中的小写字母转换成大写字母 print(str.lower()) # 把所有字…

将vscode上的项目提交到github上

1.windows终端中 创建github仓库 创建完成 提交代码 git init git config --global user.email "fuyulai2024163.com" git config --global user.name "Fuyulai-Hub" git add . git commit -m "first commit" git remote add origin https://g…

【期末JavaEE项目】springboot+vue3完成中国铁路12306网站的业务实现【原创】

&#x1f939;‍♀️潜意识Java&#xff1a;个人主页 &#x1f399;告诉你&#xff1a;Java是世界上最美好的语言 &#x1f48e;比较擅长的领域&#xff1a;前端开发 是的&#xff0c;我需要您的&#xff1a; &#x1f9e1;点赞❤️关注&#x1f499;收藏&#x1f49b; 是…

浅谈CI持续集成

1.什么是持续集成 持续集成&#xff08;Continuous Integration&#xff09;&#xff08;CI&#xff09;是一种软件开发实践&#xff0c;团队成员频繁地将他们的工作成果集成到一起(通常每人每天至少提交一次&#xff0c;这样每天就会有多次集成)&#xff0c;并且在每次提交后…

电子商务人工智能指南 1/6 - 搜索、广告和发现

介绍 81% 的零售业高管表示&#xff0c; AI 至少在其组织中发挥了中等至完全的作用。然而&#xff0c;78% 的受访零售业高管表示&#xff0c;很难跟上不断发展的 AI 格局。 近年来&#xff0c;电子商务团队加快了适应新客户偏好和创造卓越数字购物体验的需求。采用 AI 不再是一…

【Git教程 之 版本控制】

Git教程 之 版本控制 Git教程 之 版本控制版本控制版本控制类型单用户版本控制系统&#xff08;VCS&#xff09;单用户版本控制系统&#xff08;VCS&#xff09;特点常见的单用户版本控制系统&#xff08;VCS&#xff09; 集中式版本控制系统&#xff08;CVCS&#xff09;集中式…

.NET Framework修复工具

某些精简Windows系统或者第三方下载的改版Windows系统在安装.NET Framework的时候会出现类似下面的错误信息: 可以使用微软官方出的.NET Framework修复工具解决, 下载地址: 【免费】.NETFramework修复工具资源-CSDN文库 下载后运行即可修复系统里的.NET Framework

计算机毕业设计Python轨道交通客流预测分析可视化 智慧交通 机器学习 深度学习 人工智能 爬虫 交通大数据

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

从计算服务器角度看智算与算力

计算服务器于智算和算力领域的地位堪称中流砥柱。人工智能旨在赋予计算机人类智能的使命&#xff0c;对计算服务器提出了近乎苛刻的要求。 在智算层面&#xff0c;它是计算服务器通向高效能的核心动力。凭借 CPU 与 GPU、FPGA、ASIC 等构建的异构组合&#xff0c;计算服务器可…

Lighthouse(灯塔)—— Chrome 浏览器性能测试工具

1.认识 Lighthouse Lighthouse 是 Google 开发的一款开源性能测试工具&#xff0c;用于分析网页或 Web 应用的性能、可访问性、最佳实践、安全性以及 SEO 等关键指标。开发人员可以通过 Lighthouse 快速了解网页的性能瓶颈&#xff0c;并基于优化建议进行改进。 核心功能&…

Logistic Regression(逻辑回归)、Maximum Likelihood Estimatio(最大似然估计)

Logistic Regression&#xff08;逻辑回归&#xff09;、Maximum Likelihood Estimatio&#xff08;最大似然估计&#xff09; 逻辑回归&#xff08;Logistic Regression&#xff0c;LR&#xff09;逻辑回归的基本思想逻辑回归模型逻辑回归的目标最大似然估计优化方法 逻辑回归…

使用Hadoop MapReduce进行大规模数据爬取

Hadoop MapReduce概述 Hadoop MapReduce是一个编程模型&#xff0c;用于处理和生成大数据集。它由Map和Reduce两个主要阶段组成。Map阶段负责处理输入数据&#xff0c;并将结果输出为键值对&#xff1b;Reduce阶段则对Map阶段的输出进行汇总和合并&#xff0c;生成最终结果。 …

AI驱动的低代码平台:解密背后的算法与架构创新

引言 在如今的数字化浪潮中&#xff0c;企业对软件的需求正以前所未有的速度增长。传统的开发方式由于开发周期长、成本高&#xff0c;已逐渐无法满足市场的快速变化。而低代码平台的出现&#xff0c;使得开发者和业务人员能够以极简的方式快速构建应用。然而&#xff0c;随着企…