springmvc返回視圖(解析)


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類無返回值的方法

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM