首页 > 其他分享 >spring mvc中modelattribute和sessionatrribute

spring mvc中modelattribute和sessionatrribute

时间:2022-12-08 14:06:28浏览次数:33  
标签:modelattribute spring intValue public sessionatrribute session ModelAttribute He


摘自http://tengj.top/2016/05/02/springmvcyuanli/
SpringMVC 支持使用 @ModelAttribute 和 @SessionAttributes 在不同的模型和控制器之间共享数据。 @ModelAttribute 主要有两种使用方式,一种是标注在方法上,一种是标注在 Controller 方法参数上。
当 @ModelAttribute 标记在方法上的时候,该方法将在处理器方法执行之前执行,然后把返回的对象存放在 session 或模型属性中,属性名称可以使用 @ModelAttribute(“attributeName”) 在标记方法的时候指定,若未指定,则使用返回类型的类名称(首字母小写)作为属性名称。关于 @ModelAttribute 标记在方法上时对应的属性是存放在 session 中还是存放在模型中,我们来做一个实验,看下面一段代码。


@Controller

@RequestMapping ( "/myTest" )

public class MyController {


@ModelAttribute ( "hello" )

public String getModel() {

System. out .println( "-------------Hello---------" );

return "world" ;

}


@ModelAttribute ( "intValue" )

public int getInteger() {

System. out .println( "-------------intValue---------------" );

return 10;

}


@RequestMapping ( "sayHello" )

public void sayHello( @ModelAttribute ( "hello" ) String hello, @ModelAttribute ( "intValue" ) int num, @ModelAttribute ( "user2" ) User user, Writer writer, HttpSession session) throws IOException {

writer.write( "Hello " + hello + " , Hello " + user.getUsername() + num);

writer.write( "\r" );

Enumeration enume = session.getAttributeNames();

while (enume.hasMoreElements())

writer.write(enume.nextElement() + "\r" );

}


@ModelAttribute ( "user2" )

public User getUser() {

System. out .println( "---------getUser-------------" );

return new User(3, "user2" );

}

}


当我们请求 /myTest/sayHello.do 的时候使用 @ModelAttribute 标记的方法会先执行,然后把它们返回的对象存放到模型中。最终访问到 sayHello 方法的时候,使用 @ModelAttribute 标记的方法参数都能被正确的注入值。执行结果如下所示:
1
Hello world,Hello user210
由执行结果我们可以看出来,此时 session 中没有包含任何属性,也就是说上面的那些对象都是存放在模型属性中,而不是存放在 session 属性中。那要如何才能存放在 session 属性中呢?这个时候我们先引入一个新的概念 @SessionAttributes ,它的用法会在讲完 @ModelAttribute 之后介绍,这里我们就先拿来用一下。我们在 MyController 类上加上 @SessionAttributes 属性标记哪些是需要存放到 session 中的。看下面的代码:

@Controller

@RequestMapping ( "/myTest" )

@SessionAttributes (value={ "intValue" , "stringValue" }, types={User. class })

public class MyController {


@ModelAttribute ( "hello" )

public String getModel() {

System. out .println( "-------------Hello---------" );

return "world" ;

}


@ModelAttribute ( "intValue" )

public int getInteger() {

System. out .println( "-------------intValue---------------" );

return 10;

}


@RequestMapping ( "sayHello" )

public void sayHello(Map<String, Object> map, @ModelAttribute ( "hello" ) String hello, @ModelAttribute ( "intValue" ) int num, @ModelAttribute ( "user2" ) User user, Writer writer, HttpServletRequest request) throws IOException {

map.put( "stringValue" , "String" );

writer.write( "Hello " + hello + " , Hello " + user.getUsername() + num);

writer.write( "\r" );

HttpSession session = request.getSession();

Enumeration enume = session.getAttributeNames();

while (enume.hasMoreElements())

writer.write(enume.nextElement() + "\r" );

System. out .println(session);

}


@ModelAttribute ( "user2" )

public User getUser() {

System. out .println( "---------getUser-------------" );

return new User(3, "user2" );

}

}


