1.傳回值分類
1.1.字元串
controller 方法傳回字元串可以指定邏輯視圖名,通過視圖解析器解析為實體視圖位址。
- Croller代碼:
//指定邏輯視圖名,經過視圖解析器解析為 jsp 實體路徑:/WEB-INF/pages/success.jsp
@RequestMapping("/testReturnString")
public String testReturnString() {
System.out.println("AccountController的testReturnString 方法執行了。。。。");
return "success";
}
- 運作結果:
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiI0gTMx81dsQWZ4lmZf1GLlpXazVmcvwFciV2dsQXYtJ3bm9CX9s2RkBnVHFmb1clWvB3MaVnRtp1XlBXe0xCMy81dvRWYoNHLwEzX5xCMx8FesU2cfdGLwMzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsYTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-cmbw5SMxETOxIzY1EjYhFDNwQmYyYzXyAjMwATMwMzLcZDMyIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjLyM3Lc9CX6MHc0RHaiojIsJye.png)
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 為我們提供的一個對象,該對象也可以用作控制器方法的傳回值。
該對象中有兩個方法:
- 示例代碼:
/**
* 傳回 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>
- 輸出結果:
注意:我們在頁面上上擷取使用的是 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;
}
}
- 運作結果: