maven与springMVC之ModelAttribute、SessionAttributes

来源:互联网 发布:mac电脑忘记密码 编辑:程序博客网 时间:2024/06/07 09:40

这篇文章我们继续来研究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:05getTimeLong-------->1440760565867getUser-------->name1440760565875getTimeLong-------->1440760570465getTimeLong-------->1440760638091getTimeLong-------->1440760639985getTimeLong-------->1440760640793getTimeLong-------->1440760641320getTimeLong-------->1440760641872getTimeLong-------->1440760642536getTimeLong-------->1440760648097getTimeLong-------->1440760648592getTimeLong-------->1440760649072getTimeLong-------->1440760649512getTimeLong-------->1440760650024getTimeLong-------->1440760650376getTimeLong-------->1440760650720getTimeLong-------->1440760650952getTimeLong-------->1440760651167getTimeLong-------->1440760651391getTimeLong-------->1440760651656getTimeLong-------->1440760711522getUser-------->name1440760711523getTimeLong-------->1440760716985getTimeLong-------->1440760745147getTimeLong-------->1440760937057











0 0
原创粉丝点击