模型数据

1.数据放入request

  • 说明:开发中,控制器/处理器中获取的数据如何放入request域,然后在前端(vue/jsp/...)取出显示?

先来看一个例子

应用实例需求:表单提交信息,后端获取信息,并通过request转发到另一个页面,显示信息。

需要知道的是:前端提交的数据,springmvc会自动地封装到java对象中,同时 springmvc 会自动地将其放入request 域中,这样我们就可以在跳转的下一个页面取出数据。


  1. mode_date.jsp提交数据:

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
    <title>model_data</title>
    </head>
    <body>
    <form action="vote/vote05" method="post">
    主人id:<input type="text" name="id"/><br/>
    主人名:<input type="text" name="name"/><br/>
    宠物id:<input type="text" name="pet.id"/><br/>
    宠物名:<input type="text" name="pet.name"/><br/>
    <input type="submit" value="添加主人和宠物"/><br/>
    </form>
    </body>
    </html>
  2. VoteHandler.java:

    springmvc会自动将数据封装到Javabean中,并将获取的model模型放入到request域中。

    package com.li.web.requestparam;
    
    import com.li.entity.Master;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping; /**
    * @author 李
    * @version 1.0
    */
    @RequestMapping(value = "/vote")
    @Controller
    public class VoteHandler {
    /**
    * 1.提交的数据->springmvc会自动地封装到 java对象
    * ->同时 springmvc 会自动地将其放入request域中
    * 2.这样就可以在跳转的下一个页面取出数据
    */
    @RequestMapping(value = "/vote05")
    public String test05(Master master) {
    //springmvc会自动的把获取的model模型放入request域中,名字就是 master
    return "vote_ok";
    }
    }
  3. 转发的页面 vote_ok.jsp:

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
    <title>vote_ok</title>
    </head>
    <body>
    <h1>取出request域中的信息</h1>
    主人的id=${requestScope.master.id}
    主人的名字=${requestScope.master.name}
    宠物的id=${requestScope.master.pet.id}
    宠物的名字=${requestScope.master.pet.name}
    </body>
    </html>

访问mode_date.jsp,提交数据:

转发页面vote_ok.jsp成功地拿到了request域中的信息:


从上述代码中可以看出springmvc会自动将获取的model数据添加到request域中。同时我们也可以手动添加修改数据,并放入到request域中,有如下三种方式:

1.1方式1-通过HttpServletRequest放入request域

  1. 这种方式就是原生的javaweb方式,可以在request域中以k-v形式,直接放入普通字符串,也可以放入对象

  2. 同时springmvc 自动放入request域的model也可以被修改

  3. 注意:springmvc放入request域中的对象的key值,是按照对象的类型(首字母小写)存放的,和方法的形参名无关

修改VoteHandler.java:

@RequestMapping(value = "/vote05")
public String test05(Master master100, HttpServletRequest request) {
//1.springmvc会自动的把获取的model模型放入request域中,名字就是 master
//2.也可以手动添加数据到request域中
request.setAttribute("address", "beijing");
//3.同时可以修改 master的属性值
master100.setName("hahahah");
//4.分析一下springmvc默认存放对象到request域中,属性名是如何确定的?
// 是按对象的类型(首字母小写)放入的,和方法的形参名无关
// 因此我们在转发的页面按照该名称是可以拿出来的
return "vote_ok";
}

mode_date.jsp不变,vote_ok.jsp添加address获取。

提交数据:

转发页面获取的数据:

1.2方式2-通过请求的方法参数Map<String,Object>放入request域

springmvc会遍历map,将map中的k-v存放到request域中。因此你会发现在转发页面中,直接通过${requestScope.key}也可以获取属性的数据。

修改VoteHandler.java:

/**
* 演示通过Map<String,Object>设置数据到request域
*/
@RequestMapping(value = "/vote06")
public String test06(Master master, Map<String, Object> map) {
//需求是通过map对象,添加属性到request域中
map.put("address", "tianjin");
//原理分析:springmvc会遍历map,将map中的k-v存放到request域中
//因此你会发现在转发页面中,直接通过${requestScope.address}也可以获取address的数据
return "vote_ok";
}

