Spring MVC 学习笔记 第四章 Spring MVC 模型数据解析_spring mvc模型数据解析笔记-程序员宅基地

技术标签: Spring MVC  java  

Spring MVC 学习笔记 第四章 Spring MVC 模型数据解析

JSP四大作用域对应的内置对象:
pageContex,request,session,application。
模型数据的绑定是由ViewResolver来完成的,实际开发中,我们需要先添加模型数据,再交给ViewResolver来绑定。

Spring MVC提供了以下几种方式提那家模型数据:

  • Map
  • Model
  • ModelAndView
  • @SessionAttribute
  • @ModelAndAttribute

一.将模型数据绑定到request对象

1. Map

@RequestMapping("/map")
public String map(Map<String,User> map){
    
    // 创建user对象,赋值
    User user = new User();
    user.setId(123);
    user.setName("小黑");

    //将user保存到map里
    map.put("user",user);
    // 返回视图,传到客户端(map会自动存入视图中,request)
    return "view";
}

在这里,形参处的Map<String,User> map,是用来向客户端传出值用的。

JSP:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page isELIgnored="false" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    ${
    requestScope.user}
</body>
</html>

此处添加<%@ page isELIgnored=“false” %>是为了使EL表达式起作用。

2. Model

@RequestMapping("/model")
public String model(Model model){
    
    // 创建user对象,赋值
    User user = new User();
    user.setId(456);
    user.setName("小黄");

    // 将user存入model
    model.addAttribute("user",user);
    // 返回视图,传到客户端
    return "view";
}

3. modelAndView

modelAndView有多种实现方式:

@RequestMapping("/modelAndView")
public ModelAndView modelAndView(){
    
    // 创建user对象,赋值
    User user = new User();
    user.setId(100);
    user.setName("兰兰");

    // 创建ModelAndView对象
    ModelAndView modelAndView = new ModelAndView();
    // 将user对象添加到ModelAndView里
    modelAndView.addObject("user",user);
    // 设置视图名称
    modelAndView.setViewName("view");
    // 返回ModelAndView对象到客户端
    return modelAndView;
}

@RequestMapping("/modelAndView2")
public ModelAndView modelAndView2(){
    
    User user = new User();
    user.setId(200);
    user.setName("小白");
    ModelAndView modelAndView = new ModelAndView();
    modelAndView.addObject("user",user);
    View view = new InternalResourceView("/view.jsp");
    modelAndView.setView(view);
    return modelAndView;
}

@RequestMapping("/modelAndView3")
public ModelAndView modelAndView3(){
    
    User user = new User();
    user.setId(300);
    user.setName("小灰");
    ModelAndView modelAndView = new ModelAndView("view");
    modelAndView.addObject("user",user);
    return modelAndView;
}

@RequestMapping("/modelAndView4")
public ModelAndView modelAndView4(){
    
    User user = new User();
    user.setId(400);
    user.setName("小紫");
    View view = new InternalResourceView("/view.jsp");
    ModelAndView modelAndView=new ModelAndView(view);
    modelAndView.addObject("user",user);
    return modelAndView;
}

@RequestMapping("/modelAndView5")
public ModelAndView modelAndView5(){
    
    User user = new User();
    user.setId(500);
    user.setName("小橘");
    Map<String,User> map = new HashMap<String,User>();
    map.put("user",user);
    ModelAndView modelAndView=new ModelAndView("view",map);
    return modelAndView;
}

@RequestMapping("/modelAndView6")
public ModelAndView modelAndView6(){
    
    User user = new User();
    user.setId(600);
    user.setName("小透明");
    Map<String,User> map = new HashMap<String,User>();
    map.put("user",user);
    View view = new InternalResourceView("/view.jsp");
    ModelAndView modelAndView=new ModelAndView(view,map);
    return modelAndView;
}

@RequestMapping("/modelAndView7")
public ModelAndView modelAndView7(){
    
    User user = new User();
    user.setId(700);
    user.setName("小明");
    ModelAndView modelAndView=new ModelAndView("view","user",user);
    return modelAndView;
}

@RequestMapping("/modelAndView8")
public ModelAndView modelAndView8(){
    
    User user = new User();
    user.setId(800);
    user.setName("小缸");
    View view = new InternalResourceView("/view.jsp");
    ModelAndView modelAndView=new ModelAndView(view,"user",user);
    return modelAndView;
}

4. HttpServletRequest

@RequestMapping("/request")
public String request(HttpServletRequest request){
    
    User user = new User();
    user.setId(101);
    user.setName("Tom");
    request.setAttribute("user",user);
    return "view";
}

5.@SessionAttribute

  • 定义一个方法,该方法专门用来返回要填充到模型数据中的对象。

方法①:直接返回user对象

@ModelAttribute
public User getUser(){
    
    User user = new User();
    user.setId(102);
    user.setName("Mike");
    return user;
}

方法②:没有返回值,通过map填充

