【SpringMVC學習筆記】—— 【三】響應數據和結果視圖

👉 原文首發: 小牛肉的個人博客,歡迎來訪~



1. Controller返回值分類

返回字符串

Controller方法返回字符串可以指定邏輯視圖的名稱,根據視圖解析器爲物理視圖的地址。

具體的應用場景:

控制器將數據存入Model

@Controller 
@RequestMapping("/user") 
public class UserController {        
	/**     
	* 請求參數的綁定     
	*/    
	@RequestMapping(value="/update")    
	public String update(Model model) {        
		// 模擬從數據庫中查詢的數據        
		User user = new User();        
		user.setUsername("張三");        
		user.setPassword("123");        
		user.setMoney(100d);        
		user.setBirthday(new Date());        
		model.addAttribute("user", user);   //將數據存入Model     
		return "update";    
	}    
}

前端通過 EL 表達式從域對象中取值

${ user.username }
${ user.password }        

返回值是void

  • 如果上述的 update 方法改爲返回值是 void 類型,則視圖解析器會自動去WEB-INF下尋找 update.jsp 文件

  • 可以使用請求轉發或者重定向跳轉到指定的頁面

@RequestMapping(value="/initAdd")    
public void initAdd(HttpServletRequest request,HttpServletResponse response) throws Exception {        	 
	System.out.println("請求轉發或者重定向");        
	// 請求轉發        
	// request.getRequestDispatcher("/WEB-INF/pages/add.jsp").forward(request, response);    
	    
	// 重定向 (重定向無法訪問 WEB-INF 路徑下的資源)
	// response.sendRedirect(request.getContextPath()+"/add2.jsp");       
	         
	response.setCharacterEncoding("UTF-8");        
	response.setContentType("text/html;charset=UTF-8");                
	// 直接響應數據        
	response.getWriter().print("你好");        
	return;    
}

返回值是ModelAndView對象

ModelAndView 對象是 Spring 提供的一個對象,可以用來調整具體的 JSP 視圖

  /**     
  * 返回ModelAndView對象     
  * 可以傳入視圖的名稱(即跳轉的頁面),還可以傳入對象。     
  * @return     
  * @throws Exception     
  */    
  @RequestMapping(value="/findAll")    
  public ModelAndView findAll() throws Exception {        
  	 ModelAndView mv = new ModelAndView();        
             
  	 // 模擬從數據庫中查詢所有的用戶信息        
  	 List<User> users = new ArrayList<>();        
  	 User user1 = new User();        
  	 user1.setUsername("張三");        
  	 user1.setPassword("123");                
  	 User user2 = new User();        
  	 user2.setUsername("趙四");        
  	 user2.setPassword("456"); 
  	 users.add(user1);        
  	 users.add(user2);       
  	 
  	 // 添加對象        
  	 mv.addObject("users", users);    
  	 // 跳轉到list.jsp的頁面        
  	 mv.setViewName("list");               
  	 return mv;    
 } 

jsp 界面通過 EL 表達式取值

 <h3>查詢所有的數據</h3>    
 <c:forEach items="${ users }" var="user">        
 	${ user.username }    
 </c:forEach>

2. SpringMVC框架提供的轉發和重定向

  • forward 請求轉發
  • redirect 重定向
 @RequestMapping("/delete")    
 public String delete() throws Exception {        
 	System.out.println("delete方法執行了...");       
 	// 請求轉發 
 	// return "forward:/WEB-INF/pages/success.jsp";        
 	 
	//  重定向
	return "redirect:/add.jsp";   
 }

3. @ResponseBody 響應 json 數據

需求: 使用@ResponseBody 註解實現將 controller 方法返回對象轉換爲 json 響應給客戶端

資源準備

首先需要導入 jquery.min.js 框架文件以及 jackson 的 依賴
在這裏插入圖片描述

  • 導入jackson依賴(Springmvc 默認用 MappingJacksonHttpMessageConverter 對 json 數據進行轉換,需要加入 jackson 的包。 )
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-annotations</artifactId>
      <version>2.10.2</version>
    </dependency>
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-databind</artifactId>
      <version>2.10.2</version>
    </dependency>
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-core</artifactId>
      <version>2.10.2</version>
    </dependency>

DispatcherServlet 會攔截到所有的資源,導致一個問題就是靜態資源(img、css、js)也會被攔截到,從而不能被使用。解決該問題的就是需要配置靜態資源不進行攔截,在 springmvc.xml 配置文件添加如下配置 :

    <!-- 設置靜態資源不過濾 -->
    <mvc:resources location="/css/" mapping="/css/**"/>  <!-- 樣式 -->
    <mvc:resources location="/images/" mapping="/images/**"/>  <!-- 圖片 -->
    <mvc:resources location="/js/" mapping="/js/**"/>  <!-- javascript -->
  • location 元素表示 webapp 目錄下的包下的所有文件
  • mapping 元素表示以 /static 開頭的所有請求路徑,如 /static/a 或者/static/a/b

前端 jsp

<head>
    <title>Title</title>

    <srcipt src = "js/jquery.min.js"></srcipt>
    <script type = "text/javascript">

        $(function(){
            $("#testJson").click(function(){
                $.ajax({
                    type: "post",
                    url: "/testResponseJson",
                    contentType: "application/json; charset= utf-8",
                    data: '{"uname":"小黑", "age":20, "password":"123"}',
                    dataType: "json",
                    success:function(data){
                        alert(data);
                        // alert(data.age);
                    }
                });
            });
        });
    </script>
</head>

<body>
    <button id = "testJson">測試 ajax 請求 json 和響應 json</button>
</body>

使用@RequestBody獲取請求體數據

@Controller
public class HelloController {
    @RequestMapping("/testResponseJson")
    public void testResponseJson(@RequestBody String body){
        System.out.println("test方法執行了"+body);
    }
}

使用@RequestBody註解把json的字符串轉換成JavaBean的對象

//控制器類
@Controller
public class HelloController {
    @RequestMapping("/testResponseJson")
    public void testResponseJson(@RequestBody User user){
        System.out.println("test方法執行了"+ user);
    }
}

使用@ResponseBody註解把JavaBean對象轉換成json字符串,直接響應

//控制器類
@Controller
public class HelloController {
    @RequestMapping("/testResponseJson")
    public @ResponseBody User testResponseJson(@RequestBody User user){
        System.out.println("test方法執行了"+ user);
        user.setAge(21);
        return user;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章