Spring MVC(三) 参数传递

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";
}

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Vue-Cli脚手架项目的搭建【新手快速入手】

目录 一、Vue CLI脚手架简介☺ 1.Node.js前置环境的安装 2.安装npm管理器 3.安装淘宝镜像(cnpm) 二、安装vue-cli 1. 版本号查看 2.旧版本卸载 3.新版本安装 4.检查 三、Vue项目的搭建 &#x1f4cc;进入Vue项目管理器 ★命令方式创建 若localhost拒绝访问怎么办&…

深度剖析:SSD能否全面取代HDD?-2

近日&#xff0c;希捷针对SSD即将全面取代HDD的市场预言也提出站在HDD厂商角度不同的观点。 这些观点出自希捷的一份演示文稿&#xff0c;实质上是对Pure Storage首席执行官Charlie Giancarlo所称“五年内不会再有新的磁盘系统出售”这一论断的回应&#xff0c;意味着到2028年底…

(十六)Servlet教程——Servlet文件下载

Servlet文件下载 文件下载是将服务器上的资源下载到本地&#xff0c;可以通过两种方式来下载服务器上的资源。第一种是使用超链接来下载&#xff0c;第二种是通过代码来下载。 超链接下载 在HTML或者JSP页面中使用超链接时&#xff0c;可以实现页面之间的跳转&#xff0c;但是…

深入理解卷积函数torch.nn.Conv2d的各个参数以及计算公式(看完写模型就很简单了)

代码解释帮助理解&#xff1a; torch.randn(10, 3, 32, 32)&#xff0c;初始数据&#xff1a;(10, 3, 32, 32)代表有10张图片&#xff0c;每张图片的像素点用三个数表示&#xff0c;每张图片大小为32x32。&#xff08;重点理解这个下面就好理解了&#xff09; nn.Conv2d(3, 64…

python自动打卡的代码

好的&#xff0c;以下是一个简单的Python自动打卡程序代码&#xff0c;用于在特定时间自动打卡&#xff1a; python import datetime import time # 设置打卡时间和打卡间隔 check_in_time datetime.datetime(2023, 3, 1, 9, 30) check_out_time datetime.datetime(2023, 3, …

苹果电脑免费第三方软件CleanMyMac X2025电脑版垃圾清理软件神器

Mac电脑用户在长时间使用电脑之后&#xff0c;时常会看到“暂存盘已满”的提示&#xff0c;这无疑会给后续的电脑使用带来烦恼&#xff0c;那么苹果电脑暂存盘已满怎么清理呢&#xff0c;下面将给大家带来一些干货帮你更好地解决这个问题。 CleanMyMac X2024全新版下载如下: h…

springboot之统一异常封装

一&#xff1a;统一返回实体对象 JsonInclude(Include.NON_NULL) public class ResponseObject implements Serializable {private static final long serialVersionUID 1L;private Integer code 0;private String message "success";private Long time System.…

新版文件同步工具(Python编写,其中同时加入了多进程计算MD5、多线程复制大文件、多协程复制小文件、彩色输出消息、日志功能)

两个月前&#xff0c;接到一个粉丝的要求&#xff0c;说希望在我之前编写的一个python编写的文件同步脚本(Python编写的简易文件同步工具(已解决大文件同步时内存溢出问题)https://blog.csdn.net/donglxd/article/details/131225175)上加入多线程复制文件的功能&#xff0c;前段…

flutter中固定底部按钮,防止键盘弹出时按钮跟随上移

当我们想要将底部按钮固定在底部&#xff0c;我们只需在Widget中的Scaffold里面加一句 resizeToAvoidBottomInset: false, // 设置为false&#xff0c;固定页面不会因为键盘弹出而移动 效果图如下

CSCWD 2024会议最后一天 女高音惊艳全场,相声笑破肚皮

会议之眼 快讯 今天是第27届国际计算机协同计算与设计大会&#xff08;CSCWD 2024&#xff09;举办的最后一天&#xff01;会议依然热络&#xff0c;紧张而充实&#xff01;各个技术分论坛持续展开&#xff0c;学者们的热情不减&#xff0c;对技术领域的热爱和探索精神令人赞叹…

