处理模型数据

Spring MVC 提供了以下几种途径输出模型数据:
– ModelAndView: 处理方法返回值类型为 ModelAndView时, 方法体即可通过该对象添加
  模型数据
– Map 及 Model: 入参为org.springframework.ui.Model、org.springframework.ui.
  ModelMap 或 java.uti.Map 时,处理方法返回时,Map
  中的数据会自动添加到模型中。
– @SessionAttributes: 将模型中的某个属性暂存到
  HttpSession 中,以便多个请求之间可以共享这个属性
– @ModelAttribute: 方法入参标注该注解后, 入参的对象就会放到数据模型中

注:下面的代码均来自上一篇的注解代码之后的测试代码!!

 ModelAndView

控制器处理方法的返回值如果为 ModelAndView, 则其既
包含视图信息,也包含模型数据信息。
 
 添加模型数据:
– MoelAndView addObject(String attributeName, Object
attributeValue)
– ModelAndView addAllObject(Map<String, ?> modelMap)
 
设置视图:
– void setView(View view)
– void setViewName(String viewName)

TestRequestMapping.java

   @RequestMapping("/testModelAndView")
public ModelAndView testModelAndView(){ String viewName="success";
ModelAndView andView = new ModelAndView(viewName);
andView.addObject("time", new Date());
return andView;
}

index.jsp

<a href="springmvc/testModelAndView">testModelAndView</a>

success.jsp;

     time:${requestScope.time}

总结:SpringMVC会把ModelAndView的model中数据放入到request域对象中

 Map 及 Model

Spring MVC 在内部使用了一个org.springframework.ui.Model 接口存储模型数据

具体步骤
– Spring MVC 在调用方法前会创建一个隐含的模型对象作为模型数据的存储容器。
 
– 如果方法的入参为 Map 或 Model 类型,Spring MVC 会将隐含模型的引用传
  递给这些入参。在方法体内,开发者可以通过这个入参对象访问到模型中的所有数
  据,也可以向模型中添加新的属性数据

目标方法可以添加Map类型(实际上是Model或者ModelMap类型)的参数

TestRequestMapping.java

@RequestMapping("/testMap")
public String testMap(Map<String, Object> map){
map.put("name", "MrChengs"); return "success";
}

indexjsp

<a href="springmvc/testMap">testMap</a>

success.jsp

name:${requestScope.name}

  

@SessionAttributes

只能放在类的上面

若希望在多个请求之间共用某个模型属性数据,则可以在
控制器类上标注一个 @SessionAttributes, Spring MVC
将在模型中对应的属性暂存到 HttpSession 中。
@SessionAttributes 除了可以通过属性名指定需要放到会话中的属性外(value)
还可以通过模型属性的对象类型指定哪些模型属性需要放到会话中(type)
 – @SessionAttributes(types=User.class) 会将隐含模型中所有类型
            为 User.class 的属性添加到会话中。
    – @SessionAttributes(value={“user1”, “user2”})
    – @SessionAttributes(types={User.class, Dept.class})
    – @SessionAttributes(value={“user1”, “user2”},
            types={Dept.class})

TestRequestMapping.java

@SessionAttributes(value="user")
@Controller
@RequestMapping("/springmvc")
public class TestRequestMapping {
@RequestMapping("/testSessionAttributes")
public String testSessionAttributes(Map<String,Object> map){
User user = new User("MrChangs", "", "1287@qq.com");
map.put("user", user); return "success";
}
}

index.jsp

 <a href="springmvc/testSessionAttributes">testSessionAttributes</a>

success.jsp

           user requestScope:${requestScope.user}
<br>
<br>
user sessionScope:${sessionScope.user}

  

@ModelAttribute

模拟修改数据路中的数据,有些不能修改。
index.jsp
 <!--
模拟修改操作
1.原始数据:id=1,name=MrChengs,pw=1234,email=MrChengs@qq.com
2.密码不能修改
3.表单回显,模拟操作直接在表单填写对应的额属性值
-->
<form action="springmvc/ModelAttribute" method="post">
<input type="hidden" name="id" value="1">
<br>
name:<input type="text" name="username" value="MrChengs">
<br>
email:<input type="text" name="email" value="MrChengs@qq.com">
<br>
<input type="submit" value="submit">
</form>

  

//标记的方法会在每个目标方法执行之前被调用

    //1.由@ModelAttribute标记的方法,会把每个目标之前被springmvc调用
