1. 程式人生 > >Spring MVC 模型資料,新增模型資料的5大方式。

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的過程;