model_data.jsp不变

vote_ok.jsp:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>vote_ok</title>
</head>
<body>
<h1>取出request域中的信息</h1>
主人的address=${requestScope.address}
主人的id=${requestScope.master.id}
主人的名字=${requestScope.master.name}
宠物的id=${requestScope.master.pet.id}
宠物的名字=${requestScope.master.pet.name}
</body>
</html>

model_data.jsp:

vote_ok.jsp:

注意事项:

  1. 我们知道,表单提交的数据会被springmvc自动封装成对象,并放入request域中。而且springmvc会扫描map,将里面的k-v也放到request域中。

  2. 这意味着,如果map的中某个key和之前自动封装的对象同名,那么在springmvc扫描map的时候,原先的request的对象的属性值会被map中同名key的value值覆盖

1.3方式3-通过返回ModelAndView对象实现request域数据

  1. 表单数据被springmvc封装到master对象
  2. master对象被springmvc封装到request域中
  3. ModelAndView的属性也会被springmvc放入到request域中
  4. 因此转发的页面中可以通过request域获取到所有数据

修改 VoteHandler.java:

//演示通过返回ModelAndView对象,将数据放入到request域中
@RequestMapping(value = "/vote07")
public ModelAndView test07(Master master) {
ModelAndView modelAndView = new ModelAndView();
//放入属性到 ModelAndView对象
modelAndView.addObject("address", "shanghai~~");
//指定要跳转的视图名称
modelAndView.setViewName("vote_ok");
return modelAndView;
}

model_data.jsp不变

vote_ok.jsp:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>vote_ok</title>
</head>
<body>
<h1>取出request域中的信息</h1>
主人的address=${requestScope.address}
主人的id=${requestScope.master.id}
主人的名字=${requestScope.master.name}
宠物的id=${requestScope.master.pet.id}
宠物的名字=${requestScope.master.pet.name}
</body>
</html>

model_data.jsp:

vote_ok.jsp:可以看到在ModelAndView中的数据已经被放入到了request对象中,因此可以直接获取

注意事项:

  1. 从本质上看,请求响应的方return "xxx",只是返回了一个字符串,其实本质上底层是返回了一个ModelAndView 对象,只是默认被封装起来了。

  2. ModelAndView 既可以包含 model 数据,也可以包含视图信息。

  3. ModelAndView 对象的 addObject 方法可以添加key-val数据,添加的数据默认被 springmvc 扫描放在request域中。

  4. ModelAndView 对象的 setView 方法可以指定视图名称。

  5. 这里ModelAndView 被 springmvc 扫描,将属性放入request域中的操作,和之前map被springmvc扫描非常相似。同样的,ModelAndView中的属性被放入request域中时,如果request域中已经有同名属性了,那么将会进行覆盖操作。

2.数据放入session

  • 说明:开发中,控制器/处理器中获取的数据如何放入session域,然后在前端(vue/jsp/...)取出显示?

应用实例

仍然以之前的例子说明:


  1. model_date.jsp

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
    <title>model_data</title>
    </head>
    <body>
    <h1>添加信息[测试session]</h1>
    <form action="vote/vote08" method="post">
    主人id:<input type="text" name="id"/><br/>
    主人名:<input type="text" name="name"/><br/>
    宠物id:<input type="text" name="pet.id"/><br/>
    宠物名:<input type="text" name="pet.name"/><br/>
    <input type="submit" value="添加主人和宠物"/><br/>
    </form>
    </body>
    </html>
  2. 修改VoteHandler.java

    //演示如何将数据设置到session域中
    @RequestMapping(value = "/vote08")
    public String test08(Master master,HttpSession session) {
    //master对象默认放在request域中
    //因此要手动将数据放入session中
    session.setAttribute("master",master);
    session.setAttribute("address","guangzhou");
    return "vote_ok";
    }
  3. vote_ok.jsp:

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
    <title>vote_ok</title>
    </head>
    <body>
    <h1>取出session域中的信息</h1>
    主人的address=${sessionScope.address}<br/>
    主人的id=${sessionScope.master.id}<br/>
    主人的名字=${sessionScope.master.name}<br/>
    宠物的id=${sessionScope.master.pet.id}<br/>
    宠物的名字=${sessionScope.master.pet.name}
    </body>
    </html>

