您现在的位置是:首页 > 正文

SpringMVC中@ModelAttribute和@SessionAttributes注解的使用

2024-01-30 21:39:52阅读 0

1.@ModelAttribute注解的使用

@ModelAttribute注解在两种地方可以使用

从这里我们可以看到该注解可以用在参数上也可以用在方法体上。

现在我们就来讲解这两种方式。

方式一,该注解用在方法体上:

在方法定义上使用 @ModelAttribute 注解:Spring MVC
在调用目标处理方法前,会先逐个调用在方法级上标注了
@ModelAttribute 的方法

 @ModelAttribute("user1")
    public User getUser() {
        User user = new User();
        user.setId(1L);
        user.setName("jjjj");
        user.setPassword("iiiii");
        return user;
 
    }
 
@RequestMapping(value = "hello4", method = {RequestMethod.GET, RequestMethod.POST})
    public String doHello4(Map<String, Object> map) {
      System.out.println(map.get("user1"));
        return "success";
    }

当我们发出/hello4.do这个请求时,SpringMvc 在执行该请求前会先逐个调用在方法级上标注了
@ModelAttribute 的方法,然后将该模型参数放入doHello4()函数的Map参数中。

如上执行结果如下:

方式二,该注解用在参数上:

SpringMVC先从模型数据中获取对象,再将请求参数绑定到对象中,再传入形参,并且数据模型中的对象会被覆盖

 @RequestMapping(value = "hello7")
    public ModelAndView doHello6(
            @ModelAttribute("user1")
                    User user, ModelAndView modelAndView) {
 
  
        System.out.println(user + ":hello7");
        modelAndView.setViewName("redirect:/hello/hello4.do");
        return modelAndView;
    }
@RequestMapping(value = "hello4", method = {RequestMethod.GET, RequestMethod.POST})
    public String doHello4(Map<String, Object> map) {
 
        System.out.println(map.get("user1"));
 
        return "success";
    }
 @ModelAttribute("user1")
    public User getUser() {
        User user = new User();
        user.setId(1L);
        user.setName("jjjj");
        user.setPassword("iiiii");
        return user;
 
    }

 

测试结果如下:

发出的请求信息如下:

http://localhost:8080/SSMProjectMaven/hello/hello7.do?id=5&name=Lily

我们只传入了id和name参数,但是在测试结果中我们发现password也有值。

这说明了,SpringMVC会先在数据模型中寻找属性user1,把user1的属性赋值给user中,然后再将请求中的参数绑定到user中,如果请求参数中有的参数已经绑定到了user中,那么请求参数会覆盖掉user中已存在的值,并且user对象会被放入数据模型中覆盖掉原来的user1对象。也就是模型数据中的user1的优先级低于请求参数。

2.@SessionAttributes注解的使用

@SessionAttributes只能使用在类定义上。

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

@Controller
@RequestMapping("hello")
@SessionAttributes(value = {"user1"})
public class HelloAction {
 
 @RequestMapping(value = "hello4", method = {RequestMethod.GET, RequestMethod.POST})
    public String doHello4(Map<String, Object> map, HttpSession session) {
 
        System.out.println(map.get("user1"));
        System.out.println("session:" + session.getAttribute("user1"));
 
        return "success";
    }
@ModelAttribute("user1")
    public User getUser() {
        User user = new User();
        user.setId(1L);
        user.setName("jjjj");
        user.setPassword("iiiii");
        return user;
 
    }
 
}

SpringMVC会把数据模型中的user1对象放入session中,所以我们在doHello4()中可以在session中取到user1对象。

测试结果如下:

注意一下这种情况

@Controller
@RequestMapping("hello")
@SessionAttributes(value = {"user1", "msg"})
public class HelloAction {
 
   @RequestMapping(value = "hello7")
    public ModelAndView doHello6(
            @ModelAttribute("user1")
                    User user, ModelAndView modelAndView) {
 
        modelAndView.addObject("msg",
                user.getId() + ":" + user.getName() + ":" + user.getPassword() + ":" + user.getCars());
        System.out.println(user + ":hello7");
 
        modelAndView.setViewName("redirect:/hello/hello4.do");
        return modelAndView;
    }
 
 @RequestMapping(value = "hello4", method = {RequestMethod.GET, RequestMethod.POST})
    public String doHello4(Map<String, Object> map, HttpSession session) {
 
        System.out.println(map.get("user1"));
        System.out.println("session:" + session.getAttribute("user1"));
        System.out.println(map.get("msg"));
        System.out.println("session:" + session.getAttribute("msg"));
        return "success";
    }
 
 @ModelAttribute("user1")
    public User getUser() {
        User user = new User();
        user.setId(1L);
        user.setName("jjjj");
        user.setPassword("mmmmm");
        return user;
 
    }
 
}

测试结果如下:

这种情况表明了ModelAndView里的符合@SessionAttributes(value = {"user1", "msg"})这里面定义的value值,那么这个属性也会被放入到Session对象里。并且同时证明如果在一个方法里带有Map参数,SpringMVC不仅会把标有@ModelAttribute注解的属性放入Map中,也会把@SessionAttributes(value = {"user1", "msg"})中的属性放入Map中。注意如果通过

session.setAttribute("xxx", "kkkk");

这种方法放入到session中的属性是不会被放入到map中的。

以下这段代码的测试证明了该结论:

