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";
}