Spring MVC(三) 参数传递

news2024/11/16 22:25:41

1 Controller到View的参数传递

        在Spring MVC中,把值从Controller传递到View共有5中操作方法,分别是。

  1. 使用HttpServletRequest或HttpSession。
  2. 使用ModelAndView。
  3. 使用Map集合
  4. 使用Model
  5. 使用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";
}

        有了这种操作方式,不管提交的数据有多少,在具体的处理中都是同样的简单。

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

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

相关文章

GEE数据集——高分辨率全球树冠高度地图(1 米)Meta 公司

高分辨率 1 米全球树冠高度地图 简介 全球树冠高度地图数据集提供了对全球树冠高度的全面了解,有助于对森林生态系统、碳固存和气候变化减缓工作进行精确监测。该数据集由 Meta 和世界资源研究所合作开发,是了解森林结构和动态的基石。通过融合最先进的卫星图像和先进的人工…

python代码学习案例-用turtle库绘制爱心图形效果

Python爱心代码&#xff0c;我们可以使用多种方法&#xff0c;包括使用turtle库来绘制图形&#xff0c;或者使用字符打印来在控制台中显示爱心。 首先&#xff0c;确保你已经安装了Python&#xff0c;并且你的环境支持turtle库&#xff08;它通常是Python标准库的一部分&#…

Python中批量提取[]括号内第一个元素的四种方法

目录 一、引言 二、方法介绍 使用正则表达式&#xff08;Regular Expression&#xff09; 使用字符串分割&#xff08;String Split&#xff09; 使用ast模块解析字符串为列表 使用JSON模块解析字符串 三、方法比较与选择 四、总结 一、引言 在Python数据处理过程中&a…

c++游戏小技巧16:实例1(地牢生成算法)

1.前言 (头图) &#xff08;其实最开始是想写恶魔轮盘的&#xff0c;但没想到它竟然更新了&#xff09; &#xff08;等我有时间在更&#xff0c;最近很忙&#xff0c;玩第五玩的&#xff09; 想法来源&#xff1a;房间和迷宫&#xff1a;一个地牢生成算法https://indienova…

百面算法工程师 | 正则优化函数——BN、LN、Dropout

本文给大家带来的百面算法工程师是正则优化函数&#xff0c;文章内总结了常见的提问问题&#xff0c;旨在为广大学子模拟出更贴合实际的面试问答场景。在这篇文章中&#xff0c;我们将总结一些BN、LN、Dropout的相关知识&#xff0c;并提供参考的回答及其理论基础&#xff0c;以…

redis深入理解之数据存储

1、redis为什么快 1&#xff09;Redis是单线程执行&#xff0c;在执行时顺序执行 redis单线程主要是指Redis的网络IO和键值对读写是由一个线程来完成的&#xff0c;Redis在处理客户端的请求时包括获取(socket 读)、解析、执行、内容返回 (socket 写)等都由一个顺序串行的主线…

网络编程套接字 (二)---udosocket

本专栏内容为&#xff1a;Linux学习专栏&#xff0c;分为系统和网络两部分。 通过本专栏的深入学习&#xff0c;你可以了解并掌握Linux。 &#x1f493;博主csdn个人主页&#xff1a;小小unicorn ⏩专栏分类&#xff1a;网络 &#x1f69a;代码仓库&#xff1a;小小unicorn的代…

mikefile函数与实用模板

文章目录 0.概述1.函数调用语法2.字符串处理函数2.1 subst&#xff08;字符串替换函数&#xff09;2.2 patsubst&#xff08;模式字符串替换函数&#xff09;2.3 strip&#xff08;去空格函数&#xff09;2.4 findstring&#xff08;查找字符串函数&#xff09;2.5 filter&…

大型模型技术构建本地知识库

使用大型模型技术构建本地知识库是一个复杂的过程&#xff0c;涉及到数据科学、机器学习和软件工程等多个领域的知识。以下是构建本地知识库的一般步骤。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。 1.需求分析&#xff1a; 确定知…

java版数据结构:堆,大根堆,小根堆

