Spring MVC(三) 参数传递
1 Controller到View的参数传递
在Spring MVC中,把值从Controller传递到View共有5中操作方法,分别是。
- 使用HttpServletRequest或HttpSession。
- 使用ModelAndView。
- 使用Map集合
- 使用Model
- 使用ModelMap
使用HttpServletRequest或HttpSession传值
使用HttpServletRequest或HttpSession传值,和Servlet传值方式是一致的,因此应用的不是太多。在学习Servlet的时候,用户登录等情况下,是要把当前登录的用户对象保存在HttpSession中的,这是为数不多的几个应用之一。具体使用HttpServletRequest或者HttpSession的操作代码如下。
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;/*** 用户模块控制器*/
@Controller
@RequestMapping("/user")
public class UserController {@RequestMapping(value="/list", method=RequestMethod.GET)public String list(HttpServletRequest req, HttpSession session) {req.setAttribute("test1", "测试数据1");session.setAttribute("test2", "测试数据2");return "user/list";}
}
使用HttpServletRequest或者HttpSession传值,只需要把HttpServletRequest对象和HttpSession对象当做参数传到方法中就可以直接使用了。
在页面中取值的时候就可以使用EL表达式,通过${test1 }和${test2 },获取到相应的数据。
使用ModelAndView传值
在本章一开始简单使用了一次,不过没有传值,使用ModelAndView传值具体的操作为。
@RequestMapping(value="/modelAndView", method=RequestMethod.GET)
public ModelAndView testModelAndView() {Map<String, String> data = new HashMap<String, String>();data.put("test", "测试数据");return new ModelAndView("user/modelAndView", data);
}
在页面modelAndView.jsp中取值,同样可以采用EL表达式取值。使用ModelAndView传值需要借助于集合,因此在具体的开发中基本不会用到,在此只做简单的了解。
使用Map集合传值
在使用Map集合传值的时候,只需要把一个Map对象当做方法的参数就可以使用了,具体的操作为。
@RequestMapping(value="/map", method=RequestMethod.GET)
public String testMap(Map<String, Object> data) {data.put("test", "测试数据");return "user/map";
}
在页面中map.jsp中取值,同样采用EL表达式${test }取值。
使用Model传值
Model是一个接口,在具体的操作中,也是把Model对象当做方法的参数,具体的操作为。
@RequestMapping(value="/model", method=RequestMethod.GET)
public String testModel(Model model) {model.addAttribute("test", "测试数据");return "user/model";
}
在页面中map.jsp中取值,同样采用EL表达式${test }取值。Model的addAttribute方法还有另外的一个重载,如下所示。
@RequestMapping(value="/model", method=RequestMethod.GET)
public String testModel(Model model) {model.addAttribute("测试数据");return "user/model";
}
在页面map.jsp中取值,是采用EL表达式${string }来取值,因为,使用model.addAtttribute(data)直接传值,没有指定其key值,默认的key值是数据的类型(首字母变成小写)。这种方法主要是应用在添加一个对象,只需要把一个对象传入到方法中,默认的key值就是该对象的类型。
使用ModelMap传值
提起ModelMap,我们就可以大致觉得这是Model和Map的组合,其实也基本差不多。不过ModelMap并没有实现Model接口,只是继承了LinkedHashMap,而LinkedHashMap继承自HashMap。ModelMap具有Model和Map相同的操作,不过在具体的开发中使用的也不是太多。
总结
虽然参数从Controller传递到View有5中不同的操作方法,但是在具体的使用上一般只会采用其中的Model和Map进行传值,大家具体使用哪一种方法,要看具体的操作,本书在接下来的章节中全部采用Model进行传值。
2 View到Controller的参数传递
在Spring MVC中View到Controller的传值,可以通过在URL之后通过问号传值,也可以通过表单提交传值。不过在Controller中接收数据的时候,不需要再使用HttpServletRequest对象的getParameter方法了。具体操作的时候,只需要在方法中,把要传递数据的参数名当做方法的一个参数就可以了。比如现在有一个链接地址为:http://localhost:8080/springmvc/user/show?username=test,在具体的方法中操作为。
@RequestMapping(value="/show", method=RequestMethod.GET)
public String show(String username) {System.out.println(username);return "user/show";
}
这种方式,如果在访问的时候没有传值,也能正常访问,不会有什么问题。但是如果要求一个参数必须传递,可以在具体的参数之前加入注解@RequestParam,意为请求中必须包含该参数,具体的代码为。
@RequestMapping(value="/show", method=RequestMethod.GET)
public String show(@RequestParam("username") String username) {System.out.println(username);return "user/show";
}
此时,会把该参数当做请求的一部分,如果没有传值,会出现400错误(请求格式错误),如图所示。

