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

springMVC-模型数据的处理

 一、数据放入到request域当中

1、把获取的数据放入request域中, 方便在跳转页面去显示 

<a>添加主人信息</a>
<form action="vote/vote04" method="post" >主人id:<input type="text" name="id"><br>主人名:<input type="text" name="monsterName"><br>宠物名:<input type="text" name="pet.petName"><br><input type="submit" value="提交" ><br>
   @RequestMapping(value = "/vote04")public String vote04(Monster monster, HttpServletRequest request,HttpServletResponse response){System.out.println("请求到vote04");request.setAttribute("monster", monster);request.setAttribute("address","湖州");return "voteOK";}
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>获取参数成功地址:   ${address}<br>主人名字:${requestScope.monster.monsterName}<br>主人信息:${requestScope.monster}<br>
</body>
</html>

2、通过请求的方法参数Map<String,Object>, springMVC自动将map参数的内容放入reguest域

<%--确保这里的name与bean的属性名一致,否则拿不到值--%>
<a>添加主人信息</a>
<form action="vote/vote05" method="post" >主人id:<input type="text" name="id"><br>主人名:<input type="text" name="monsterName"><br>宠物名:<input type="text" name="pet.petName"><br><input type="submit" value="提交" ><br>
</form>
   @RequestMapping(value = "/vote05")public String vote05(Monster monster, Map <String,Object> map){map.put("monster", monster);map.put("Address", "BEIJING");return "voteOK";}
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>获取参数成功地址:   ${address}<br>主人名字:${requestScope.monster.monsterName}<br>主人信息:${requestScope.monster}<br>

3、通过返回一个ModelAndView对象实现request域数据

1>从本质看,请求响应的方法return"xx",好像是返回了一个字符串,其实本质都是返回了一个ModeIAndView对象,只是默认被封装起来的.

2>ModelAndView即可以包含model数据,也可以包含视图信息
3>ModelAndView对象的addObject方法可以添加 key-val数据,默认在request域中4>ModelAndView对象setView方法可以指定视图名称

<%--确保这里的name与bean的属性名一致,否则拿不到值--%>
<a>添加主人信息</a>
<form action="vote/vote06" method="post" >主人id:<input type="text" name="id"><br>主人名:<input type="text" name="monsterName"><br>宠物名:<input type="text" name="pet.petName"><br><input type="submit" value="提交" ><br>
</form>
  @RequestMapping(value = "/vote06")public ModelAndView vote06(Monster monster){//创建一个modleANDViewModelAndView modelAndView = new ModelAndView();modelAndView.addObject("monster", monster);modelAndView.addObject("address", "杭州");modelAndView.setViewName("voteOK");return modelAndView;}
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>获取参数成功地址:   ${address}<br>主人名字:${requestScope.monster.monsterName}<br>主人信息:${requestScope.monster}<br>
</body>

二、将数据放入到session域中

1、通过@SessionAttributes实现将数据放入session域

首先,在handler上写一个@SessionAttributes注解

@SessionAttributes(value = "myMaster")
@RequestMapping(value = "/vote")
@Controller
public class VoteHandler {

只要有一个map的形参,调用了put方法,且key值与@SessionAttributes相同,就会被自动放入到session域中 

@RequestMapping(value = "/vote07")public String vote07(Map <String,Object> map,Monster monster){map.put("myMonster",monster);map.put("address","SHANGHAI");return "voteOK";}
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>获取参数成功地址:   ${address}<br>主人名字:${requestScope.monster.monsterName}<br>主人信息:${requestScope.monster}<br>主人名字(session):${sessionScope.myMonter.monsterName}<br>主人信息(session):${sessionScope.myMonter}<br></body>

三、通过@ModelAttribute实现prepare方法

小结

注意当我们给Handler的某个方法前增加了注解@ModelAttribue后,则该方法就会在任何一个目标方法前调用,这样程序员就可以在调用目标方法前,准备相应的model,并做预处理.

1、什么是prepare方法

@ModelAttribute 被这个方法修饰,
    // 会在该handler的所有方法被调用前,去调用

public class VoteHandler {@ModelAttribute //@ModelAttribute 被这个方法修饰,// 会在该handler的所有方法被调用前,去调用public void testPrepare(){System.out.println("preparing......");}
 @RequestMapping(value = "/vote08")public String vote08(){System.out.println("update......");return "voteOK";}
<a href="vote/vote08">测试prepare</a>

 

2、 @ModelAttribute最佳实践

该案例概述:

在做update操作时,我们只提交编号,名字,那么后端还需要判断前端提交了哪几个字段,要对其更新,比较麻烦。于是出现了如下案例,在更新操作前先做预处理

先上原理图,看看记得吗

<body>
<a href="vote/vote08">测试prepare</a><h1>修改人员</h1>
<form action="person/person01" method="POST">
<%--    为了让handler获取到id,将id值藏入隐藏域--%><input type="hidden" name="id" value="100">
<%--    指定我们的请求方式,让HiddenHttpMethodFilter转换--%><input type="hidden" name="_method" value="PUT">编号:<input type="text" disabled="disabled" name="id" value="100"><br>名字:<input type="text" name="name" ><br><input type="submit" value="点击修改"></body>

@RequestMapping(value = "/person")
@Scope(value = "prototype")
@Controller
public class PersonHandler {@ModelAttributepublic void personPre(@RequestParam(value = "id" ,required= false)Integer id, Map<String,Object> map){//获取到要修改的person的idif(id != null){//然后通过id到数据库去查找对应的person//假定我们从数据库中获取到这个id = 100 的personPerson person = new Person();person.setId(100);person.setName("jkl");person.setAddress("china");//把这个person放入到mapzhong ,注意名字,一定要和目标方法的javabean的// @ModelAttribute中的名字一样!!!!!!!map.put("person",person);System.out.println("hashCode1 = "+person.hashCode());//然后给updatePerson}}/***1.在当目标方法的参数中有一个和页面对应的javabean信息时,*    springMVC就会将jsp提交的数据封装到目标方法的javabean(person)中*2.并将javabean对象放入到request域。*3.在默认情况下,放入到request域中的javabean对象的属性是该Javabean的类名首字母***小写的Person person2,*   即这里的Person类名的person*4.其实,如果你的目标方法有一个javabean对象,那么该java对象前,默认会有*@ModelAttribute(value="person")*即public String updatePerson(Person person2)等价* public String updatePerson(@ModelAttribute(value="person") Person person2)*5.如果我们改变默认放在request域中的javabean的属性名,则可以直接修改*@ModelAttribute(value="person")的值@ModelAttribute(value="myperson")*/@RequestMapping(value = "/person01",method = RequestMethod.PUT)public String updatePerson(Person person) {System.out.println("person01 = "+person);System.out.println("hashCode2 = "+person.hashCode());return "personOK";}
}

 控制台输出,请注意,hashCode1 = hashCode2 (要充分理解请看原理图)

<%@ page contentType="text/html;charset=UTF-8" language="java" isErrorPage="true"
isELIgnored="false" %>
<html>
<head><title>Title</title>personid: ${requestScope.person.id} <br>personname:${requestScope.person.name}<br>personAddress:${requestScope.person.address}<br>
</head>
<body>

 四、目标方法获取javaBean的流程

使用注意事项(考点):
5.目标方法实际上获取javabean对象的流程为
(1).先从隐含Map(类似于Struts2中的值栈,即在方法调用前创建了该Map)中获取对应的对象.若有,则返回,传给目标方法的目标参数
(2).若没有,则检查是否需要从Session获取.若需要,则从Session中获取,若Session中有,则直接返回,若没有,则抛出异常.
(3)若不需要从Session中获取,其Map中也没有,则直接通过反射来创建对象,并放入到到map中(即request域中)
(4)把表单的参数投射到bean的对相应的属性上,这样在jsp页面上也可以去使用这些数据

相关文章:

springMVC-模型数据的处理

一、数据放入到request域当中 1、把获取的数据放入request域中&#xff0c; 方便在跳转页面去显示 <a>添加主人信息</a> <form action"vote/vote04" method"post" >主人id&#xff1a;<input type"text" name"id&q…...

计算机组成原理-微指令的设计与微程序控制单元的设计

文章目录 微指令的设计微指令的格式微指令的编码方式水平型微指令的操作控制部分的编码方式直接编码字段直接编码例题字段间接编码方式 微指令的地址形成方式例题小结 微程序控制单元的设计微程序设计分类硬布线与微程序的比较 微指令的设计 微指令的格式 水平型微指令的操作…...

PyTorch机器学习与深度学习

近年来&#xff0c;随着AlphaGo、无人驾驶汽车、医学影像智慧辅助诊疗、ImageNet竞赛等热点事件的发生&#xff0c;人工智能迎来了新一轮的发展浪潮。尤其是深度学习技术&#xff0c;在许多行业都取得了颠覆性的成果。另外&#xff0c;近年来&#xff0c;Pytorch深度学习框架受…...

羊奶vs牛奶,羊大师告诉你谁是更营养的选择?

羊奶vs牛奶&#xff0c;羊大师告诉你谁是更营养的选择&#xff1f; 羊奶和牛奶是两种常见的乳制品&#xff0c;它们不仅在口味上有所差异&#xff0c;而且在营养成分方面也存在一些差异。本文将对羊奶和牛奶的营养成分进行全面对比&#xff0c;旨在帮助读者更好地了解这两种乳…...

机器学习之线性回归(Linear Regression)

概念 线性回归(Linear Regression)是机器学习中的一种基本的监督学习算法,用于建立输入变量(特征)与输出变量(目标)之间的线性关系。它假设输入变量与输出变量之间存在线性关系,并试图找到最佳拟合线来描述这种关系。 在简单线性回归中,只涉及两个变量:一个是自变量…...

ChatGPT与ArcGIS PRO 如何结合,打造一个全新的工作流程

在地学领域&#xff0c;ArcGIS几乎成为了每位科研工作者作图、数据分析的必备工具&#xff0c;而ArcGIS Pro3除了良好地继承了ArcMap强大的数据管理、制图、空间分析等能力&#xff0c;还具有二三维融合、大数据、矢量切片制作及发布、任务工作流、时空立方体等特色功能&#x…...

【深度学习】对比学习的损失函数

前言 对比学习损失&#xff08;Contrastive Learning Loss&#xff09;是一种用于自监督学习的损失函数。它侧重于学习一个特征空间&#xff0c;其中相似的样本被拉近&#xff0c;而不相似的样本被推远。在二分类任务中&#xff0c;对比学习损失可以用来学习区分正负样本的特征…...

哈夫曼解码

【问题描述】 给定一组字符的Huffman编码表&#xff08;从标准输入读取&#xff09;&#xff0c;给定一个用该编码表进行编码的Huffman编码文件&#xff08;存在当前目录下的in.txt中&#xff09;&#xff0c;编写程序对Huffman编码文件进行解码。 例如给定的一组字符的Huffm…...

Excel小技能:excel如何将数字20231211转化成指定日期格式2023/12/11

给了一串数字20231211&#xff0c;想要转成指定格式的日期格式&#xff0c;发现设置单元格格式为指定日期格式不生效&#xff0c;反而变成很长很长的一串#这个&#xff0c;如图所示&#xff1a; 其实&#xff0c;正确的做法如下&#xff1a; 1&#xff09;打开数据功能界面&am…...

Selenium自动化测试框架(超详细总结分享)

设计思路 本文整理归纳以往的工作中用到的东西&#xff0c;现汇总成基础测试框架提供分享。 框架采用python3 selenium3 PO yaml ddt unittest等技术编写成基础测试框架&#xff0c;能适应日常测试工作需要。 1、使用Page Object模式将页面定位和业务操作分开&#xff…...

STM32 DAC+串口

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、DAC是什么&#xff1f;二、STM32 DAC1.什么型号有DAC2. 简介3. 主要特点4. DAC框图5. DAC 电压范围和引脚 三、程序步骤1. 开启DAC时钟2. 配置引脚 PA4 PA5…...

SolidWorks二次开发 C#-读取基于Excel的BOM表信息

SolidWorks二次开发 C#-读取基于Excel的BOM表信息 问题点来源解决方案及思路相关引用链接 问题点来源 这是一位粉丝问的一个问题&#xff0c;他说到: 老师&#xff0c;请问Solidworks二次开发工程图中"基于Excel的材料明细表"怎么读取里面的数据&#xff1f; Ps:这…...

maui中实现加载更多 RefreshView跟ListView(2)

一个类似商品例表的下拉效果&#xff1a; 代码 新增个类为商品商体类 public class ProductItem{public string ImageSource { get; set; }public string ProductName { get; set; }public string Price { get; set; }}界面代码&#xff1a; <?xml version"1.0&quo…...

win10环境下git安装和基础操作

简述 关于git的作用就不多赘述了&#xff0c;配合GitHub&#xff0c;达到方便人们日常项目维护和管理&#xff0c;每一次项目增删改查都可以看的清清楚楚&#xff0c;方便团队协作和个人项目日常维护。 下载git 首先我们自然是要到官网下载git&#xff0c;下载地址为https:/…...

将yolo格式转化为voc格式:txt转xml(亲测有效)

1.文件目录如下所示&#xff1a; 对以上目录的解释&#xff1a; 1.dataset下面的image文件夹&#xff1a;里面装的是数据集的原图片 2.dataset下面的label文件夹&#xff1a;里面装的是图片对应得yolo格式标签 3.dataset下面的Annotations文件夹&#xff1a;这是一个空文件夹&…...

字符串 - 541.反转字符串II(C#和C实现)

字符串 - 541.反转字符串II(C#和C实现) 题目描述 给定一个字符串 s 和一个整数 k&#xff0c;你需要对从字符串开头算起的每隔 2k 个字符的前 k 个字符进行反转。 如果剩余字符少于 k 个&#xff0c;则将剩余字符全部反转。如果剩余字符小于 2k 但大于或等于 k 个&#xff0…...

机器视觉技术与应用实战(开运算、闭运算、细化)

开运算和闭运算的基础是膨胀和腐蚀&#xff0c;可以在看本文章前先阅读这篇文章机器视觉技术与应用实战&#xff08;Chapter Two-04&#xff09;-CSDN博客 开运算&#xff1a;先腐蚀后膨胀。开运算可以使图像的轮廓变得光滑&#xff0c;具有断开狭窄的间断和消除细小突出物的作…...

云原生之深入解析云原生架构的日志监控

一、什么是云原生架构的日志监控&#xff1f; 云原生架构的日志监控要求现代 Web 应用程序采用与传统应用程序略有不同的方法。部分原因是应用程序环境要复杂得多&#xff0c;包括从微服务中获取数据、使用 Kubernetes 和其他容器技术&#xff0c;以及在许多情况下集成开源组件…...

基于hfl/rbt3模型的情感分析学习研究——文本挖掘

参考书籍《HuggingFace自然语言处理详解 》 什么是文本挖掘 文本挖掘&#xff08;Text mining&#xff09;有时也被称为文字探勘、文本数据挖掘等&#xff0c;大致相当于文字分析&#xff0c;一般指文本处理过程中产生高质量的信息。高质量的信息通常通过分类和预测来产生&…...

计算机网络基础——常用的中英文网络述语大全,强烈建议收藏

系统网络体系结构(System Network Architecture&#xff0c;SNA) 国际标准化组织(International Organization for Standardization&#xff0c;ISO) 开放系统互连基本参考模型(Open System Interconnection Reference Model。OSI/RM) 物理层(Physical Layer) 数据终端设备…...

conda相比python好处

Conda 作为 Python 的环境和包管理工具&#xff0c;相比原生 Python 生态&#xff08;如 pip 虚拟环境&#xff09;有许多独特优势&#xff0c;尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处&#xff1a; 一、一站式环境管理&#xff1a…...

连锁超市冷库节能解决方案:如何实现超市降本增效

在连锁超市冷库运营中&#xff0c;高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术&#xff0c;实现年省电费15%-60%&#xff0c;且不改动原有装备、安装快捷、…...

微信小程序 - 手机震动

一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注&#xff1a;文档 https://developers.weixin.qq…...

从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)

设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile&#xff0c;新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...

unix/linux,sudo,其发展历程详细时间线、由来、历史背景

sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...

Java面试专项一-准备篇

一、企业简历筛选规则 一般企业的简历筛选流程&#xff1a;首先由HR先筛选一部分简历后&#xff0c;在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如&#xff1a;Boss直聘&#xff08;招聘方平台&#xff09; 直接按照条件进行筛选 例如&#xff1a…...

HDFS分布式存储 zookeeper

hadoop介绍 狭义上hadoop是指apache的一款开源软件 用java语言实现开源框架&#xff0c;允许使用简单的变成模型跨计算机对大型集群进行分布式处理&#xff08;1.海量的数据存储 2.海量数据的计算&#xff09;Hadoop核心组件 hdfs&#xff08;分布式文件存储系统&#xff09;&a…...

Mysql中select查询语句的执行过程

目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析&#xff08;Parser&#xff09; 2.4、执行sql 1. 预处理&#xff08;Preprocessor&#xff09; 2. 查询优化器&#xff08;Optimizer&#xff09; 3. 执行器…...

LangChain知识库管理后端接口:数据库操作详解—— 构建本地知识库系统的基础《二》

这段 Python 代码是一个完整的 知识库数据库操作模块&#xff0c;用于对本地知识库系统中的知识库进行增删改查&#xff08;CRUD&#xff09;操作。它基于 SQLAlchemy ORM 框架 和一个自定义的装饰器 with_session 实现数据库会话管理。 &#x1f4d8; 一、整体功能概述 该模块…...

鸿蒙HarmonyOS 5军旗小游戏实现指南

1. 项目概述 本军旗小游戏基于鸿蒙HarmonyOS 5开发&#xff0c;采用DevEco Studio实现&#xff0c;包含完整的游戏逻辑和UI界面。 2. 项目结构 /src/main/java/com/example/militarychess/├── MainAbilitySlice.java // 主界面├── GameView.java // 游戏核…...