Spring MVC 模型資料,新增模型資料的5大方式。
Spring MVC 框架作為一個 MVC 框架,很重要的一項工作是在控制器獲取模型資料並返回給前端,
在 JSP 頁面展示模型資料,使用的技術是通過 EL 表示式從域物件中取值;
四大域:pageContext、request、session、application。
我們常用到的request 和 session這兩個域物件;
Spring MVC 提供了以下幾種方式新增模型資料:
Map
Model
ModelAndView
@SessionAttributes
@ModelAttribute
一、 模型資料繫結到 request 域物件
1、Map
設定業務方法的入參為 Map 型別,Spring MVC 會將隱含物件的引用傳遞給入參。在方法體中,開發者可以通過入參物件訪問到模型中的所有資料,也可以向模型中新增新資料。
@RequestMapping("/mapTest")
public String mapTest(Map<String,Object> map){
User user = new User();
user.setId(1);
user.setName("張三");
map.put("user", user) ;
return "index";
}
業務方法完成,返回modelAndView給 DispatcherServlet,DispatcherServlet 通過 ViewResolver 對檢視資訊進行解析,邏輯檢視對映到物理檢視,同時將模型資料繫結到 JSP 的 request 域物件中,在 JSP 頁面,可直接通過 EL 表示式取值。
<body>
${user.name }
</body>
2、Model
Model 與 Map 類似,業務方法通過入參來完成模型資料的繫結。
@RequestMapping ("/modelTest")
public String modelTest(Model model){
User user = new User();
user.setId(1);
user.setName("張三");
model.addAttribute("user", user);
return "index";
}
3、ModelAndView
與 Map 或者 Model 不同的是,ModelAndView 不但包含模型資料,同時也包含了檢視資訊,所以使用 ModelAndView 來處理模型資料,業務方法的返回值必須是 ModelAndView。
業務方法中對 ModelAndView 進行兩個操作:填充模型資料和繫結檢視資訊。
關於 ModelAndView 的使用有 8 種方式。
@RequestMapping("/modelAndViewTest1")
public ModelAndView modelAndViewTest1(){
ModelAndView modelAndView = new ModelAndView();
User user = new User();
user.setId(1);
user.setName("張三");
modelAndView.addObject("user", user);
modelAndView.setViewName("index");
return modelAndView;
}
@RequestMapping("/modelAndViewTest2")
public ModelAndView modelAndViewTest2(){
ModelAndView modelAndView = new ModelAndView();
User user = new User();
user.setId(1);
user.setName("張三");
modelAndView.addObject("user", user);
View view = new InternalResourceView("/index.jsp");
modelAndView.setView(view);
return modelAndView;
}
@RequestMapping("/modelAndViewTest3")
public ModelAndView modelAndViewTest3(){
ModelAndView modelAndView = new ModelAndView("index");
User user = new User();
user.setId(1);
user.setName("張三");
modelAndView.addObject("user", user);
return modelAndView;
}
@RequestMapping("/modelAndViewTest4")
public ModelAndView modelAndViewTest4(){
View view = new InternalResourceView("/index.jsp");
ModelAndView modelAndView = new ModelAndView(view);
User user = new User();
user.setId(1);
user.setName("張三");
modelAndView.addObject("user", user);
return modelAndView;
}
@RequestMapping("/modelAndViewTest5")
public ModelAndView modelAndViewTest5(){
Map<String,Object> map = new HashMap<String,Object>();
User user = new User();
user.setId(1);
user.setName("張三");
map.put("user", user);
ModelAndView modelAndView = new ModelAndView("index", map);
return modelAndView;
}
@RequestMapping("/modelAndViewTest6")
public ModelAndView modelAndViewTest6(){
Map<String,Object> map = new HashMap<String,Object>();
User user = new User();
user.setId(1);
user.setName("張三");
map.put("user", user);
View view = new InternalResourceView("/index.jsp");
ModelAndView modelAndView = new ModelAndView(view, map);
return modelAndView;
}
@RequestMapping("/modelAndViewTest7")
public ModelAndView modelAndViewTest7(){
User user = new User();
user.setId(1);
user.setName("張三");
ModelAndView modelAndView = new ModelAndView("index", "user", user);
return modelAndView;
}
@RequestMapping("/modelAndViewTest8")
public ModelAndView modelAndViewTest8(){
User user = new User();
user.setId(1);
user.setName("張三");
View view = new InternalResourceView("/index.jsp");
ModelAndView modelAndView = new ModelAndView(view, "user", user);
return modelAndView;
}
4、HttpServletRequest
Spring MVC 可以在業務方法直接獲取到 Servlet 原生 Web 資源,只需在方法定義時新增 HttpServletRequest 入參即可,在方法體中,可直接對 request 物件進行操作。
@RequestMapping("requestTest")
public String requestTest(HttpServletRequest request){
User user = new User();
user.setId(1);
user.setName("張三");
request.setAttribute("user", user);
return "index";
}
2018.11.15
5、使用@ModelAttribute註解
(1)定義一個方法,該方法用來返回要填充到模型資料中的物件。
(2)給該方法新增 @ModelAttribute 註解。
由於web.xml中配置的過濾路徑為*.do
訪問路徑:http://localhost:8080/modelAttributeTest.do
@RequestMapping("/modelAttributeTest")
public String modelAttribute() {
return "hello";
}
@ModelAttribute
public User getUser(){
User user = new User();
user.setId(1L);
user.setName("zhangsan");
return user;
}
在hello.jsp中把user物件中數值取出來 $ { user.id} 、$ {user.name};
若沒效果,jsp頁面頂新增如下標籤:
<%@ page isELIgnored=“false” %>
二、模型資料繫結到 session 域物件
以上的方式全部是將模型資料繫結到 request 物件中,如果需要將模型資料繫結到 session 物件中,只需要在類定義處新增 @SessionAttributes(value=“user”) 註解即可。
@Controller
@SessionAttributes(value="user")
public class HelloHandler {
//省略程式碼
}
通過 @ModelAttributes 繫結模型資料到session中,request中也存在模型資料;除了通過key值來繫結,還可以通過model的資料型別來繫結;也可以繫結多個模型資料;
@Controller
@SessionAttributes(types=User.class)
public class HelloHandler {
//省略程式碼
}
------------------------------------------------------------
@Controller
@SessionAttributes(types={User.class,Address.class})
public class HelloHandler {
//省略程式碼
}
整個過程完成了 ,控制器呼叫 Controller 到 View的過程;