maven与springMVC之ModelAttribute、SessionAttributes

这篇文章我们继续来研究springMVC的controller。

在springMvc中提供了两个标签,@ModelAttribute和@SessionAttributes,有了这两个标签可以让代码模块化更加方便。先上代码:

@Controller
@RequestMapping("testAttr")
@SessionAttributes (value={ "user","time"}, types={User. class })
public class AttributeController {

	@ModelAttribute("time")
	public String getTime() {
		SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		Date date=new Date();
		String result = sdf.format(date);
		System.out.println("getTime-------->"+result);
		return result;
	}

	@ModelAttribute("timeLong")
	public long getTimeLong() {
		SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		Date date=new Date();
		System.out.println("getTimeLong-------->"+date.getTime());
		return date.getTime();
	}

	@RequestMapping("testUser")
	public void getUser(Map<String, Object> map, Writer writer) throws IOException {
		Date date=new Date();
		User user=new User();
		user.setName("name"+date.getTime());
		System.out.println("getUser-------->"+user.getName());
		map.put("user", user);

		writer.write("\nUser is : " + user.getName() );
	}

	@RequestMapping("testAttribute")
	public void testAttribute(@ModelAttribute("time") String time,@ModelAttribute("timeLong") long timeLong,
			@ModelAttribute("user") User user,Writer writer,
			HttpSession session)   {
		try {
			 writer.write("\nTime is : " + time  );
			 writer.write("\nTimeLong is : " + timeLong  );
			 writer.write("\nUser is : " + user.getName()  );

			 User userSession=(User) session.getAttribute("user");
			 writer.write("\nsessionTime:"+session.getAttribute("time"));
			 writer.write("\nsessionTimeLong:"+session.getAttribute("timeLong"));
			 writer.write("\nsessionUser:"+userSession);
			 if(userSession!=null){
				 writer.write("\nsessionUserName:"+userSession.getName());
			 }
		} catch (IOException e) {
			e.printStackTrace();
		}

	}

}

看一下效果吧。

首先,直接请求http://127.0.0.1:8080/test_web/testAttr/testAttribute,会发现报错了。错误内容如下:

org.springframework.web.HttpSessionRequiredException: Expected session attribute 'user'
	org.springframework.web.method.annotation.ModelFactory.initModel(ModelFactory.java:103)
	org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:726)
	org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:689)
	org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:83)
	org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:938)
	org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:870)
	org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:961)
	org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:852)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:624)
	org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:837)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:731)
	org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)

为什么呢?

我们看到代码中@SessionAttributes指定了在session中用到的两个参数:"user"、"time",但是为什么会报错呢?如果把testAttribute方法的user参数去掉就不会报错,这是因为,getTime()方法被@ModelAttribute("time")标记为模型,并且testAttribute的参数是@ModelAttribute标记的,这样的话testAttribute首先会去调用getTime()方法,并且把返回值time传入到testAttribute中,getTimeLong()同理。另外time时被SessionAttributes标记的,所以它的值会被存到session中,而“timeLong”则不会。但是加上@ModelAttribute("user")
String user之后就会报错,是因为user还没有被添加。

然后,我们先请求http://127.0.0.1:8080/test_web/testAttr/testUser,然后再请求http://127.0.0.1:8080/test_web/testAttr/testAttribute,这样就不会报错,效果如下图所示:

我们发现testAttribute方法的所欲参数都是有值的,session中没有找到timeLong参数。另外需要补充的是像Writer writer这样会自动赋值的数据类型还有HttpServletRequest、HttpServletResponse、HttpSession、InputStream、OutputStream、Reader、Writer、Model、ModelMap、MultipartFile、Errors、BindingResult 等。

到此我们需要注意的是,如果我们刷新testAttribute,页面上除了TimeLong is那一行会刷新之外,其他数据是没有改变的,因为其他数据都是优先从session中获取的。如果我们再次请求testUser,然后在刷新testAttribute,会发现User相关的数据是改变了,如下图:

我们看一下后台打印,会更加清楚:

getTime-------->2015-08-28 19:16:05
getTimeLong-------->1440760565867
getUser-------->name1440760565875
getTimeLong-------->1440760570465
getTimeLong-------->1440760638091
getTimeLong-------->1440760639985
getTimeLong-------->1440760640793
getTimeLong-------->1440760641320
getTimeLong-------->1440760641872
getTimeLong-------->1440760642536
getTimeLong-------->1440760648097
getTimeLong-------->1440760648592
getTimeLong-------->1440760649072
getTimeLong-------->1440760649512
getTimeLong-------->1440760650024
getTimeLong-------->1440760650376
getTimeLong-------->1440760650720
getTimeLong-------->1440760650952
getTimeLong-------->1440760651167
getTimeLong-------->1440760651391
getTimeLong-------->1440760651656
getTimeLong-------->1440760711522
getUser-------->name1440760711523
getTimeLong-------->1440760716985
getTimeLong-------->1440760745147
getTimeLong-------->1440760937057

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-11 06:03:51