@Controller
@RequestMapping("hello")
@SessionAttributes(value = {"user1", "msg"})
public class HelloAction {
   @RequestMapping(value = "hello4", method = {RequestMethod.GET, RequestMethod.POST})
    public String doHello4(Map<String, Object> map, HttpSession session) {
 
        System.out.println(map.get("user1"));
        System.out.println("session:" + session.getAttribute("user1"));
        System.out.println(map.get("msg"));
        System.out.println("session:" + session.getAttribute("msg"));
        System.out.println("map:" + map.get("xxx"));
        System.out.println("session:" + session.getAttribute("xxx"));
        return "success";
    }
 
 @RequestMapping(value = "hello7")
    public ModelAndView doHello6(
            @ModelAttribute("user1")
                    User user, ModelAndView modelAndView, HttpSession session) {
 
        session.setAttribute("xxx", "kkkk");
 
        modelAndView.addObject("msg",
                user.getId() + ":" + user.getName() + ":" + user.getPassword() + ":" + user.getCars());
        System.out.println(user + ":hello7");
        modelAndView.setViewName("redirect:/hello/hello4.do");
        return modelAndView;
    }
 @ModelAttribute("user1")
    public User getUser() {
        User user = new User();
        user.setId(1L);
        user.setName("jjjj");
        user.setPassword("mmmmm");
        return user;
 
    }
}

测试结果如下:

我们可以看到从map里取不出"xxx"的值,而从session里我们取出了“xxx”的值。

但是当我们在

@SessionAttributes(value = {"user1", "msg", "xxx"})

这里添加上“xxx”这个值,再执行上述代码可以看到map中取出了"xxx"的值。

 

 

 

网站文章

  • linux基础命令-rm 最新发布

    在 Linux 操作系统中,rm 是一个强大的命令,用于删除文件和目录。它允许用户在文件系统中进行清理和维护操作,但同时也需要谨慎使用,因为删除的文件和目录不可恢复。在使用 rm 命令时,请注意核实您...

    2024-01-30 21:39:44
  • c++语言将字符串逆序输出,C++实现string类字符串单词的逆序输出

    c++语言将字符串逆序输出,C++实现string类字符串单词的逆序输出

    利用c++实现string类字符串单词的逆序输出,并改变源字符串的大小写。#include#include#includeusing namespace std;string StringReverseWord(string &s){int len = s.length();if (len == 0)//空字符串return s;int n = 0;while (s[n++] == ' '...

    2024-01-30 21:39:14
  • jep290涉及jdk版本_JDK 12 – JEP 325开关表达式

    jep290涉及jdk版本 JDK 12已于2019年3月19 日上线GA,继续致力于缩短发布周期和频繁发布。 该版本的功能部分可以在这里找到。 对于开发人员来说,有趣的功能之一是“ JEP 325开关表达式 ”,它可以作为预览功能使用。 此处定义的预览功能是: 预览语言或VM功能是Java SE平台的一项新功能,该功能已完全指定,完全实现但不是永久性的。 JDK功能发布中提供了该功能...

    2024-01-30 21:39:07
  • React 知识点整理

    React 知识点整理

    React 知识点整理

    2024-01-30 21:39:00
  • 通俗易懂设计模式解析——抽象工厂模式

    通俗易懂设计模式解析——抽象工厂模式

    前言  前面介绍了单例模式及工厂模式相关知识及示例,今天主要介绍的是抽象工厂模式,上一篇我们讲了工厂模式。将创建对象的任务委托给子类,延迟创建。解决工厂中责任的划分。实现具体工厂与产品之间的一一对应。解决的是”单个对象”的问题。  华为工厂除了生产华为手机之外。肯定也会有原件配套的充电线和耳机。这时工厂对应的是一套产品该如何解决了呢?显然不再适合使用工厂模式了。今天将的抽象工厂模...

    2024-01-30 21:38:25
  • python调用程序call_Python下的subprocess.call()使用和注意事项

    Python虽然有许多优秀的第三方库,但在实际使用的时候免不了使用一些cmd调用的程序,毕竟这类程序比较底层,更快、也更稳定。比如GDAL、FFmpeg、 ImageMagick等。利用Python调...

    2024-01-30 21:38:18
  • 详解TCP/IP协议栈

    详解TCP/IP协议栈

    之前对网络各层作用的了解一直都比较模糊,对各个协议的作用也不甚清楚,最近看到了一篇对TCP/IP协议栈讲解比较清晰的博文,特地转载过来。什么是TCP/IP协议栈TCP/IP 协议栈是一系列网络协议的总...

    2024-01-30 21:37:44
  • SpringBoot devtools热部署

    SpringBoot devtools热部署

    一、pom.xml添加依赖二、修改idea默认配置三、测试是否生效一、pom.xml添加依赖&lt;dependencies&gt; &lt;!-- 基础组件--&gt; &lt;dependency&gt; &lt;groupId&gt;org.springframework.boot&lt;/groupId...

    2024-01-30 21:37:38
  • 实验四

    PC端配置:配置ip地址、网关。交换机配置:system-viewvlan 30vlan 40quitinterface gi 1/0/1port link-type accessport access vlan 30interface gi 1/0/2port link-type accessport access vlan 40quitint...

    2024-01-30 21:37:32
  • 《嵌入式虚拟化技术与应用》:深入浅出阐述嵌入式虚拟机原理,实现“小而能”嵌入式虚拟机!

    《嵌入式虚拟化技术与应用》:深入浅出阐述嵌入式虚拟机原理,实现“小而能”嵌入式虚拟机!

    本书首先介绍虚拟化技术的基本原理,以及KVM在云服务器上实现。然后围绕虚拟化技术的核心内容,从CPU虚拟化、内存虚拟化、中断虚拟化和设备虚拟化这四个方面,重点介绍了开源嵌入式虚拟机ACRN的架构、原理...

    2024-01-30 21:37:04