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>

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vue学习笔记-Vue3中的customRef

作用 创建一个自定义的ref&#xff0c;并对其依赖项的更新和触发进行显式控制 案例 描述&#xff1a;向输入框中输入内容&#xff0c;在下方延迟1秒展示输入内容 代码&#xff1a; <template><input type"text" v-model"keyword"><h3&…

设计模式——组合模式(结构型)

引言 组合模式是一种结构型设计模式&#xff0c; 你可以使用它将对象组合成树状结构&#xff0c; 并且能像使用独立对象一样使用它们。 问题 如果应用的核心模型能用树状结构表示&#xff0c; 在应用中使用组合模式才有价值。 例如&#xff0c; 你有两类对象&#xff1a; ​…

用23种设计模式打造一个cocos creator的游戏框架----(十五)策略模式

1、模式标准 模式名称&#xff1a;策略模式 模式分类&#xff1a;行为型 模式意图&#xff1a;定义一系列的算法&#xff0c;把它们一个个封装起来&#xff0c;并且使它们可以相互替换。此模式使得算法可以独立于使用它们的客户而变化 结构图&#xff1a; 适用于&#xff1…

贝锐蒲公英解决方案:企业海外分部高效、稳定访问国内办公系统

某电气技术有限公司是一家专注数字电源研发、制造和销售的企业。公司致力于为大数据和新能源行业提供智慧能源解决方案, 数字电源产品在数据与算力中心、网络基础设施、电池储能换电、家庭能源系统中均有广泛应用。目前在国内以及东南亚、欧洲、美国等地设有分公司/办事处&…

STM32F407-14.3.18-01连接霍尔传感器

连接霍尔传感器 可通过用于生成电机驱动 PWM 信号的高级控制定时器&#xff08;TIM1 或 TIM8&#xff09;以及图 114 中称为 “接口定时器”的另一个定时器 TIMx&#xff08;TIM2、TIM3、TIM4 或 TIM5&#xff09;&#xff0c;实现与霍尔传感器的连接。3 个定时器输入引脚&…

Android动画(四)——属性动画ValueAnimator的妙用

目录 介绍 效果图 代码实现 xml文件 介绍 ValueAnimator是ObjectAnimator的父类&#xff0c;它继承自Animator。ValueAnimaotor同样提供了ofInt、ofFloat、ofObject等静态方法&#xff0c;传入的参数是动画过程的开始值、中间值、结束值来构造动画对象。可以将ValueAnimator看…

LOF基金跟股票一样吗?

LOF基金&#xff0c;全称为"上市型开放式基金"&#xff0c;是一种可以在上海证券交易所认购、申购、赎回及交易的开放式证券投资基金。投资者可以通过上海证券交易所场内证券经营机构或场外基金销售机构进行认购、申购和赎回基金份额。 LOF基金的特点是既可以像股票…

1852_bash中的find应用扩展

Grey 全部学习内容汇总&#xff1a; https://github.com/GreyZhang/toolbox 1852_bash中的find应用扩展 find这个工具我用了好多年了&#xff0c;但是是不是真的会用呢&#xff1f;其实不然&#xff0c;否则也不会出现这种总结式的笔记。其实&#xff0c;注意部分小细节之后…

爬虫练习-获取imooc课程目录

代码&#xff1a; from bs4 import BeautifulSoup import requests headers{ User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:94.0) Gecko/20100101 Firefox/94.0, }id371 #课程id htmlrequests.get(https://coding.imooc.com/class/chapter/id.html#Anchor,head…

Netty网络基础的通俗理解(网络操作系统)

写在前面 说来惭愧&#xff0c;最近半年没怎么学习技术&#xff0c;时间基本都花在工作以及去熟悉了解金融领域的知识去了。从大一到现在&#xff0c;我一直有个持续学习技术的习惯&#xff0c;如果太久没学习技术&#xff0c;我心里就开始有点焦虑或者说不充实&#xff0c;所…

单元测试计划、用例、报告、评审编制模板

单元测试支撑文档编制模板&#xff0c;具体文档如下&#xff1a; 1. 单元测试计划 2. 单元测试用例 3. 单元测试报告 4. 编码及测试评审报告 软件项目相关资料全套获取&#xff1a;软件项目开发全套文档下载-CSDN博客 1、单元测试计划 2、单元测试用例 3、单元测试报告 4、编码…

【电路笔记】-电容器特性

电容器特性 文章目录 电容器特性1、概述2、标称电容 (C)3、工作电压&#xff08;WV&#xff09;4、公差&#xff08;%&#xff09;5、漏电流6、工作温度&#xff08;T&#xff09;7、温度系数&#xff08;TC&#xff09;8、极化9、等效串联电阻 (ESR) 电容器的特性决定了其温度…