`
a_bun
  • 浏览: 20353 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

ModelMap

 
阅读更多

绑定模型对象中某个属性

Spring 2.0 定义了一个 org.springframework.ui.ModelMap 类,它作为通用的模型数据承载对象,传递数据供视图所用。我们可以在请求处理方法中声明一个 ModelMap 类型的入参,Spring 会将本次请求模型对象引用通过该入参传递进来,这样就可以在请求处理方法内部访问模型对象了。来看下面的例子:

清单 9. 使用 ModelMap 访问请示对应的隐含模型对象

  1. @RequestMapping( params = "method=listBoardTopic" )
  2.  public String listBoardTopic( @ RequestParam( "id" ) int topicId,
  3.  User user, ModelMap model) {
  4.      bbtForumService. getBoardTopics( topicId) ;
  5.      System . out. println ( "topicId:" + topicId) ;
  6.      System . out. println ( "user:" + user) ;
  7.      //① 将user对象以currUser为键放入到model中
  8.      model. addAttribute ( "currUser" , user) ;
  9.      return "listTopic" ;
  10.  }


对于当次请求所对应的模型对象来说,其所有属性都将存放到 request 的属性列表中。象上面的例子,ModelMap 中的 currUser 属性将放到 request 的属性列表中,所以可以在 JSP 视图页面中通过 request.getAttribute(“currUser”) 或者通过 ${currUser} EL 表达式访问模型对象中的 user 对象。从这个角度上看, ModelMap 相当于是一个向 request 属性列表中添加对象的一条管道,借由 ModelMap 对象的支持,我们可以在一个不依赖 Servlet API 的 Controller 中向 request 中添加属性。

在默认情况下,ModelMap 中的属性作用域是 request 级别是,也就是说,当本次请求结束后,ModelMap 中的属性将销毁。如果希望在多个请求中共享 ModelMap 中的属性,必须将其属性转存到 session 中,这样 ModelMap 的属性才可以被跨请求访问。

Spring 允许我们有选择地指定 ModelMap 中的哪些属性需要转存到 session 中,以便下一个请求属对应的 ModelMap 的属性列表中还能访问到这些属性。这一功能是通过类定义处标注 @SessionAttributes 注解来实现的。请看下面的代码:


清单 10. 使模型对象的特定属性具有 Session 范围的作用域

  1. package com. baobaotao. web;


  2. import org . springframework. ui. ModelMap;
  3. import org . springframework. web. bind . annotation . SessionAttributes;

  4. @Controller
  5. @RequestMapping( "/bbtForum.do" )
  6. @SessionAttributes( "currUser" ) //①将ModelMap中属性名为currUser的属性
  7. //放到Session属性列表中,以便这个属性可以跨请求访问
  8. public class BbtForumController {

  9.     @RequestMapping( params = "method=listBoardTopic" )
  10.     public String listBoardTopic( @ RequestParam( "id" ) int topicId, User user,
  11. ModelMap model) {
  12.         bbtForumService. getBoardTopics( topicId) ;
  13.         System . out. println ( "topicId:" + topicId) ;
  14.         System . out. println ( "user:" + user) ;
  15.         model. addAttribute ( "currUser" , user) ; //②向ModelMap中添加一个属性
  16.         return "listTopic" ;
  17.     }

  18. }


我们在 ② 处添加了一个 ModelMap 属性,其属性名为 currUser,而 ① 处通过 @SessionAttributes 注解将 ModelMap 中名为 currUser 的属性放置到 Session 中,所以我们不但可以在 listBoardTopic() 请求所对应的 JSP 视图页面中通过 request.getAttribute(“currUser”) 和 session.getAttribute(“currUser”) 获取 user 对象,还可以在下一个请求所对应的 JSP 视图页面中通过 session.getAttribute(“currUser”) 或 ModelMap#get(“currUser”) 访问到这个属性。

这里我们仅将一个 ModelMap 的属性放入 Session 中,其实 @SessionAttributes 允许指定多个属性。你可以通过字符串数组的方式指定多个属性,如 @SessionAttributes({“attr1”,”attr2”})。此外,@SessionAttributes 还可以通过属性类型指定要 session 化的 ModelMap 属性,如 @SessionAttributes(types = User.class),当然也可以指定多个类,如 @SessionAttributes(types = {User.class,Dept.class}),还可以联合使用属性名和属性类型指定:@SessionAttributes(types = {User.class,Dept.class},value={“attr1”,”attr2”})。

上面讲述了如何往ModelMap中放置属性以及如何使ModelMap中的属性拥有Session域的作用范围。除了在 JSP视图页面中通过传统的方法访问ModelMap中的属性外,读者朋友可能会问:是否可以将ModelMap中的属性绑定到请求处理方法的入参中呢? 答案是肯定的。Spring为此提供了一个@ModelAttribute的注解,下面是使用@ModelAttribute注解的例子:

清单 11. 使模型对象的特定属性具有 Session 范围的作用域

  1. package com. baobaotao. web;

  2. import com. baobaotao. service. BbtForumService;
  3. import org . springframework. beans . factory. annotation . Autowired;
  4. import org . springframework. stereotype. Controller;
  5. import org . springframework. ui. ModelMap;
  6. import org . springframework. web. bind . annotation . RequestMapping;
  7. import org . springframework. web. bind . annotation . RequestParam;
  8. import org . springframework. web. bind . annotation . SessionAttributes;
  9. import org . springframework. web. bind . annotation . ModelAttribute;

  10. import javax . servlet. http. HttpServletRequest;
  11. import javax . servlet. http. HttpSession;

  12. @Controller
  13. @RequestMapping( "/bbtForum.do" )
  14. @SessionAttributes( "currUser" ) //①让ModelMap的currUser属性拥有session级作用域
  15. public class BbtForumController {

  16.     @Autowired
  17. private BbtForumService bbtForumService;

  18.     @RequestMapping( params = "method=listBoardTopic" )
  19.     public String listBoardTopic( @ RequestParam( "id" ) int topicId, User user,
  20. ModelMap model) {
  21.         bbtForumService. getBoardTopics( topicId) ;
  22.         System . out. println ( "topicId:" + topicId) ;
  23.         System . out. println ( "user:" + user) ;
  24.         model. addAttribute ( "currUser" , user) ; //②向ModelMap中添加一个属性
  25.         return "listTopic" ;
  26.     }


  27.     @RequestMapping( params = "method=listAllBoard" )
  28.    //③将ModelMap中的
  29. public String listAllBoard( @ ModelAttribute( "currUser" ) User user) {
  30. //currUser属性绑定到user入参中。
  31.         bbtForumService. getAllBoard( ) ;
  32.         System . out. println ( "user:" + user) ;
  33.         return "listBoard" ;
  34.     }
  35. }

在 ② 处,我们向 ModelMap 中添加一个名为 currUser 的属性,而 ① 外的注解使这个 currUser 属性拥有了 session 级的作用域。所以,我们可以在 ③ 处通过 @ModelAttribute 注解将 ModelMap 中的 currUser 属性绑定以请求处理方法的 user 入参中。

所以当我们先调用以下 URL 请求: http://localhost/bbtForum.do?method=listBoardTopic&id=1&userName=tom&dept.deptId=12

以执行listBoardTopic()请求处理方法,然后再访问以下URL: http://localhost/sample/bbtForum.do?method=listAllBoard

你将可以看到 listAllBoard() 的 user 入参已经成功绑定到 listBoardTopic() 中注册的 session 级的 currUser 属性上了。





分享到:
评论
1 楼 mengfei86 2011-12-13  
 

相关推荐

    jsp 显示springmvc modelmap传递的对象详细介绍.docx

    ### jsp 显示 springmvc ModelMap 传递的对象详细介绍 #### 概述 本文档主要针对在使用 Spring MVC 开发Web应用程序时,如何有效地利用 JSP 和 ModelMap 在前端展示从后端控制器传递过来的数据进行详细讲解。特别是...

    jsp 显示springmvc modelmap传递的对象详细介绍

    `ModelMap`是Spring提供的一种模型绑定容器,它可以用来存放各种类型的数据,并且可以在请求转发或者重定向中保持这些数据。在这个问题中,我们将详细讨论如何在JSP页面上显示`ModelMap`传递的对象,尤其是列表对象...

    SpringMVC之Model接口

    ModelMap 对象主要用于传递控制方法处理数据到结果页面,也就是说我们把结果页面需要的数据放到 ModelMap 对象中即可。其作用类似于 request 对象的 setAttribute 方法的作用:用来在一个请求过程中传递处理的数据。...

    Spring MVC面试题(2022最新版)

    这两个对象都实现了`ModelMap`接口,可以在控制器方法中通过参数注入。 ```java public String handleRequest(Model model) throws Exception { model.addAttribute("message", "Hello, World!"); return "view...

    spring mvc

    - `Model`接口的实现类`ExtendedModelMap`实际上是`ModelMap`,它继承自`ModelMap`。你可以通过`ModelMap`直接添加模型数据,这些数据会被自动添加到请求作用域。在JSP中,你可以直接通过 `${key}` 获取`ModelMap`...

    2freemarker基本数据交互1

    在实际开发中,`ModelMap`和`HttpServletRequest`都可以作为数据载体,但`ModelMap`通常更方便,因为它提供了自动类型转换和一些便利的方法。`HttpServletRequest`则更适合处理请求参数。 为了调试和测试,你可以...

    Spring mvc如何实现数据处理

    在 Spring MVC 中,数据显示可以通过多种方式实现,包括使用 ModelAndView、ModelMap、Model 等。 1. 通过 ModelAndView 使用 ModelAndView 可以将数据显示到前端,例如: ```java public class ControllerTest1 ...

    springboot jpa mysql controller演示

    public String jpaTest(ModelMap modelMap){ userRepository.save(new User("python","123456","xxxxx@126.com")); List<User> users = userRepository.findAll(); modelMap.put("users", users); return ...

    Spring-MVC-model

    2. **ModelMap 和 Model**:在实际开发中,我们通常使用 `ModelMap` 或 `Model` 接口来管理 Model 对象。`ModelMap` 是一个实现了 `Model` 接口的 Map 类,可以方便地添加和检索 Key-Value 对。例如,在 Controller ...

    0622处理模型数据.zip

    2. **模型映射(ModelMap)**:在Controller方法中,我们经常使用`ModelMap`或`Model`来存储和传递模型数据。`ModelMap`扩展了`Model`接口,提供了一种方便的方式来添加和管理模型属性。例如,我们可以在处理请求的...

    springmvc-demo07-响应(数据共享,页面跳转).zip

    - **ModelMap接口**:与ModelAndView类似,ModelMap也用于存储模型数据。它可以直接作为控制器方法的返回值: ```java @RequestMapping("/shareData") public String shareData(ModelMap modelMap) { modelMap....

    model的数据绑定给控件

    在制作b/s系统时,每次编辑时都要重新给控件赋值,都是做重复工作。现在利用反射来让model实体自动赋值给控件。

    SpringMVC修改配置文件路径+给界面传递数据

    在控制器方法中,你可以创建一个`ModelMap`对象,然后添加键值对,最后通过`return "viewName"`返回视图名,SpringMVC会自动将模型数据注入到JSP中: ```java @RequestMapping("/test") public String test...

    SpringMVC界面跳转及参数传递.docx

    `Model`和`ModelMap`的主要区别在于`ModelMap`继承了`Map`,因此可以方便地添加多个模型对象。 4. **Session作用域**:当需要在多个请求之间共享数据时,可以将数据存储在`HttpSession`中。可以通过`request....

    springMVC往jsp页面传数据

    public String example(ModelMap modelMap) { modelMap.addAttribute("msg", "Hello from SpringMVC!"); return "viewName"; } ``` 3. **RequestContextHolder:** - 可以通过`RequestContextHolder`获取当前...

    springmvc 4.1

    `Model`和`ModelMap`是Spring MVC中用来将数据绑定到模型的接口,它们可以将处理结果添加到模型中,以便在视图中使用。`ModelMap`是`Model`的一个实现,提供了更灵活的API来操作模型数据。 5. **路径映射(Path ...

    spring_MVC源码

    弃用了struts,用spring mvc框架做了几个项目,感觉都不错,而且使用了注解方式,可以省掉一大堆配置文件。本文主要介绍使用注解方式配置的spring mvc,之前写的spring3.0 mvc和rest小例子没有介绍到数据层的内容,...

    springmvc 2.zip

    5. **Model 和 ModelMap**:在处理请求时,控制器可以使用 Model 或 ModelMap 将数据绑定到视图,这些数据可以在视图层中使用。 6. **视图解析器**:Spring MVC 使用视图解析器(如 InternalResourceViewResolver)...

    我的实习报告

    在Controller层,我掌握了Controller和RequestMapping的使用,学会了如何使用ModelMap进行数据传输。在Service层,我理解了Service接口的抽取和@Autowired注解的应用。在View层,我学会了使用EL表达式${}读取...

Global site tag (gtag.js) - Google Analytics