SpringMVC(六)-響應資料和結果檢視
一、返回值分類
1、請求返回值為字串
(1)點選response.jsp中的超連結,傳送請求。
(2)根據請求路徑,執行UserController類中的testString()方法,查到資料放入Model中,Model可以把值傳到request域,這樣頁面就可以拿到資料了。
(3)UserController類中的testString()方法返回字串"success",在springmvc.xml中配置的檢視解析器,會根據配置及返回值,找到/WEB-INF/pages/目錄下的success.jsp,並跳轉至這個頁面。
(4)success.jsp頁面中<page>標籤中配置的 isELIgnored="false" 會使EL表示式生效,從而在頁面上顯示出後臺查詢出的值。
<!-- response.jsp,發起請求連線的頁面 --> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> <a href="user/testString" >testString</a> </body> </html>
<!-- success.jsp,請求成功後的頁面 --> <%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %> <html> <head> <title>Title</title> </head> <body> <h3>執行成功</h3> ${user.username} ${user.password} </body> </html>
@Controller
@RequestMapping("/user")
public class UserController {
@RequestMapping("/testString")
public String testString(Model model){
System.out.println("testString方法執行了...");
// 模擬從資料庫中查詢出User物件
User user = new User();
user.setUsername("小明");
user.setPassword("123");
user.setAge(18);
// model物件
model.addAttribute("user",user);
return "success";
}
}
public class User implements Serializable{
private String username;
private String password;
private Integer age;
// 省略get and set
}
2、請求無返回值
(1)如果不做處理,即執行testVoidOne()方法,後臺執行完後預設會去@RequestMapping()標註的路徑下找jsp檔案,如下程式碼若不處理,則會到:專案名/WEB-INF/pages/user目錄下找testVoid.jsp檔案。
(2)呼叫請求轉發(只進行一次請求),即執行testVoidTwo()方法,不會使用springmvc.xml中配置的檢視解析器,所以轉發頁面目錄地址要寫完整。
(3)呼叫請求重定向(進行兩次請求),即執行testVoidThree()方法,第二次請求不能直接訪問/WEB-INF/pages/目錄,要利用request.getContextPath()方法獲取專案名,拼接完整頁面檔案路徑。
(4)直接通過輸出流響應資料,即執行testVoidFour()方法,要注意設定中文編碼格式。
@Controller
@RequestMapping("/user")
public class UserController {
@RequestMapping("/testVoidOne")
public void testVoidOne(Model model){
System.out.println("testVoidOne方法執行了...");
}
@RequestMapping("/testVoidTwo")
public void testVoidTwo(HttpServletRequest request, HttpServletResponse response) throws Exception {
System.out.println("testVoidTwo方法執行了...");
request.getRequestDispatcher("/WEB-INF/pages/success.jsp").forward(request,response);
return;
}
@RequestMapping("/testVoidThree")
public void testVoidThree(HttpServletRequest request, HttpServletResponse response) throws Exception {
System.out.println("testVoidThree方法執行了...");
response.sendRedirect(request.getContextPath()+"/index.jsp");
return;
}
@RequestMapping("/testVoidFour")
public void testVoidFour(HttpServletRequest request, HttpServletResponse response) throws Exception {
System.out.println("testVoidFour方法執行了...");
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
response.getWriter().print("你好");
return;
}
}
3、返回ModelAndView物件
ModelAndView是SpringMVC為我們提供的一個物件,該物件也可以用作控制器方法的返回值。
<!-- response.jsp,發起請求連線的頁面 -->
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<a href="user/testModelAndView" >testModelAndView</a>
</body>
</html>
@Controller
@RequestMapping("/user")
public class UserController {
@RequestMapping("/testModelAndView")
public String testModelAndView(){
System.out.println("testModelAndView方法執行了...");
ModelAndView mv = new ModelAndView();
// 模擬從資料庫中查詢出User物件
User user = new User();
user.setUsername("小明");
user.setPassword("123");
user.setAge(18);
// 把user物件儲存到mv物件中,也會把user物件存入到request物件
mv.addObject("user",user);
// 跳轉到哪個頁面
mv.setViewName("success");
return mv;
}
}
二、利用關鍵字進行轉發和重定向(使用較少)
用關鍵字進行轉發(forward)和重定向(redirect),是無法使用檢視解析器的,所以跳轉到的頁面目錄地址要寫完整。重定向(redirect)的頁面目錄地址不必寫出專案名,框架自動填補了。
<!-- response.jsp,發起請求連線的頁面 -->
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<a href="user/testForwardOrRedirect" >testForwardOrRedirect</a>
</body>
</html>
@Controller
@RequestMapping("/user")
public class UserController {
@RequestMapping("/testForwardOrRedirect")
public String testForwardOrRedirect(){
System.out.println("testForwardOrRedirect方法執行了...");
// 請求的轉發
// return "forward:/WEB-INF/pages/success.jsp";
// 重定向
return "redirect:/index.jsp";
}
}
三、ResponseBody響應json資料
(1)利用ajax傳送非同步請求,在src/main/webapp/js資料夾下匯入jquery.min.js,並在傳送請求頁面匯入。
(2)由於DispatcherServlet會攔截到所有的資源,就會導致靜態資源(img、css、js)也被攔截而不能使用。需要在springmvc.xml檔案新增不攔截靜態資原始檔的配置,見以下程式碼。
(3)ajax中要以json字串的形式,封裝傳入後臺的資料,字串中的key要與JavaBean的屬性名稱一致。控制器中@RequestBody註解會自動將客戶端傳來的json資料封裝為相應的JavaBean,但是需要匯入jackson相關jar包。
(4)後臺控制器處理完業務之後,@ResponseBody註解會將JavaBean物件資料轉換為json格式資料返回給客戶端,從而完成非同步請求。
<!-- jackson相關jar包引入 -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.9.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.9.0</version>
</dependency>
<!-- springmvc.xml檔案新增的配置內容 -->
<!-- 前端控制器,哪些靜態資源不攔截 -->
<mvc:resources location="/css/" mapping="/css/**"/>
<mvc:resources location="/images/" mapping="/images/**"/>
<mvc:resources location="/js/" mapping="/js/**"/>
<!-- response.jsp,發起請求連線的頁面 -->
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
<script src="js/jquery.min.js"></script>
<script>
// 頁面載入,繫結單擊事件
$(function(){
$("#btn").click(function(){
// alert("hello btn");
// 傳送ajax請求
$.ajax({
// 編寫json格式,設定屬性和值
url:"user/testAjax",
contentType:"application/json;charset=UTF-8",
data:'{"username":"Jack","password":"123","age":26}',
dataType:"json",
type:"post",
success:function(data){
// data伺服器端響應的json的資料,進行解析
alert(data);
alert(data.username);
alert(data.password);
alert(data.age);
}
});
});
});
</script>
</head>
<body>
<button id="btn">傳送ajax的請求</button>
</body>
</html>
@Controller
@RequestMapping("/user")
public class UserController {
@RequestMapping("/testAjax")
public @ResponseBody User testAjax(@RequestBody User user){
System.out.println("testAjax方法執行了...");
// 客戶端傳送ajax的請求,傳的是json字串,後端把json字串封裝到user物件中
System.out.println(user);
// 模擬查詢資料庫
user.setUsername("Tom");
user.setAge(28);
// 響應
return user;
}
}