maven与springMVC之ModelAttribute、SessionAttributes的相关文章

基于Maven搭建SpringMVC+Mybatis项目(4)

从高考,到程序员      CSDN日报20170620--<找一个好工作,谈一份好薪水>      6 月书讯 | 最受欢迎的 SQL 入门书重磅升级 从头开始基于Maven搭建SpringMVC+Mybatis项目(4) 标签:               mavenmybatisspring mvc分页JAVA 2016-07-27 16:53             4598人阅读             评论(0)             收藏              举报 本文章

基于Maven搭建SpringMVC+Mybatis项目(3)

| 从高考,到程序员      CSDN日报20170620--<找一个好工作,谈一份好薪水>      6 月书讯 | 最受欢迎的 SQL 入门书重磅升级 从头开始基于Maven搭建SpringMVC+Mybatis项目(3) 标签:               JAVAmavenspring mvcmybatis 2016-07-26 10:06             42087人阅读             评论(2)             收藏              举报 本文

使用Maven搭建SpringMVC

1.新建Maven项目,选择webapp,如下图,点击next,输入GroupId和ArtifactId(即项目名称)后点击Finish. 2.此时项目会报错,如下: 右击项目,点击最下面的Properties,更给其中左侧的Java Build Path中的JRE System Library为安装的JRE,同时更改Java Compile,还需要更改Project Facets中的java版本.如果需要也可以更改Dynamic Web Module的版本,不过这个需要到项目所在的路径下的.s

使用Eclipse构建Maven的SpringMVC项目

使用Eclipse构建Maven的SpringMVC项目 ? 用maven的好处: 1 最主要就是自动下载jar包和它所依赖的包, 2保证多人开发时jar版本不同的问题 3 文件结构清晰,java文件,资源文件,测试文件都分的很清楚. 将介绍两种方法:一,直接建立Maven项目方法:二.建立Dynamic Web project转成Maven项目方法. ?? ? ? ?将介绍两种方法:一,直接建立Maven项目方法:二.建立Dynamic Web project转成Maven项目方法. 一.直接

用Maven整合SpringMVC+Spring+Hibernate 框架,实现简单的插入数据库数据功能(二)

前一篇写的有些多,大家先看前一篇,传送门 具体的资源已将上传到资源了. 附地址:MySQL.zip启动 用Maven整合SpringMVC+Spring+Hibernate 框架 上文我们直接搭建前的准备和资源配置都写好了,下面进入具体代码编写.承接上文的小3 3.我习惯建立接口,这样对整个项目感觉更合理. (1.)建立IBaseService(业务逻辑层,有的习惯写成BaseServiceI)都可以,都是标注接口的,我只是简单的贴下代码 package com.jesus.sshframewo

Eclipse运行Maven的SpringMVC项目Run on Server时出现错误:Error configuring application listener of class org.springframework.web.context.ContextLoaderListener的问题解决

错误: 严重: Error configuring application listener of class org.springframework.web.context.ContextLoaderListener java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderListener at org.apache.catalina.loader.WebappClassLoaderBase.

用maven建立springmvc时遇到的小bug

用maven建立springmvc项目时,所有的依赖包已经添加好,然后出现java.lang.ClassNotFoundException:org.springframework.web.servlet.DispatcherServlet 错误. 解决方法: 右击项目-->properties-->Deloyment Assembly-->add-->Java Build Path Entries -->导入所有依赖的jar包,restart tomcat. 解决方法来源于:

用Eclipse 搭建一个Maven Spring SpringMVC 项目

1: 先创建一个maven web  项目: 可以参照之前的文章:  用Maven 创建一个 简单的 JavaWeb 项目 创建好之后的目录是这样的; 2: 先配置maven  修改pom.xml <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="htt

从头开始基于Maven搭建SpringMVC+Mybatis项目(1)

技术发展日新月异,许多曾经拥有霸主地位的流行技术短短几年间已被新兴技术所取代. 在Java的世界中,框架之争可能比语言本身的改变更让人关注.近几年,SpringMVC凭借简单轻便.开发效率高.与Spring框架无缝整合等特点,逐渐击败前辈Struts/Struts2,成为最常用的Web框架.而Mybatis相对于Hibernate,同样具有开发简单.效率高的优势,而且对SQL的可控性更好,有利于性能调优,逐渐也积累了挑战Hibernate的实力和人气. 当前SpringMVC+Mybatis已经