使用ModelAndView向request域物件共享資料

index.html

  1. <a th:href="@{/testModelAndView}">使用ModelAndView</a>



控制器

  1. /**
  2. * ModelAndView有Model和View的功能
  3. * Model主要用於向請求域共享資料
  4. * View主要用於設定檢視,實現頁面跳轉
  5. */
  6. @RequestMapping("/testModelAndView")
  7. public ModelAndView success(){
  8. ModelAndView modelAndView = new ModelAndView();
  9. modelAndView.addObject("username","gonghr"); //向請求域共享資料
  10. modelAndView.setViewName("success"); //設定檢視名稱,實現頁面跳轉
  11. return modelAndView; //返回
  12. }

success.html

  1. sucess
  2. <p th:text="${username}"></p>

使用Model向request域物件共享資料

index.html

  1. <a th:href="@{/testModel}">使用Model</a> <br>

控制器

  1. @RequestMapping("/testModel")
  2. public String testModel(Model model){
  3. model.addAttribute("company","JLU");
  4. return "success";
  5. }

success.html

  1. sucess
  2. <p th:text="${company}"></p> <br>

使用map向request域物件共享資料

index.html

  1. <a th:href="@{/testMap}">使用Map</a> <br>

控制器

  1. @RequestMapping("/testMap")
  2. public String testMap(Map<String, Object> map){
  3. map.put("age","Nineteen");
  4. return "success";
  5. }

sucess.html

  1. sucess
  2. <p th:text="${age}"></p> <br>

使用ModelMap向request域物件共享資料

index.html

  1. <a th:href="@{/testModelMap}">使用ModelMap</a> <br>

控制器

  1. @RequestMapping("/testModelMap")
  2. public String testModelMap(ModelMap modelMap){
  3. modelMap.addAttribute("major","software engineering");
  4. return "success";
  5. }

success.html

  1. <p th:text="${major}"></p> <br>

Model、ModelMap、Map的關係

經過測試發現:除了ModelAndView的實現類是ModelAndViewModelMapModelMap 的實現類都是BindingAwareModelMap

ModelModelMapMap型別的引數其實本質上都是 BindingAwareModelMap 型別的

  1. class of ModelAndView: class org.springframework.web.servlet.ModelAndView
  2. class of Model: class org.springframework.validation.support.BindingAwareModelMap
  3. class of Map: class org.springframework.validation.support.BindingAwareModelMap
  4. class of ModelMap: class org.springframework.validation.support.BindingAwareModelMap

閱讀ModeAndView的原始碼可以發現,ModeAndViewModelMap是組合關係。下面是ModeAndView的部分原始碼。

  1. public class ModelAndView {
  2. @Nullable
  3. private ModelMap model;
  4. public ModelAndView() {
  5. }
  6. public ModelMap getModelMap() {
  7. if (this.model == null) {
  8. this.model = new ModelMap();
  9. }
  10. return this.model;
  11. }
  12. public ModelAndView addObject(String attributeName, @Nullable Object attributeValue) {
  13. this.getModelMap().addAttribute(attributeName, attributeValue);
  14. return this;
  15. }

ModeAndView呼叫addObject()方法時其實是呼叫ModelMapaddAttribute()方法,本質上與ModelMap是一樣的。

各個類之間的關係如下:

  1. public interface Model{}
  2. public class ModelMap extends LinkedHashMap<String, Object> {}
  3. public class ExtendedModelMap extends ModelMap implements Model {}
  4. public class BindingAwareModelMap extends ExtendedModelMap {}

四種方式本質上都是呼叫的Model介面中的addAttribute方法

向session域共享資料

index.html

  1. <a th:href="@{/testSession}">使用Session</a> <br>

控制器

  1. @RequestMapping("/testSession")
  2. public String testSession(HttpSession session){
  3. session.setAttribute("message","session scope");
  4. return "success";
  5. }

success.html

  1. <p th:text="${session.message}"></p> <br>

向application域共享資料

index.html

  1. <a th:href="@{/testApplication}">使用Application</a> <br>

控制器

  1. @RequestMapping("/testApplication")
  2. public String testApplication(HttpSession session){
  3. ServletContext application = session.getServletContext();
  4. application.setAttribute("testApplication","hello,application");
  5. return "success";
  6. }

success.html

  1. <p th:text="${application.testApplication}"></p> <br>