目录 堆的基本概念&#xff1a; 如何将一个二叉树调整成一个大根堆&#xff1a; 转成大根堆的时间复杂度 根堆中的插入&#xff0c;取出数据&#xff1a; 堆的基本概念&#xff1a; 堆是一种特殊的树形数据结构&#xff0c;它满足以下两个性质&#xff1a; 堆是一个完全二叉…

常见物联网面试题详解

物联网一直是非常火热的行业&#xff0c;G端如智慧城市、智慧工厂、智慧园区、智慧水利、智慧矿山等行业&#xff0c;都会涉及到物联网&#xff0c;基本都是软硬一体&#xff0c;因此当面试相关企业时&#xff0c;物联网平台是面试企业重点考察的项&#xff0c;小伙伴如果从事相…

网络安全在数字时代的重要性:以近期网络安全事件为镜

在当今这个信息化爆炸的时代&#xff0c;互联网如同一张无形的网&#xff0c;将我们的生活、工作、学习紧密相连。然而&#xff0c;这张网在带来便捷的同时&#xff0c;也暗藏着无数的安全隐患。近年来&#xff0c;网络安全事件频发&#xff0c;从个人隐私泄露到企业数据被盗&a…

中国地图(2024版审图号地图)和地图变化说明

2024版shp格式审图号地图预览图&#xff1a; 新版中国地图的变化&#xff08;简述&#xff09; 国土面积的增加&#xff1a;新版中国地图显示&#xff0c;中国的国土面积从960万平方公里增加到1045万平方公里&#xff0c;增加了85万平方公里。 九段线变为十段线&#xff1a;…

如何使用 ArcGIS Pro 制作地震动画

在做某些汇报的时候&#xff0c;除了图文&#xff0c;如果有动画肯定会成为加分项&#xff0c;这里为大家介绍一下如何使用 ArcGIS Pro 制作地震动画&#xff0c;希望能对你有所帮助。 添加时间 在图层属性内&#xff0c;选择时间选项卡&#xff0c;图层时间选择每个要素具有…

每日两题 / 226. 翻转二叉树 98. 验证二叉搜索树(LeetCode热题100)

226. 翻转二叉树 - 力扣&#xff08;LeetCode&#xff09; 以后续遍历的方式交换当前节点的左右指针 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), ri…

自适应调节Q和R的自适应UKF(AUKF_QR)的MATLAB程序

简述 基于三维模型的UKF&#xff0c;设计一段时间的输入状态误差较大&#xff0c;此时通过对比预测的状态值与观测值的残差&#xff0c;在相应的情况下自适应调节系统协方差Q和观测协方差R&#xff0c;构成自适应无迹卡尔曼滤波&#xff08;AUKF&#xff09;&#xff0c;与传统…

你可能喜欢但也许还不知道的好用网站-搜嗖工具箱

在线工具 https://www.zxgj.cn/ 作为一个工作生活好帮手&#xff0c;在线咨询网站提供了丰富的实用功能&#xff0c;从工作中的图表制作、图片修改到生活中的各种测试、健康、娱乐、学习、理财等等涵盖面很广。 在线工具网站从界面和操作上来看对用户也很友好&#xff0c;页面…

提高Rust安装与更新的速度

一、背景 因为rust安装过程中&#xff0c;默认的下载服务器为crates.io&#xff0c;这是一个国外的服务器&#xff0c;国内用户使用时&#xff0c;下载与更新的速度非常慢&#xff0c;因此&#xff0c;我们需要使用一个国内的服务器来提高下载与更新的速度。 本文推荐使用字节…

谷歌地图商家采集在外贸客户开发中的作用和意义

谷歌地图商家采集在外贸客户开发中扮演着至关重要的角色&#xff0c;其主要作用和意义体现在以下几个方面&#xff1a; 精准定位目标市场&#xff1a;通过谷歌地图&#xff0c;外贸人员可以根据特定的行业关键词&#xff08;如“fabric stores”&#xff09;搜索目标国家或地区…

Redis加入系统服务,开机自启

vi /etc/systemd/system/redis.service i :wq #加载服务配置文件 systemctl daemon-reload #启动redis systemctl start redis #设置开机自启 systemctl enable redis #查看启动状态 systemctl status redis