@ModelAttribute
public void getUser(Map<String,User> map){
    
    User user = new User();
    user.setId(102);
    user.setName("Mike");
    map.put("user",user);
}

方法③:没有返回值,通过model填充

@ModelAttribute
public void getUser(Model model){
    
    User user = new User();
    user.setId(102);
    user.setName("Mike");
    model.addAttribute("user",user);
}
  • 业务方法中无需再处理模型数据,只需要返回视图即可。
@RequestMapping("/modelAttribute")
public String modelAttribute(){
    
    return "view";
}

二.将模型数据绑定到session对象

1. 直接使用原生的Servlet API

方法①:通过request创建session对象

@RequestMapping("/session")
public String session(HttpServletRequest request){
    
    // 通过request创建session对象
    HttpSession session = request.getSession();
    User user = new User();
    user.setId(103);
    user.setName("Bob");
    session.setAttribute("user",user);
    return "view";
}

方法②:直接用session传值

@RequestMapping("/session2")
public String session2(HttpSession session){
    
    // 直接用session传值
    User user = new User();
    user.setId(103);
    user.setName("Bob");
    session.setAttribute("user",user);
    return "view";
}

2.@SessionAttribute

@SessionAttributes(value="user")
public class VIewHandler {
    
	···
}

对于VIewHandler中的所有业务方法,只要向request中添加了key="user"的对象时,Spring MVC会自动将该数据添加到session中,保存key不变。

@SessionAttributes(types=User.class)
public class VIewHandler {
    
	···
}

对于VIewHandler中的所有业务方法,只要向request中添加了数据类型是User的对象时,Spring MVC会自动将该数据添加到session中,保存key不变。

三.将数据模型绑定到application

@RequestMapping("/application")
public String application(HttpServletRequest request){
    
    ServletContext application =request.getServletContext();
    User user = new User();
    user.setId(104);
    user.setName("Mary");
    application.setAttribute("user",user);
    return "view";
}

JSP中取值:

${
    applicationScope.user}

☼注:

如果request.getServletContext()的方法出现编译错误,可能是因为javax.servlet-api的jar包版本太低(要3.0以上才可以支持此方法)。因此,我从网上下载了高版本的javax.servlet-api-4.0.1.jar,并导入IDEA。
IntelliJ IDEA 导入方法:File→Project Structure→Modules→depandencies→+→选择本地jar包→apply→OK

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_41684416/article/details/105768825

智能推荐

数据结构与算法——搜索_c++某网格向外面扩展不考虑方向-程序员宅基地

