目录
一、简单的使用ModelAndView来向页面传递参数
三、使用@SessionAttributes注解,把值放到session域中
3.2 例2
Spring MVC 提供了以下几种途径输出模型数据
- ModelAndView:处理方法返回值类型为 ModelAndView 时, 方法体即可通过该对象添加模型数据
- Map 及Model:入参为org.springframework.ui.Model、org.springframework.ui.ModelMap 或 java.uti.Map 时,处理方法返回时,Map 中的数据会自动添加到模型中。
- @SessionAttributes:将模型中的某个属性暂存到HttpSession 中,以便多个请求之间可以共享这个属性
- @ModelAttribute::方法入参标注该注解后, 入参的– 对象就会放到数据模型中
一、简单的使用ModelAndView来向页面传递参数
实际开发中,总要大量的向页面中传递后台的数据,那么存放数据的方法也有多种多样,比如说存到request中,大家都知道是使用request.setAtrribute()来向request域中传递值,但是实际上springMVC给我们封装了更好的方法,那就是使用ModelAndView。
- 控制器处理方法的返回值如果为ModelAndView, 则其既包含视图信息,也包含模型数据信息。
- 添加模型数据:
MoelAndView addObject(String attributeName, Object attributeValue) ModelAndView addAllObject(Map<String, ?> modelMap)
- 设置视图:
void setView(View view) void setViewName(String viewName)
在src/main/java/com.hualinux.srpingmvc.handers/SpringMVCTest.java,添加如下代码:
注:ModelAndView 引用的是:
import org.springframework.web.servlet.ModelAndView;
打开web/index.jsp,在其页面的<body></body>标签中添加如下代码:
/WEB-INF/view/ok.jsp,添加EL表达式代码如下:
运行tomcat,idea会自动打开主页点,下面链接
二、使用参数Map来向页面传值
可以在执行方法中定义一个Map参数,然后在方法中,向map添加内容,然后在页面中根据map的键来取对应的值,也是存在request域中
在src/main/java/com.hualinux.srpingmvc.handers/SpringMVCTest.java,添加如下代码:
打开web/index.jsp,在其页面的<body></body>标签中添加如下代码:
web/WEB-INF/view/ok.jsp修改为:
运行tomcat,idea会自动打开主页点,下面链接
三、使用@SessionAttributes注解,把值放到session域中
上面2点所诉的内容,虽然是把后台数据传递到前台,但是全部都是放置到request域中,这里讲一下使用@SessionAtrributes注解,把后台数据同时放到session中。
首先介绍一下这个注解,这个注解只能放在类上面,而不能放在方法上面。它有两个属性,一个是value属性,一个是types属性,这两个数据都是数组,所以可以声明多个,其实不论是value属性,还是types属性,都可以把数据同时放到session域中,只不过value属性对应的是执行方法中的map集合的键,只要是对应的键,那么其值,也会同时被传递到session域中(这里之所以加上“同时”这个词,是因为它会同时存到request与session中),而types属性,则是放置类的集合,只要map集合中存的是该类的数据,则也会同时被放到request中
若希望在多个请求之间共用某个模型属性数据,则可以在 控制器类上标注一个 @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})
3.1 例1
在src/main/java/com.hualinux.springmvc.entities/User.java,添加如下代码:
在src/main/java/com.hualinux.srpingmvc.handers/SpringMVCTest.java,添加如下代码:
在web/WEB-INF/view/ok.jsp,添加如下代码
打开web/index.jsp,在其页面的<body></body>标签中添加如下代码:
运行tomcat,idea会自动打开主页点,下面链接
在SpringMVCTest类顶部添加 @SessionAttributes({"user"})注解,再次运行
注意:使用了value属性后,这个属性也就必须存在,意思就是说,必须有一个map,然后有一个user的键,不然会报错,当然,这个是可以解决的,后面会详细讲到。
3.2 例2
@SessionAttributes({"user"})加多一个types属性,其它不变
SpringMVCTest.java的map添加多一个put
ok.jsp添加两个
运行结果为:
四、@SessionAtrribute引发的异常
上面说到使用@SessionAtrribute来修饰一个类,就可以把一些值存放到session域中,但是如果找不到对应的值,就会报异常,这里可以用@ModelAtrribute来进行修饰,对它改名就可以了
在src/main/java/com.hualinux.srpingmvc.handers/SpringMVCTest.java,添加如下代码:
打开web/index.jsp,在其页面的<body></body>标签中添加如下代码:
运行tomcat,idea会自动打开主页点,下面链接
看一下idea最下方日志输出为:
修改:User{username='null', password='null', email='null', age=0, address=null}
本章测试完之后把ok.jsp其它数据删除,恢复原来的
把SpringMVCTest.java类顶部添加的注解去掉