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












發佈了94 篇原創文章 · 獲贊 46 · 訪問量 25萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章