天天看點

SpringMVC專題(五)-SpringMVC響應資料和結果視圖

1.傳回值分類

1.1.字元串

controller 方法傳回字元串可以指定邏輯視圖名,通過視圖解析器解析為實體視圖位址。

  • Croller代碼:
//指定邏輯視圖名,經過視圖解析器解析為 jsp 實體路徑:/WEB-INF/pages/success.jsp
@RequestMapping("/testReturnString")
public String testReturnString() {
  System.out.println("AccountController的testReturnString 方法執行了。。。。");
  return "success"; 
}      
  • 運作結果:
SpringMVC專題(五)-SpringMVC響應資料和結果視圖

1.2.void

我們知道 Servlet 原始 API 可以作為控制器中方法的參數:

@RequestMapping("/testReturnVoid")
public void testReturnVoid(HttpServletRequest request,HttpServletResponse response) 
throws Exception {
}      

在 controller 方法形參上可以定義 request 和 response,使用 request 或 response 指定響應結果:

1、使用 request 轉向頁面,如下:

request.getRequestDispatcher("/WEB-INF/pages/success.jsp").forward(request, response);      

2、也可以通過 response 頁面重定向:

response.sendRedirect("testRetrunString");      

3、也可以通過 response 指定響應結果,例如響應 json 資料:

response.setCharacterEncoding("utf-8");
response.setContentType("application/json;charset=utf-8");
response.getWriter().write("json 串");      

1.3.ModelAndView

ModelAndView 是 SpringMVC 為我們提供的一個對象,該對象也可以用作控制器方法的傳回值。

該對象中有兩個方法:

SpringMVC專題(五)-SpringMVC響應資料和結果視圖
SpringMVC專題(五)-SpringMVC響應資料和結果視圖
  • 示例代碼:
/**
* 傳回 ModeAndView
* @return
*/
@RequestMapping("/testReturnModelAndView")
public ModelAndView testReturnModelAndView() {
  ModelAndView mv = new ModelAndView();
  mv.addObject("username", "張三");
  mv.setViewName("success");
  return mv; 
}      
  • 響應的 jsp 代碼:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>執行成功</title>
</head> 
<body>
  執行成功!
  ${requestScope.username}
</body>
</html>      
  • 輸出結果:
SpringMVC專題(五)-SpringMVC響應資料和結果視圖

注意:我們在頁面上上擷取使用的是 requestScope.username 取的,是以傳回 ModelAndView 類型時,浏

覽器跳轉隻能是請求轉發。

1.4.轉發和重定向

1.4.1 forward 轉發

controller 方法在提供了 String 類型的傳回值之後,預設就是請求轉發。我們也可以寫成:

/**
* 轉發
* @return
*/
@RequestMapping("/testForward")
public String testForward() {
  System.out.println("AccountController的testForward方法執行了。。。。");
  return "forward:/WEB-INF/pages/success.jsp";
}      

需要注意的是,如果用了 formward:則路徑必須寫成實際視圖 url,不能寫邏輯視圖。

它相當于“​​

​request.getRequestDispatcher("url").forward(request,response)​

​​”。使用請求

轉發,既可以轉發到 jsp,也可以轉發到其他的控制器方法。

1.4.2 Redirect 重定向

contrller 方法提供了一個 String 類型傳回值之後,它需要在傳回值裡使用:redirect:

/**
* 重定向
* @return
*/
@RequestMapping("/testRedirect")
public String testRedirect() {
  System.out.println("AccountController 的 testRedirect 方法執行了。。。。");
  return "redirect:testReturnModelAndView";
}      

它相當于“​

​response.sendRedirect(url)​

​”。需要注意的是,如果是重定向到 jsp 頁面,則 jsp 頁面不能寫在 WEB-INF 目錄中,否則無法找到。

1.5.ResponseBody響應json資料

1.5.1.使用說明
  • 作用:

    該注解用于将 Controller 的方法傳回的對象,通過 HttpMessageConverter 接口轉換為指定格式的資料如:json,xml 等,通過 Response 響應給用戶端.

1.5.2.使用示例
  • 需求:

    使用@ResponseBody 注解實作将 controller 方法傳回對象轉換為 json 響應給用戶端。

  • 前置知識點:

    Springmvc 預設用 MappingJacksonHttpMessageConverter 對 json 資料進行轉換,需要加入

    jackson 的包。

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.9.0</version>
</dependency>      
注意:2.7.0 以下的版本用不了
  • jsp 中的代碼:
<script type="text/javascript"
src="${pageContext.request.contextPath}/js/jquery.min.js"></script> <script type="text/javascript">
  $(function(){
    $("#testJson").click(function(){
      $.ajax({
        type:"post",
        url:"${pageContext.request.contextPath}/testResponseJson",
        contentType:"application/json;charset=utf-8",
        data:'{"id":1,"name":"test","money":999.0}',
        dataType:"json",
        success:function(data){
        alert(data);
        }
      });
    });
  })
</script>
<!-- 測試異步請求 --> 
<input type="button" value="測試 ajax 請求 json 和響應 json" id="testJson"/>      
  • 控制器中的代碼:
/**
* 響應json資料的控制器
* @Version 1.0
*/
@Controller("jsonController")
public class JsonController {

/**
* 測試響應 json 資料
*/
@RequestMapping("/testResponseJson")
public @ResponseBody Account testResponseJson(@RequestBody Account account) {
   System.out.println("異步請求:"+account);
   return account; 
   }
}      
  • 運作結果: