1. 程式人生 > >SpringMVC的學習(三)——Controller傳遞資料

SpringMVC的學習(三)——Controller傳遞資料

一、Controller傳遞資料

有三種實現方案:

第一種:ModelAndView

第二種:Map

第三種:Model介面

①:ModelAndView

public class DemoController {

	@RequestMapping("/edit")
	public ModelAndView edit() {
		User user = new User(); 
		user.setUsername("張三");
		user.setAge(11);
		user.setPassword("123");

		Address address = new Address();
		address.setProvince("遼寧");
		address.setCity("葫蘆島");
		
		user.setAddress(address);

		ModelAndView modelAndView = new ModelAndView();
		
		// viewname 指定要查詢的頁面
		modelAndView.setViewName("user/form");
		// 新增modelAndView新增攜帶的user資料
		modelAndView.addObject("user", user);

		return modelAndView;
	}
}

頁面顯示程式碼:

/WEB-INF/user/form.jsp

<form action="/spring-mvc-22/user/add" method="post">
   	  <label for="username">使用者名稱:<input type="text" value="${user.username }" id="username" name="username" /></label><br/>
   	  <label for="password">密碼:<input type="password" id="password" name="password" /></label><br/>
   	  <label for="age">年齡:<input type="text" value="${user.age }" name="age" /></label><br/>
   	  <label for="address.province">省份:<input type="text" value="${user.address.province }" name="address.province" /></label><br/>
   	  <label for="address.city">城市:<input type="text" value="${user.address.city }" name="address.city" /></label><br/>
   	  <label for="address.sp.pname">特產名稱:<input type="text" name="address.sp.pname" /></label><br/>
   	  <label for="address.sp.price">特產價格:<input type="text" name="address.sp.price" /></label><br/>
   	  <input type="submit"  value="提交" />
</form>

②Map

@RequestMapping("/map")
public String retMap(Map<String, Object> map) {
	map.put("name", "齊天大聖");
	return "show";
}

方法中新增 map引數, 往map中放置資料,就可以傳送到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>
  <h2>${name}</h2>
</body>
</html>

③Model介面

@RequestMapping("/model")
public String retModel(Model model) {
	model.addAttribute("name", "我是Model!!");
	return "show";
}
<body>
  <h2>${name}</h2>
  <h2>${requestScope.name}</h2>
  <h2>${sessionScope.name}</h2>
</body>

總結: 使用以上三種情況可以將資料返回給頁面,頁面使用EL表示式即可獲取!但是要注意!資料放入的是requestScope作用域!其他域獲取不到!

二、@SessionAttributes註解

①@SessionAttributes註解原理

預設情況下Spring MVC將模型中的資料儲存到request域中。當一個請求結束後,資料就失效了。如果要跨頁面使用。那麼需要使用到session。而@SessionAttributes註解就可以使得模型中的資料儲存一份到session域中。

②@SessionAttributes引數

  • names:這是一個字串陣列。裡面應寫需要儲存到session中資料的名稱。
  • types:根據指定引數的型別,將模型中對應型別的引數儲存到session中
  • value:其實和names是一樣的。

@SessionAttributes註解中有兩個屬性:一個是value,用於指定哪個物件要放在session域中;type用於指定哪種型別的物件放在session域中,兩個引數可以同時配合使用。例如:

–@SessionAttributes(types=User.class) 會將隱含模型中所有型別為 User.class 的屬性新增到會話中。

– @SessionAttributes(value={“user1”, “user2”})

– @SessionAttributes(types={User.class, Dept.class})

③程式碼展示

@RequestMapping("/test")
	public String test(Map<String, Object> map) {
		map.put("names", Arrays.asList("aaa", "bbb", "ccc"));
		map.put("age", 18);
		return "hello";
	}

JSP頁面:

上面程式碼沒有指定@SessionAttributes,所有在session域總無法獲取到對應的資料。

@Controller
@SessionAttributes(value={"names"},types={Integer.class})
public class DemoServlet1 {

	@RequestMapping("/test")
	public String test(Map<String, Object> map) {
		map.put("names", Arrays.asList("aaa", "bbb", "ccc"));
		map.put("age", 18);
		return "hello";
	}
}

JSP頁面:

@SessionAttributes註解只能在類上使用,不能在方法上使用

三、Controller原生ServletAPI

如果我們需要使用Servlet內部常用類:

- HttpServletRequest

- HttpServletResponse

- HttpSession 等

直接在Controller層的方法中傳入對應引數即可,不分順序

注意:如果使用maven專案 需要匯入 jsp jstl servlet api

程式碼展示:

@RequestMapping("/test2")
	public String getSlt(HttpServletRequest request,HttpServletResponse response,HttpSession session) {
		return "hello";
	}
@RequestMapping("/test2")
	public String show5(HttpServletRequest request,HttpServletResponse response,HttpSession session){
		System.out.println(request);
		ServletContext application = request.getServletContext();
		
		System.out.println(response);
		System.out.println(session);
		System.out.println(application);
		return "success";
	}