model_data.jsp:

vote_ok.jsp:

3.@ModelAttribute实现prepare方法

3.1基本说明

开发中,有时需要使用某个前置方法(如prepareXXX,名称随意)给目标方法准备一个模型对象

  1. @ModelAttribute 注解可以实现这样的需求
  2. 在某个方法上添加了@ModelAttribute注解后,这个方法就是前置方法。在调用该Handler的任何一个方法时,都会先调用这个前置方法。

应用实例

  1. 修改VoteHandler.java,增加方法,并测试。

    @RequestMapping(value = "/vote09")
    public String test09() {
    System.out.println("test09被调用...");
    return "vote_ok";
    } @RequestMapping(value = "/vote10")
    public String test10() {
    System.out.println("test10被调用...");
    return "vote_ok";
    } /**
    * 1.当 Handler的一个方法被 @ModelAttribute 修饰时,这个方法就是前置方法
    * 2.该 Handler中的其他方法被调用时,都会先调用这个前置方法
    * 3.类似spring的aop的前置通知
    * 4.前置方法会切入到其他方法前执行[底层还是aop机制]
    */
    @ModelAttribute
    public void prepareModel() {
    System.out.println("prepareModel()---完成准备工作");
    }
  2. 分别在浏览器中方法test09,test10方法

  3. 后台输出:可以看到每次目标方法被访问前,都会调用前置方法prepareModel()

3.2@ModelAttribute的最佳实践

  • 修改用户信息(就是这种机制的经典应用),流程如下:

    1. 在修改前,在前置方法中从数据库查出这个用户的数据
    2. 在修改方法(目标方法)中,可以使用前置方法的(从数据库查出的)用户数据
    3. 如果表单中对用户的某个属性修改了,则以新的数据为准。如果没有修改或不能修改,就以前置方法查出的用户数据为准,就保持原来的值。

day03-模型数据的更多相关文章

  1. Spring MVC 处理模型数据(@ModelAttribute)

    SpringMVC中的模型数据是非常重要的,因为MVC中的控制(C)请求处理业务逻辑来生成数据模型(M),而视图(V)就是为了渲染数据模型的数据. 直白来讲,上面这句话的意思就是:当有一个查询的请求, ...

  2. SpringMvc:处理模型数据

    SpringMvc提供了以下途径输出模型数据: -ModelAndView:处理方法返回值类型为ModelAndView,方法体即可通过该对象添加模型数据 -Map或Model:入参为org.spri ...

  3. 5、处理模型数据ModelAndView、Map、Model以及@SessionAttributes注解

    Spring MVC提供了以下几种途径输出模型数据 —— ModelAndView: 处理方法返回值类型为ModelAndView时,方法体即可通过该对象添加模型数据.数据会添加到request域中. ...

  4. springmvc学习(五)——处理模型数据

    Spring MVC 提供了以下几种途径输出模型数据: ModelAndView: 处理方法返回值类型为 ModelAndView 时, 方法体即可通过该对象添加模型数据Map 及 Model: 入参 ...

  5. Asp.Net MVC4.0 官方教程 入门指南之五--控制器访问模型数据

    Asp.Net MVC4.0 官方教程 入门指南之五--控制器访问模型数据 在这一节中,你将新创建一个新的 MoviesController类,并编写代码,实现获取影片数据和使用视图模板在浏览器中展现 ...

  6. springMVC(6)---处理模型数据

    springMVC(6)---处理模型数据 之前一篇博客,写个怎么获取前段数据:springMVC(2)---获取前段数据,这篇文章写怎么从后端往前端传入数据. 模型数据类型             ...

  7. SpringMVC(十二):SpringMVC 处理输出模型数据之@ModelAttribute

    Spring MVC提供了以下几种途径输出模型数据:1)ModelAndView:处理方法返回值类型为ModelAndView时,方法体即可通过该对象添加模型数据:2)Map及Model:处理方法入参 ...

  8. SpringMVC(十一):SpringMVC 处理输出模型数据之SessionAttributes

    Spring MVC提供了以下几种途径输出模型数据:1)ModelAndView:处理方法返回值类型为ModelAndView时,方法体即可通过该对象添加模型数据:2)Map及Model:处理方法入参 ...

  9. SpringMVC(十):SpringMVC 处理输出模型数据之Map及Model

    Spring MVC提供了以下几种途径输出模型数据: 1)ModelAndView:处理方法返回值类型为ModelAndView时,方法体即可通过该对象添加模型数据: 2)Map及Model:处理方法 ...

  10. SpringMVC(九):SpringMVC 处理输出模型数据之ModelAndView

    Spring MVC提供了以下几种途径输出模型数据: 1)ModelAndView:处理方法返回值类型为ModelAndView时,方法体即可通过该对象添加模型数据: 2)Map及Model:处理方法 ...