在上面代码中我们指定了属性为 intValue 或 stringValue 或者类型为 User 的都会放到 Session中,利用上面的代码当我们访问 /myTest/sayHello.do 的时候,结果如下:
1
Hello world,Hello user210
仍然没有打印出任何 session 属性,这是怎么回事呢?怎么定义了把模型中属性名为 intValue 的对象和类型为 User 的对象存到 session 中,而实际上没有加进去呢?难道我们错啦?我们当然没有错,只是在第一次访问 /myTest/sayHello.do 的时候 @SessionAttributes 定义了需要存放到 session 中的属性,而且这个模型中也有对应的属性,但是这个时候还没有加到 session 中,所以 session 中不会有任何属性,等处理器方法执行完成后 Spring 才会把模型中对应的属性添加到 session 中。所以当请求第二次的时候就会出现如下结果:

Hello world,Hello user210
user2
intValue
stringValue
当 @ModelAttribute 标记在处理器方法参数上的时候,表示该参数的值将从模型或者 Session 中取对应名称的属性值,该名称可以通过 @ModelAttribute(“attributeName”) 来指定,若未指定,则使用参数类型的类名称(首字母小写)作为属性名称。

标签:modelattribute,spring,intValue,public,sessionatrribute,session,ModelAttribute,He
From: https://blog.51cto.com/u_14230175/5921060

相关文章

  • spring batch不错的教程
    springbatch不错的资料教程中文:​​​http://www.ibm.com/developerworks/cn/java/j-lo-springbatch1/​​​http://www.ibm.com/developerworks/......
  • SpringCloud组件入门使用
    SpringCloud1、远程调用1.1、微服务远程调用RestTemlpate1.2、微服务远程调用-Feign 2、Eureka注册中心2.1、Eureka注册中心搭建及入门使用2.2、Ribbon负载均......
  • Spring如何处理循环依赖问题
    Spring如何处理循环依赖问题什么是循环依赖:就是多个bean之间相互依赖,形成了一个闭环,比如beanA需要引用BeanB,BeanB需要引用BeanA,形成循环关系。一般默认在单例模式中,属性......
  • JAX-RS之resteasy跟spring整合
    其实,在JAX-RS标准下,jboss的resteasy跟spring结合的话,无非是如何去取得spring中的bean而已.两个方法,例子如下1比如有个接口和实现类J......
  • Spring Cloud之统一配置中心Config配置手工刷新
    实际上,配置文件也是随着应用场景变化的,如果服务已经启动并在使用过程中时需要修改其中某些配置,微服务可以直接识别并使用么?下面以SpringCloud之统一配置中心Config初......
  • flex3+blazeds+spring+hibernate整合小结
       近来flex盛行,因此这两天也借了本书看了两天,发觉作为非页面设计人员,flex还是很好的,flexbuilder很好用,拖拉就有很COOL的界面了,而且flex总的来说基本东西不难学,有编程基础......
  • 解析Spring中的ResponseBody和RequestBody
    ​​https://www.cnkirito.moe/2017/08/30/%E8%A7%A3%E6%9E%90Spring%E4%B8%AD%E7%9A%84ResponseBody%E5%92%8CRequestBody/​​​spring,restful,前后......
  • spring security 4.1两个不错功能介绍
    一转眼,springsecurity已经发布4.1了,查看了下新特性,有两个比较值得关注:1)可以在pathvariable形式的URL中进行保护了 比如有个方法:[code=......
  • java springboot 大文件分片上传处理
    ​  1 背景用户本地有一份txt或者csv文件,无论是从业务数据库导出、还是其他途径获取,当需要使用蚂蚁的大数据分析工具进行数据加工、挖掘和共创应用的时候,首先要将本地......
  • Spring 集成提供的各种通道适配器和消息传递网关
    本节介绍Spring集成提供的各种通道适配器和消息传递网关,以支持与外部系统的基于消息的通信。每个系统,从AMQP到Zookeeper,都有自己的集成要求,本节将介绍它们。端点快速参考......