技术标签: Spring MVC java
JSP四大作用域对应的内置对象:
pageContex,request,session,application。
模型数据的绑定是由ViewResolver来完成的,实际开发中,我们需要先添加模型数据,再交给ViewResolver来绑定。
Spring MVC提供了以下几种方式提那家模型数据:
一.将模型数据绑定到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
文章浏览阅读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++某网格向外面扩展不考虑方向
文章浏览阅读734次。介绍本系列中的前一个教程如何访问DOM中的元素 ,介绍了如何使用document对象的内置方法通过ID,类,标记名称和查询选择器来访问HTML元素。 我们知道,DOM被构造为一个以document节点为根节点和每个其他节点(包括元素,注释和文本节点)作为各个分支的节点树 。通常情况下,您将需要在DOM中移动,而不事先指定每个元素。 学习如何浏览DOM树并从分支转移到分支对于理解如何使用JavaSc..._遍历body所有子节点dom
文章浏览阅读1.7k次。前言本文主要给大家介绍了关于python子类调用父类函数的相关内容,Python中子类中的__init__()函数会覆盖父类的函数,一些情况往往需要在子类里调用父类函数。下面话不多说了,来一起看看详细的介绍:如下例程里,???处是需要调用父类函数的地方,接下来结合例程具体介绍。# -*- coding:utf-8 -*-class Student:def __init__(self,name):s..._python函数中的变量可以在子函数中访问吗
文章浏览阅读543次。Animation概述System.Windows.Media.Animation 命名空间提供一些类型,这些类型支持属性动画功能,包括时间线、演示图板和关键帧。.17个“类型名+Animation”类,这些类使用插值。 22个“类型名+AnimationUsingKeyFrames”类,这些类使用关键帧动画。 3个“类型名+AnimationUsingPath”类,这些类使用基于路径的动画。简单动画DoubleAnimation在指定的Duration上使用线性..._必须为“system.windows.media.animation.doubleanimationusingkeyframes”指定 t
文章浏览阅读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题————坡道行驶电动小车,该题目要求如下:..._爬坡小车电赛设计方案
文章浏览阅读422次。有问题发到评论区_rtl8370使用
文章浏览阅读3.6k次,点赞3次,收藏3次。给每个下拉菜单绑定一个change事件。当下拉菜单选项改变时,在组件中设置新数据,使得下级下拉菜单的选项随之改变。Vue.js是构建用户界面的渐进式框架,它可以轻松实现下拉菜单的三级联动。为绑定下拉菜单的选项,我们需要设计一个对应的数据结构。可以使用一个数组变量表示三级联动的选项。将设计好的数据绑定到菜单的选项中,并在组件的mounted钩子函数中初始化数据。在Vue组件中,设计一个select组件,它包含三个联动的下拉菜单。为了实现多级联动,我们可以使用递归的方法在组件中实现。_vue三级联动下拉列表怎么实现
文章浏览阅读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
文章浏览阅读117次。类似问题答案天津科技大学计算机类(计算机科学与技术(信息处理))专业2016年在山西理科高考录...学校 地 区 专业 年份 批次 类型 分数 天津科技大学 山西 计算机类(计算机科学与技术(信息处理)) 2016 二批 理科 475 学校 地 区 专业 年份 批次 类型 分数 天津科技大学 山西 计算机类(计算机科学与技术(信息处理)) 2016 二批 理科 475河南科技大学计算机科学与技术专..._江苏科技大学2016计算机本科录取线
文章浏览阅读4k次,点赞2次,收藏6次。【百度大脑新品体验】驾驶行为分析作者:才能我浪费991.功能描述:针对车载场景,识别驾驶员使用手机、抽烟、不系安全带、双手离开方向盘等动作姿态,分析预警危险驾驶行为,提升行车安全性2.平台接入具体接入方式比较简单,可以参考我的另一个帖子,这里就不重复了:http://ai.baidu.com/forum/topic/show/9433273.调用攻略(Python3)及评测3.1首..._为什么选用百度智能云驾驶行为分析接口
文章浏览阅读8.5k次,点赞23次,收藏63次。我们的一个业务是在Intel CPU的电脑上,进行深度学习模型算法的开发。模型有用到OpenCV,Pytorch,还有QT界面,大多数使用的是图像处理和CNN特征提取和分类的功能,处理的是摄像头输入视频,图片这两类数据。考虑到要求实时处理,我们设计的各个功能模块,能够20fps运行和显示,以及在minutes时间内,输出后处理分析的结果,就能达到预定效果。随后采用docker,部署整个环境到ARM CPU的服务器上。_arm中数据搬运速度太慢