随机推荐

  1. 时序数据库TDengine 详细安装+集成流程+问题解决

    官方文档:https://docs.taosdata.com/get-started/package/ 点击进入 产品简介 TDengine 是一款高性能.分布式.支持 SQL 的时序数据库 (Dat ...

  2. LoadRunner11脚本小技能之添加请求头+定义变量+响应内容乱码转换打印+事务拆分

    一.添加请求头 存在一些接口,发送请求时需要进行权限验证.登录验证(不加请求头时运行脚本,接口可能会报401等等),所以需要在脚本中给对应请求添加请求头.注意:请求头需在请求前添加,包含url类.su ...

  3. ThinkPhp5 自定义异常处理类

    在项目的开发过程中异常抛出尤为重要不仅能够做出友好提示帮助掩盖我们伟大的程序员们尴尬的瞬间,还能做到提示开发人员代码白编写的错误,下面进行自定义异常抛出类,纯属个人理解,希望大家指正 首先在框架中我们 ...

  4. 【DL论文精读笔记】Object Detection in 20 Y ears: A Survey目标检测综述

    目标检测20年综述(2019) 摘要 Abstract 该综述涵盖了400篇目标检测文章,时间跨度将近四分之一世纪.包括目标检测历史上的里程碑检测器.数据集.衡量指标.基本搭建模块.加速技术,最近的s ...

  5. Vscode连接gitee远程仓库

    Git初始化项目 1. Git的基础配置 Git的安装配置 下载地址为:http://git-scm.com/downloads 安装完第一步要做的是,设置你的用户名和邮件地址. git config ...

  6. CSP 记

    csp 开考建好文件夹编译器不能用搞了半天换了台电脑 四道题看完一个小时过去了 第一题不会正解写了部分分还有点悬 第二题写暴力因为一个小错误调了半天 看时间不多了已经有点慌了 也没想正解直接开了下一题 ...

  7. go slice不同初始化方式性能&数组比较

    go语言开发中,slice是我们常用的数据类型之一,也是因为它的灵活性,自己也很少使用数组,当然我也知道它的一些特性,不过没有真实的去验证它,因为大多数使用场景没必要对code太过苛刻,但是如果封装作 ...

  8. ArcGIS QGIS学习二:图层如何只显示需要的部分几何面数据(附最新坐标边界下载全国省市区县乡镇)

    目录 前言 准备SHP数据 ArcMap 的筛选 QGIS 的筛选 如何编写查询条件 前言 当我们用GIS软件打开一个SHP文件的时候,会显示出里面全部的几何图形,假如我只想要其中的一部分数据显示出来 ...

  9. ArcObjects SDK开发 005 ArcObjects SDK中的插件式架构

    1.什么是插件式架构 插件式架构设计中主要包括三个重要部分,宿主.插件协议以及插件实现.宿主是指使用插件的部分,该模块可以是一个类,也可以是多个接口和类组成的模块.插件协议是指宿主与插件之间的协议,宿 ...

  10. Datawhale组队学习_Task03:详读西瓜书+南瓜书第4章

    第4章 决策树 4.1 基本流程 #输入:训练集D={${(x_1,y_1),(x_2,y_2),...,(x_m,y_m)}$}; #属性集A=${{a_1,a_2,...,a_d}}$. #过程: ...