//2.@MOdelAttribute注解也可以来修饰目标方法pojo类型的入参,其value属性值如下作用
//2.1)springmvc会使用value属性值在implicitModel中查找对应的对象,若存在直接传入到目标方法的入参中
//2.2)springmvc会把value为key,pojo类型对象为value,存到request中 @ModelAttribute
public void getUser(@RequestParam(value="id",required=false) Integer id,
Map<String,Object> map){
if(id != null){
User user = new User(1, "MrChengs", "1234", "MrChengs@qq.com");
System.out.println("得到一个参数"); //注意:这里的key为users,如果改为users等其他字符,等不到结果,程序可以正常的执行
//解决方法在下面的代码中
map.put("users", user);
}
} @RequestMapping("/ModelAttribute")
public String testModelAttribute(@ModelAttribute("users")User user){
System.out.println("update:" + user);
return "success";
}
在success页面:
可以使用如下的方法获得打印值
user:${requestScope.users}

如果不添加@ModelAttribut,在测试中代码的值为null

运行过程:
1.执行@ModelAttribute注解修饰的方法,把数据取出防砸map中,map的key为user
2.SpringMVC从Map中取出User对象,并把表单请求参数放到赋给给该user对象多的对应属性
3.SpringMVC把上述对象传入目标方法的参数
 
注意:在MOdelAttribute修饰的方法中,放入map的键需要和入参第一个字母小写的字符串一致

SpringMVC确定目标方法POJO类型入参的过程:
1.确定一个key
2.在implicitModel中查找对应的key对象,若存在,则作为入参传入
3.在implicitModel中不存在key对象,则查找当前的Handler,是都使用了@SessionAttribute对应的                value值若存在则直接传入到方法的入参中,不存在抛异常
4.若Handler没由标识的@SessionAttribute注解或者@Session Attribute的value值不包含key,则会通过        反射来创建pojo类型的参数,作为目标方法的参数
5.SpringMVC会把key和value保存到impliciModel中,进而会保存早request中
关于@SessionAttribute的异常
 