国产开源物联网操作系统

软件介绍 RT-Thread是一个开源、中立、社区化发展的物联网操作系统&#xff0c;采用C语言编写&#xff0c;具有易移植的特性。该项目提供完整版和Nano版以满足不同设备的资源需求。 功能特点 1.内核层 RT-Thread内核包括多线程调度、信号量、邮箱、消息队列、内存管理、定时器…

VS配置三方依赖

1.配置include 1.1.打开属性 1.2.打开“配置属性”-"C/C"-"常规" 2.配置lib 2.1.配置lib目录 打开"配置属性"-“链接器”-“常规”。 2.2.配置具体的lib 打开"配置属性"-"链接器"-“输入”。 也可以通过代码方式加入&…

差速机器人模型LQR 控制仿真(c++ opencv显示)

1 差速机器人状态方程构建 1.1差速机器人运动学模型 1.2模型线性化 1.3模型离散化 2离散LQR迭代计算 注意1&#xff1a;P值的初值为Q。见链接中的&#xff1a; 注意2&#xff1a;Q, R参数调节 注意3&#xff1a;LQR一般只做横向控制&#xff0c;不做纵向控制。LQR输出的速度…

明火检测实时识别报警:视觉算法助力安全生产管理

背景与现状 在各种工作、生产环境下&#xff0c;明火的存在往往是潜在的安全隐患。无论是加油站、化工园区、仓储场所还是校园&#xff0c;明火一旦失控就会引发火灾&#xff0c;造成严重的人员伤亡和财产损失。传统的明火检查手段主要依赖于人工巡查和定期的消防检查&#xf…

拯救被勒索病毒加密的文件

无意间打开了勒索病毒的告知文件&#xff0c;几年前很多人很熟悉这个文件。 --- Welcome. Again. --- [] Whats Happen? [] Your files are encrypted, and currently unavailable. You can check it: all files on your computer has extension u347q678t1. By the way, e…

安装nvm切换多个nodejs

今天实习&#xff0c;用到了公司的老项目vue2的&#xff0c;需要更换nodejs版本 我想直接安装一个16版本的&#xff0c;然后自己在webstrom中配置一下exe文件就可以了。 然而第一步就不行&#xff0c;在安装另一版本中显示 然后博主在这里介绍一下怎么使用nvm可以快速切换node…

动手学深度学习——多层感知机

1. 感知机 感知机本质上是一个二分类问题。给定输入x、权重w、偏置b&#xff0c;感知机输出&#xff1a; 以猫和狗的分类问题为例&#xff0c;它本质上就是找到下面这条黑色的分割线&#xff0c;使得所有的猫和狗都能被正确的分类。 与线性回归和softmax的不同点&#xff1…

Chronos:学习时间序列的大语言模型(代码解析)

前言 《Chronos: Learning the Language of Time Series》原文地址&#xff0c;Github开源代码地址Chronos&#xff1a;学习时间序列的大语言模型&#xff08;论文解读&#xff09;CSDN地址GitHub项目地址Some-Paper-CN。本项目是译者在学习长时间序列预测、CV、NLP和机器学习…

【漫画版】指挥官的排序战术:快速排序算法解密

作者介绍&#xff1a;10年大厂数据\经营分析经验&#xff0c;现任字节跳动数据部门负责人。 会一些的技术&#xff1a;数据分析、算法、SQL、大数据相关、python&#xff0c;欢迎探讨交流 欢迎加入社区&#xff1a;码上找工作 作者专栏每日更新&#xff1a; LeetCode解锁1000题…

使用Python在PowerPoint演示文稿之间复制样式(复制幻灯片母版)

在专业演示文稿设计与制作领域&#xff0c;多场演示间保持一致性至关重要。在PowerPoint演示文稿之间复制幻灯片母版成为了一项关键技巧&#xff0c;用以维持统一的视觉风格&#xff0c;确保品牌形象的一致性&#xff0c;并提升观众的参与度。这一做法不仅能节省宝贵的时间&…