通过表单提交也同样能够完成传值,首先定义一个方法,用以跳转到添加页面,具体的操作为。
/*** 跳转到add.jsp页面*/
@RequestMapping(value="/add", method=RequestMethod.GET)
public String add() {return "user/add";
}
在页面add.jsp中添加以下表单代码。
<form action="user/add" method="post">username:<input type="text" name="username"><br>password:<input type="password" name="password"><br>nickname:<input type="text" name="nickname"><br><input type="submit" value="提交">
</form>
接下来定义接收数据的方法,由于表单提交方式是POST,方法处理提交的方式也就为POST,具体的代码如下。
/*** 执行具体的数据添加*/
@RequestMapping(value="/add", method=RequestMethod.POST)
public String add(String username, String password, String nickname) {System.out.println(username + "," + password + "," + nickname);return "redirect:/user/list";
}
注意:和上一个方法的方法名一样,请求地址也一样,访问不同的方法就是要靠请求类型来区别。
通过测试结果发现,数据能够正常的传递过来。不过有可能会出现中文乱码,这是因为,Spring MVC并没有做字符编码处理,我们只需要按照过滤器的操作来处理就可以了,具体的操作方法再此就不再讲述。
通过这种操作,我们发现这种操作效率没有比Servlet高出多少,传递的参数多了,相对应的方法中的参数也就必须增多,同样也是不太方便。因此我们设想,能不能在页面中用一个对象来封装所有的数据呢,这样提交的数据就包含在了这个对象中,这样在处理方法中只需要接收这个对象,不就解决了传参过多的问题了吗?
Spring MVC就提供了上述这种操作方法,可以大大简化操作。解决方法是,首先在跳转到添加页面之前,把一个对象添加到Model中,然后在页面中的表单里指定要封装的对象,然后提交表单,在处理方法中处理这个对象即可。Spring MVC解决方法是,首先在跳转到页面中的方法里,往Model对象中添加一个对象,具体的代码为。
/*** 跳转到add.jsp页面*/
@RequestMapping(value="/add", method=RequestMethod.GET)
public String add(Model model) {//往Model对象里添加一个对象model.addAttribute(new User());return "user/add";
}
注意:此时使用addAttribute方法里只有一个参数,key值就为对象的类型,也就是“user”。
在页面代码中处理的时候,需要使用到Spring MVC的表单标签,在使用的时候需要先导入Spring MVC的表单标签库,具体代码为。
<%@ taglib prefix="sf" uri="http://www.springframework.org/tags/form" %>
导入的方式和之前导入JSTL的方式类似,在使用的时候就可以通过“<sf:> ”来引入表单标签,接下来修改页面的表单标签,具体代码为。
<sf:form method="post" modelAttribute="user">username:<sf:input path="username"/><br>password:<sf:password path="password"/><br>nickname:<sf:input path="nickname"/><br><input type="submit" value="提交"/>
</sf:form>
注意:此时的表单中没有指定action,其实在Spring MVC的表单标签中,action可以指定,也可以不指定,如果不指定提交的地址就为到达该页面的地址,简单的说就从哪来回哪去。
此时是表单提交,因此提交方式应该是POST提交。form表单中的modelAttribute属性就是指定要往哪一个对象中封装数据,也就是为该表单绑定一个模型对象,如果没有绑定对象,系统会到request对象中寻找command的表单bean,如果还没有找到页面就会报错。“<sf:input path=”username”/>”对应JSTL中的“<input type=”text”name=”username”/>”,其中的username一定要为user对象中的属性,并且要有相应的getter和setter方法,此时,在表单提交的同时,会把该属性值封装到对象user中,其他的标签以此类推。
在具体的添加操作方法中,就可以直接接收一个user对象了,代码如下。
/*** 执行具体的数据添加*/
@RequestMapping(value="/add", method=RequestMethod.POST)
public String add(User user) {System.out.println(user);return "redirect:/user/list";
}
有了这种操作方式,不管提交的数据有多少,在具体的处理中都是同样的简单。
相关文章:
Spring MVC(三) 参数传递
1 Controller到View的参数传递 在Spring MVC中,把值从Controller传递到View共有5中操作方法,分别是。 使用HttpServletRequest或HttpSession。使用ModelAndView。使用Map集合使用Model使用ModelMap 使用HttpServletRequest或HttpSession传值 使用HttpSe…...
常见加解密算法02 - RC4算法分析
RC4是一种广泛使用的流密码,它以其简洁和速度而闻名。区别于块密码,流密码特点在于按位或按字节来进行加密。 RC4由Ron Rivest在1987年设计,尽管它的命名看起来是第四版,实际上它是第一个对外发布的版本。 RC4算法的实施过程简洁…...
如何使用 ERNIE 千帆大模型基于 Flask 搭建智能英语能力评测对话网页机器人(详细教程)
ERNIE 千帆大模型 ERNIE-3.5是一款基于深度学习技术构建的高效语言模型,其强大的综合能力使其在中文应用方面表现出色。相较于其他模型,如微软的ChatGPT,ERNIE-3.5不仅综合能力更强,而且在训练与推理效率上也更高。这使得ERNIE-3…...
Java全局异常处理,@ControllerAdvice异常拦截原理解析【简单易懂】
https://www.bilibili.com/video/BV1sS411c7Mo 文章目录 一、全局异常处理器的类型1-1、实现方式一1-2、实现方式二 二、全局异常拦截点2-1、入口2-2、全局异常拦截器是如何注入到 DispatcherServlet 的 三、ControllerAdvice 如何解析、执行3-1、解析3-2、执行 四、其它4-1、设…...
代码随想录35期Day38-Java(Day37休息)
Day38题目 LeetCode509.斐波那契数列 核心思想:很简单dp[i]dp[i-1]dp[i-2].这里用了数组存储的形式,也可以递归 class Solution {public int fib(int n) {int[] dp new int[n2];dp[0] 0;dp[1] 1;for(int i 2 ; i < n ; i ){dp[i] dp[i-1] dp[i-2];}return dp[n];} …...
力扣HOT100 - 739. 每日温度
解题思路: 单调栈 class Solution {public int[] dailyTemperatures(int[] temperatures) {int length temperatures.length;int[] ans new int[length];Deque<Integer> stack new LinkedList<>();for (int i 0; i < length; i) {int temperatu…...
【爬虫之scrapy框架——尚硅谷(学习笔记one)--基本步骤和原理+爬取当当网(基本步骤)】
爬虫之scrapy框架——基本原理和步骤爬取当当网(基本步骤) 下载scrapy框架创建项目(项目文件夹不能使用数字开头,不能包含汉字)创建爬虫文件(1)第一步:先进入到spiders文件中&#x…...
C++ QT设计模式:责任链模式
基本概念 责任链模式(Chain of Responsibility Pattern)是一种行为型设计模式,将请求沿着处理链传递,直到有一个对象能够处理为止。 实现的模块有: Handler(处理者):定义一个处理…...
基于springboot+mybatis+vue的项目实战之(后端+前后端联调)
步骤: 1、项目准备:创建数据库(之前已经创建则忽略),以及数据库连接 2、建立项目结构文件夹 3、编写pojo文件 4、编写mapper文件,并测试sql语句是否正确 5、编写service文件 6、编写controller文件 …...
【教程向】从零开始创建浏览器插件(六)实战篇
【教程向】从零开始创建浏览器插件(六)实战篇 在这篇文章中,我们将详细介绍一个名为“摸鱼King”的Chrome扩展程序的开发思路。这个扩展程序的主要功能是在用户浏览网页时提供便捷的方式来摸鱼看小说。 完整的工程我放在了完整工程,可以下载下来自己试一试。 1. 主要功能…...
如何用 OceanBase做业务开发——【DBA从入门到实践】第六期
当应用一款新的数据库时,除了基础的安装部署步骤,掌握其应用开发方法才是实现数据库价值的关键。为此,我们特别安排了5月15日(周三)的《DBA 从入门到实践》第六期课程——本次课程将带大家了解OceanBase数据库的开发流…...
Element-UI快速入门
作者介绍:✌️大厂全栈码农|毕设实战开发,专注于大学生项目实战开发、讲解和毕业答疑辅导。 推荐订阅精彩专栏 👇🏻 避免错过下次更新 Springboot项目精选实战案例 更多项目:CSDN主页YAML墨韵 学如逆水行舟,…...
【JavaWeb】网上蛋糕商城后台-商品管理
概念 本文讲解和实现网上蛋糕商城的后台管理系统中的商品管理功能。 商品列表 点击后台管理系统的head.jsp头部的“商品管理”功能选项,向服务器发送请求/admin/goods_list 因此需要在servlet包中创建AdminGoodsListServlet类,用于获取商品信息列表 …...
Django Admin后台管理:高效开发与实践
title: Django Admin后台管理:高效开发与实践 date: 2024/5/8 14:24:15 updated: 2024/5/8 14:24:15 categories: 后端开发 tags: DjangoAdmin模型管理用户认证数据优化自定义扩展实战案例性能安全 第1章:Django Admin基础 1.1 Django Admin简介 Dj…...
Centos7网卡启动失败(Failed to start LSB: Bring up/down)
好雨知时节 当春乃发生 随风潜入夜 润物细无声 报错内容 启动虚拟机时,Ceotos的虚拟网卡没有一起启动,导致服务无法正常使用 查询网络启动状态 systemctl status network.service报Failed to start LSB: Bring up/down 查看网络启动日志 journalctl…...
【NOIP2008普及组复赛】 题4:立体图
题4:立体图 【题目描述】 小渊是个聪明的孩子,他经常会给周围的小朋友讲些自己认为有趣的内容。最近,他准备给小朋友讲解立体图,请你帮他画出立体图。 小渊有一块面积为mn的矩形区域,上面有mn个边长为1的格子&#…...
【Leetcode每日一题】 动态规划 - 简单多状态 dp 问题 - 删除并获得点数(难度⭐⭐)(76)
1. 题目解析 题目链接:LCR 091. 粉刷房子 这个问题的理解其实相当简单,只需看一下示例,基本就能明白其含义了。 2.算法原理 1. 状态定义 在解决这类问题时,我们首先需要根据题目的具体要求来定义状态。针对房屋粉刷问题&#…...
Windows---CMD常用指令大全
CMD是什么? Windows操作系统中的命令行界面程序,全称为命令提示符 CMD可以干什么? 允许用户在文本界面下输入命令来执行各种操作,如文件管理、系统设置、软件安装等 帮助用户更好地控制和管理Windows系统 windows系统CMD指…...
消息中间件是什么?有什么用?常见的消息中间件有哪些?
1.什么是消息中间件? 消息中间件基于队列模型在网络环境中为应用系统提供同步或异步、可靠的消息传输的支撑性软件系统。 2.现实中的痛点: 1.Http请求基于请求与响应的模型,在高并发的情况下,客户端发送大量的请求达到服务器端…...
富锂锰基材料极具发展潜力 我国产业化进程加速
富锂锰基材料极具发展潜力 我国产业化进程加速 富锂锰基材料以锰元素为主,我国锰资源较丰富,相比于铁锂材料、高镍三元材料,富锂锰基材料具有一定的降本潜力。此外富锂锰基材料在能量密度、充放电倍率等方面也具有明显优势。富锂锰基材料是富…...
【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15
缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下: struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...
大型活动交通拥堵治理的视觉算法应用
大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动(如演唱会、马拉松赛事、高考中考等)期间,城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例,暖城商圈曾因观众集中离场导致周边…...
Day131 | 灵神 | 回溯算法 | 子集型 子集
Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣(LeetCode) 思路: 笔者写过很多次这道题了,不想写题解了,大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...
《Playwright:微软的自动化测试工具详解》
Playwright 简介:声明内容来自网络,将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具,支持 Chrome、Firefox、Safari 等主流浏览器,提供多语言 API(Python、JavaScript、Java、.NET)。它的特点包括&a…...
PL0语法,分析器实现!
简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...
.Net Framework 4/C# 关键字(非常用,持续更新...)
一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...
NXP S32K146 T-Box 携手 SD NAND(贴片式TF卡):驱动汽车智能革新的黄金组合
在汽车智能化的汹涌浪潮中,车辆不再仅仅是传统的交通工具,而是逐步演变为高度智能的移动终端。这一转变的核心支撑,来自于车内关键技术的深度融合与协同创新。车载远程信息处理盒(T-Box)方案:NXP S32K146 与…...
AI+无人机如何守护濒危物种?YOLOv8实现95%精准识别
【导读】 野生动物监测在理解和保护生态系统中发挥着至关重要的作用。然而,传统的野生动物观察方法往往耗时耗力、成本高昂且范围有限。无人机的出现为野生动物监测提供了有前景的替代方案,能够实现大范围覆盖并远程采集数据。尽管具备这些优势…...
Selenium常用函数介绍
目录 一,元素定位 1.1 cssSeector 1.2 xpath 二,操作测试对象 三,窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四,弹窗 五,等待 六,导航 七,文件上传 …...