java类:
注意这里@SessionAttribute(user)和方法中的user同名
@SessionAttributes(value="user")
@Controller
@RequestMapping("/springmvc")
public class TestRequestMapping {
@RequestMapping("/ModelAttribute")
public String testModelAttribute(User user){
System.out.println("update:" + user);
return "success";
}
}
在ModelAttribute方法的user
没找到就去@SeeionAttribute中找
所以此时会报错----抛异常
解决方案:
1.写ModelAttribute注解下的方法
2.表明一个modelAttribute,在第一次查找中赋值,不在第二次找SeesionAttribute
 public String testModelAttribute(@ModelAttribute("acbc")User user){
十月 16, 2018 4:38:06 下午 org.apache.catalina.core.StandardWrapperValve invoke
严重: Servlet.service() for servlet [springDispatcherServlet] in context with path [/Spring_MVC_01] threw exception [Session attribute 'user' required - not found in session] with root cause
org.springframework.web.HttpSessionRequiredException: Session attribute 'user' required - not found in session
at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter$ServletHandlerMethodInvoker.raiseSessionRequiredException(AnnotationMethodHandlerAdapter.java:791)

  

 @ModelAttribute

在方法定义上使用 @ModelAttribute 注解:Spring MVC
在调用目标处理方法前,会先逐个调用在方法级上标注了
@ModelAttribute 的方法。
 
在方法的入参前使用 @ModelAttribute 注解:
– 可以从隐含对象中获取隐含的模型数据中获取对象,再将请求参数定到对象中,再传入入参
 – 将方法入参对象添加到模型中

由@SessionAttributes引发的异常

org.springframework.web.HttpSessionRequiredExcept:
Session attribute 'user' required - not found in session
如果在处理类定义处标注了@SessionAttributes(“xxx”),则尝试从会话中获取该属性,并将其赋给该入参,然后再用
请求消息填充该入参对象。如果在会话中找不到对应的属性,则抛出 HttpSessionRequiredException 异常

 如何避免@SessionAttributes引发的异常

spring mvc(4)处理模型数据的更多相关文章

  1. Spring MVC 之传递模型数据到视图中

    类似于 JSP-Servlet 中的 req.setAttribute . req.getSession().setAttribute ... --> 最后在 JSP 用 EL 表达式取得这些数 ...

  2. Spring MVC中的模型数据处理

    一.综述 Spring MVC 提供了以下途径来输出模型数据: 1.ModelAndView 当处理方法返回值类型为 ModelAndView时, 方法体即可通过该对象添加模型数据到请求域. 2.Ma ...

  3. Spring MVC系列之模型绑定(SpringBoot)(七)

    前言 上一节我们在SpringBoot中启用了Spring MVC最终输出了HelloWorld,本节我们来讲讲Spring MVC中的模型绑定,这个名称来源于.NET或.NET Core,不知是否恰 ...

  4. spring mvc 的jpa JpaRepository数据层 访问方式汇总

    本文转载至:http://perfy315.iteye.com/blog/1460226 AppleFramework在数据访问控制层采用了Spring Data作为这一层的解决方案,下面就对Spri ...

  5. spring mvc返回json字符串数据,只需要返回一个java bean对象就行,只要这个java bean 对象实现了序列化serializeable

    1.spring mvc返回json数据,只需要返回一个java bean对象就行,只要这个java bean 对象实现了序列化serializeable 2. @RequestMapping(val ...

  6. Spring MVC基础知识整理➣数据校验与格式化

    概述 将view中Form的数据提交到后台之后,后台如何验证数据的有效性?在这里Spring MVC提供了相应的Hibernate类包(hibernate-validator-4.3.1.Final. ...

  7. Spring mvc,jQuery和JSON数据交互

    一.实验环境的搭建 1.Spring mvc jar. 导入spring mvc运行所需jar包.导入如下(有多余) 2.json的支持jar 3.加入jQuery. 选用jquery-3.0.0.m ...

  8. spring mvc 返回xml格式数据

    1.问题 : 因为业务需要,需要发送xml格式的数据,使用spring mvc 自己解析,就不用费心去自己搞这些东西. 2.解决: 新建一个实体类,直接在实体类中添加注解即可,如下: @XmlRoot ...

  9. 1.4(Spring MVC学习笔记)JSON数据交互与RESTful支持

    一.JSON数据交互 1.1JSON简介 JSON(JavaScript Object Notation)是一种数据交换格式. 1.2JSON对象结构 {}代表一个对象,{}中写入数据信息,通常为ke ...

随机推荐

  1. Nginx配置整理

    不论是本地开发,还是远程到 Server 开发,还是给提供 demo 给人看效果,我们时常需要对 Nginx 做配置,Nginx 的配置项相当多,如果考虑性能配置起来会比较麻烦.不过,我们往往只是需要 ...

  2. Tomcat服务器使用(一)

    1. Tomcat服务器端口的配置 Tomcat服务器的配置文件主要在conf文件夹中,conf文件夹下的server.xml是配置文件的核心,默认的配置端口是8080,如果想要修改为其他的端口,可在 ...

  3. 读EntityFramework.DynamicFilters源码_心得_整体了解01

    前两天同事发给我一个连接地址:实体框架高级应用之动态过滤 EntityFramework DynamicFilters为什么会找到动态过滤的内容,是源于前段时间,我们想做一个个人blog 后端用.NE ...

  4. pyhton中list的基本操作

    list:可以按规则,按顺序,存取大量数据 1.增 append() 在列表尾部追加元素 insert() 按照列表索引添加元素 extend() 迭代添加元素,一次添加多个元素 2.删 pop() ...

  5. Tips——App启动速度的优化与监控

    一.App的启动模式 冷启动:App点击启动前,它的进程不在系统里,需要系统新创建一个进程分配给它启动的情况.这是一次完整的启动过程. 热启动:App在冷启动后用户将App退后台,在App的进程还在系 ...

  6. javascript实现文本框标签验证

    < !DOCTYPE html > <html lang = "en" > <head > <meta charset = "U ...

  7. CentOS 7运维管理笔记(2)----修改命令提示符颜色

    使用 su  命令切换到root用户: 使用 vi /etc/bashrc 命令插入如下代码: PS1="[\e[1;32m\u\e[m\e[1;33m@\e[m\e[1;35m\h\e[m ...

  8. 【Python】猜数小游戏(文件操作)

    人生苦短,我用Python 关键词 1.多用户 2.字典记录所有成绩 3.每次游戏轮数&总游戏次数&平均每次游戏需要多少轮 字典Dictionary.列表List.元组Tuple差异化 ...

  9. Android Studio修改app图标

    1.将下载好的图片放到app\src\main\res\drawable目录下 2.在AndroidManifest.xml下加入一句 android:icon="@drawable/??? ...

  10. 【转】iOS lame编译 arm64 armv7s armv7 x86_64 i386指令集

    原文出至 http://blog.csdn.net/vieri_ch/article/details/40650467 最近升级了系统到Mac OS X 10.10 并且更新了XCode6.1和iOS ...