文章浏览阅读129次。文章目录1.内容概述2.岛屿数量2.1 题目描述1.内容概述2.岛屿数量2.1 题目描述给你一个由 ‘1’(陆地)和 ‘0’(水)组成的的二维网格,请你计算网格中岛屿的数量。岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。此外,你可以假设该网格的四条边均被水包围。示例 1:输入:grid = [ ["1","1","1","1","0"], ["1","1","0","1","0"], ["1","1","0","0","0"],_c++某网格向外面扩展不考虑方向

如何遍历DOM:HTML节点遍历技巧-程序员宅基地

文章浏览阅读734次。介绍本系列中的前一个教程如何访问DOM中的元素 ,介绍了如何使用document对象的内置方法通过ID,类,标记名称和查询选择器来访问HTML元素。 我们知道,DOM被构造为一个以document节点为根节点和每个其他节点(包括元素,注释和文本节点)作为各个分支的节点树 。通常情况下,您将需要在DOM中移动,而不事先指定每个元素。 学习如何浏览DOM树并从分支转移到分支对于理解如何使用JavaSc..._遍历body所有子节点dom

python 子函数调用父函数的变量_python中子类调用父类函数的方法示例-程序员宅基地

文章浏览阅读1.7k次。前言本文主要给大家介绍了关于python子类调用父类函数的相关内容,Python中子类中的__init__()函数会覆盖父类的函数,一些情况往往需要在子类里调用父类函数。下面话不多说了,来一起看看详细的介绍:如下例程里,???处是需要调用父类函数的地方,接下来结合例程具体介绍。# -*- coding:utf-8 -*-class Student:def __init__(self,name):s..._python函数中的变量可以在子函数中访问吗

动画Animation_必须为“system.windows.media.animation.doubleanimation-程序员宅基地

文章浏览阅读543次。Animation概述System.Windows.Media.Animation 命名空间提供一些类型,这些类型支持属性动画功能,包括时间线、演示图板和关键帧。.17个“类型名+Animation”类,这些类使用插值。 22个“类型名+AnimationUsingKeyFrames”类,这些类使用关键帧动画。 3个“类型名+AnimationUsingPath”类,这些类使用基于路径的动画。简单动画DoubleAnimation在指定的Duration上使用线性..._必须为“system.windows.media.animation.doubleanimationusingkeyframes”指定 t

文献阅读:RoFormer: Enhanced Transformer with Rotary Position Embedding-程序员宅基地

文章浏览阅读3k次,点赞6次,收藏19次。文献阅读:RoFormer: Enhanced Transformer with Rotary Position Embedding1. 工作简介2. 常见位置编码方式1. 绝对位置编码1. Bert2. Attention Is All You Need2. 相对位置编码1. 经典相对位置编码2. XLNet3. T54. DeBerta3. RoPE方法介绍4. 实验效果考察1. 翻译任务上的表现2. 预训练任务上的表现3. GLUE下游Finet.._enhanced transformer with rotary position embedding

电赛 | 坡道行驶电动小车(省电赛一等奖作品)_爬坡小车电赛设计方案-程序员宅基地

文章浏览阅读1.1w次,点赞20次,收藏154次。本文为读者投稿,分享的是一个四川省电子设计竞赛一等奖作品。竞赛题目 今年的四川省电子设计竞赛共有四道题目,基于我们对做车比较了解,所以选择了c题————坡道行驶电动小车,该题目要求如下:..._爬坡小车电赛设计方案

随便推点

RK3588网口拓展:8口千兆傻瓜式交换机RTL8370N_rtl8370使用-程序员宅基地

文章浏览阅读422次。有问题发到评论区_rtl8370使用

vue三级联动下拉菜单_vue三级联动下拉列表怎么实现-程序员宅基地

文章浏览阅读3.6k次,点赞3次,收藏3次。给每个下拉菜单绑定一个change事件。当下拉菜单选项改变时,在组件中设置新数据,使得下级下拉菜单的选项随之改变。Vue.js是构建用户界面的渐进式框架,它可以轻松实现下拉菜单的三级联动。为绑定下拉菜单的选项,我们需要设计一个对应的数据结构。可以使用一个数组变量表示三级联动的选项。将设计好的数据绑定到菜单的选项中,并在组件的mounted钩子函数中初始化数据。在Vue组件中,设计一个select组件,它包含三个联动的下拉菜单。为了实现多级联动,我们可以使用递归的方法在组件中实现。_vue三级联动下拉列表怎么实现

烂笔头笔记:关于frontend-maven-plugin插件无法下载nodejs和npm的问题_windows环境下无法从github下载frontend-maven-plugin:1.12.0-程序员宅基地

文章浏览阅读1.4w次,点赞6次,收藏7次。目录简介解决方法参考资料简介frontend-maven-plugin是一个将maven与nodejs结合的插件,旨在maven生命周期中帮你下载并且本地(相对于项目来说)安装一份node和npm,并且执行npm install命令,并且还能执行其他的组合命令例如:Bower, Grunt, Gulp, Jspm, Karma, 或者 Webpack. 支持Windows, OS X 和Lin..._windows环境下无法从github下载frontend-maven-plugin:1.12.0

江苏科技大学计算机科学与技术,江苏科技大学计算机科学与技术专业2016年在江苏理科高考录取最低分数线...-程序员宅基地

文章浏览阅读117次。类似问题答案天津科技大学计算机类(计算机科学与技术(信息处理))专业2016年在山西理科高考录...学校 地 区 专业 年份 批次 类型 分数 天津科技大学 山西 计算机类(计算机科学与技术(信息处理)) 2016 二批 理科 475 学校 地 区 专业 年份 批次 类型 分数 天津科技大学 山西 计算机类(计算机科学与技术(信息处理)) 2016 二批 理科 475河南科技大学计算机科学与技术专..._江苏科技大学2016计算机本科录取线

【百度大脑新品体验】驾驶行为分析_为什么选用百度智能云驾驶行为分析接口-程序员宅基地

文章浏览阅读4k次,点赞2次,收藏6次。【百度大脑新品体验】驾驶行为分析作者:才能我浪费991.功能描述:针对车载场景,识别驾驶员使用手机、抽烟、不系安全带、双手离开方向盘等动作姿态,分析预警危险驾驶行为,提升行车安全性2.平台接入具体接入方式比较简单,可以参考我的另一个帖子,这里就不重复了:http://ai.baidu.com/forum/topic/show/9433273.调用攻略(Python3)及评测3.1首..._为什么选用百度智能云驾驶行为分析接口

深度学习模型Intel与ARM部署性能分析,Intel和ARM CPU上CNN计算速度差距分析。_arm中数据搬运速度太慢-程序员宅基地

文章浏览阅读8.5k次,点赞23次,收藏63次。我们的一个业务是在Intel CPU的电脑上,进行深度学习模型算法的开发。模型有用到OpenCV,Pytorch,还有QT界面,大多数使用的是图像处理和CNN特征提取和分类的功能,处理的是摄像头输入视频,图片这两类数据。考虑到要求实时处理,我们设计的各个功能模块,能够20fps运行和显示,以及在minutes时间内,输出后处理分析的结果,就能达到预定效果。随后采用docker,部署整个环境到ARM CPU的服务器上。_arm中数据搬运速度太慢