1.什么是視圖?
視圖就是展示給用戶看的結果。可以是很多形式,例如:html、JSP、excel表單、Word文檔、PDF文檔、JSON數據、freemarker模板視圖等等。
2.傳統JSP和JSTL視圖?
我們使用的internalResourceViewResolver解析器,默認支持JSP視圖,而JSP中最常用的莫過於JSTL標簽庫了:該解析器默認使用的是JSTL解析器,要想使用JSTL標簽需要導入JSTL的依賴
<dependency> <groupId>jstl</groupId> <artifactId>jstl</artifactId> <version>1.2</version> <dependency> <!--jsp相關--> <dependency> <groupId>jstl</groupId> <artifactld>jstl</artifactld> <dependency>
將一個user的集合放入模型中返回:數據如何在頁面渲染
@RequestMapping(value="/show3") public ModelAndView show3(){ //創建模型視圖,指定視圖名 ModelAndView mv=new ModelAndView("user-list"); //創建用戶列表,用於頁面展示 List<User> users=new ArrayList<User>(); for(int i=0;i<10;i++){ User user=new User(); user.setId(Long.valueOf(i)); user.setAge(20+i); user.setname("張三"+i); user.setUsername("zhangsan_"+i); user.add(user); } //把用戶列表添加到模型中 mv.addObject("users",users); return mv; }
在頁面中引入JSTL標簽庫:
引入代碼:<<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c">
<body> <table> <tr> <th>ID</th> <th>UserName</th> <th>Name</th> <th>Age</th> </tr> //利用標簽庫中EL表達式遍歷集合,展示到頁面 <c:forEach items="${users}" var="user"> <tr> <td>${user.id}</td> <td>${user.username}</td> <td>${user.name}</td> <td>${user.age}</td> </tr> </c:forEach> </table> </body>
3.JSON視圖
在實際開發中,我們經常需要以JSON的格式進行數據的傳輸,所以在SpringMVC中提供了一種非常便捷的方式來返回一個JSON視圖。SpringMVC的JSON功能,底層依賴的是Jackson這個JSON工具
使用這個工具必須要引入該依賴:
<!-- Jackson Json處理工具包 --> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> </dependency>
編寫controller類,該注解@ResponseBody返回的是一個JSON視圖(springmvc或自動把返回值轉換為JSON格式)
@RequestMapping(value="test2") @ResponseBody public List<User> test2(){ User user = new User(); List<User> users=new ArrayList<>(); for (int i = 0; i < 10; i++) { user.setAge(23); user.setName("kater"); user.setSex(1); user.setuserName("pick"); users.add(user); } return users; }
原理:
1) 當SpringMVC讀取到方法上的@ResponseBody注解時,就知道該方法不再使用默認的視圖解析器解析視圖,而是直接把結果寫到響應體中,這樣就需要對結果進行轉換。
2) SpringMVC會從框架中查找有沒有定義MessageConvertor(消息轉換器),通過消息轉換器轉換結果,返回對應視圖
3) 在SpringMVC的注解驅動類中,會進行默認的消息轉換器注冊,因為我們引入了jacksonJson包,所以會注冊JSON的消息轉換器
注解驅動類中的代碼:
4) 因為只有JSON消息轉換器可以對Java對象序列化,因此這里默認用了JSON轉換
3.直接返回視圖名稱
SpringMVC允許直接返回一個String數據,作為視圖名稱。不需要數據模型。
@RequestMapping(value="test3") public String test3(){
//如果只是訪問頁面,就不需要ModelAndView對象,直接返回一個字符串即可 return "index"; //訪問的是index.jsp頁面 }
也可以把視圖和模型分離,不需要Model中的數據
@RequestMapping(value="test5") public String test5(Model model){ model.addAttribute("msg","我試試Model好不好用"); return "index"; //訪問的是index.jsp頁面 }
4.重定向視圖和轉發視圖?
轉發和重定向的區別?
(1)轉發的是同一次請求;重定向是兩次不同請求
(2)地址欄的地址發生變化的為重定向,不發生變化的為轉發
(3)轉發數據不丟失,重定向數據丟失
5.不返回視圖和JSON數據,只是返回成功的狀態碼?
注解:@ResponseStatus(HttpStatus.OK) controller類無返回值的方法