SpringMVC域對象共享數據示例詳解
SpringMVC域對象共享數據
一、域對象
1. 域對象的作用
就是在一定范圍內可以共享數據,通常有 3 種:
- request: 一次請求,多個資源共享數據
- session: 默認一次會話,多個請求,多個資源共享數據
- servletContext: 一個應用,多個會話,多個請求,多個資源共享同一份數據
2. 域對象生命周期
- request: 創建-請求開始,銷毀-響應結束
- session: 創建-第一次調用,銷毀- tomcat超時三十分鐘(默認)、或者手動調用invalidate()、或者服務器非正常關閉
- servletContext: 創建-啟動時,銷毀-關閉時
3. 使用原則
在滿足需求的前提下,能選擇小范圍的就不選擇大范圍的。
舉例,一個查詢列表場景,這種一般放在 request 域中,當然瞭放在更大的2個裡面也可以,但是沒必要。
因為除瞭查詢還同時會存在增刪改的功能,所以我們要每次去查詢一次才可以保證數據是最新的,這時候如果放在更大的域比如 session 中,那麼在一次請求中隻會用到一次,其他時候這個空間就浪費掉瞭。
二、向域對象共享數據
1. 向 request 域對象共享數據
(1)使用 servletAPI 向 request 域對象共享數據
@Controller public class ScopeController { @RequestMapping("/testServletAPI") public String testServletAPI(HttpServletRequest request){ request.setAttribute("testScope", "hello,servletAPI"); return "success"; } }
在控制器方法裡,設置 request 域對象中的數據,key 是testScope,value是"hello,servletAPI",最後這個請求轉發到瞭 success.html 上。
那麼在 success.html 中就可以獲得域對象中的數據瞭,直接使用 key:
<!DOCTYPE html> <html lang="en" xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <p>success</p> <p th:text="${testScope}"></p> </body> </html>
現在訪問http://localhost:8080/springmvc/testServletAPI,
可以看到展示出瞭獲取到的 request 域中共享的數據。
(2)使用 ModelAndView 向 request 域對象共享數據
ModelAndView 有 Model和 View的功能,Model主要用於向請求域共享數據,View主要用於設置視圖,實現頁面跳轉。這種也是 springMVC 建議使用的方式。
註意控制器方法必須要返回 ModelAndView 類型的對象。
@RequestMapping("/testModelAndView") public ModelAndView testModelAndView(){ /** * ModelAndView有Model和View的功能 * Model主要用於向請求域共享數據 * View主要用於設置視圖,實現頁面跳轉 */ ModelAndView mav = new ModelAndView(); //向請求域共享數據 mav.addObject("testScope", "hello,ModelAndView"); //設置視圖,實現頁面跳轉 mav.setViewName("success"); return mav; }
訪問一下http://localhost:8080/springmvc/testModelAndView:
獲取成功。
(3)使用 Model 向 request 域對象共享數據
這裡的 Model 其實就是上面 ModelAndView 中的 Model 。
@RequestMapping("/testModel") public String testModel(Model model){ model.addAttribute("testScope", "hello,Model"); return "success"; }
測試一下:
獲取成功。
(4)使用 map 向 request 域對象共享數據
還可以使用 map 集合來實現,這時候向 map 集合中存放的數據,就是要共享的數據:
@RequestMapping("/testMap") public String testMap(Map<String, Object> map){ map.put("testScope", "hello,Map"); return "success"; }
測試一下:
獲取成功。
(5)使用 ModelMap 向 request 域對象共享數據
@RequestMapping("/testModelMap") public String testModelMap(ModelMap modelMap){ modelMap.addAttribute("testScope", "hello,ModelMap"); return "success"; }
測試一下:
獲取成功。
Model、ModelMap、Map的關系
Model、ModelMap、Map類型的參數其實本質上都是 BindingAwareModelMap 類型的。
分別查看源碼可知如下關系:
public interface Model{} public class ModelMap extends LinkedHashMap<String, Object> {} public class ExtendedModelMap extends ModelMap implements Model {} public class BindingAwareModelMap extends ExtendedModelMap {}
2. 向 session 域共享數據
直接使用 servlet 原生的 HttpSession 即可:
@RequestMapping("/testSession") public String testSession(HttpSession session){ session.setAttribute("testSessionScope", "hello,session"); return "success"; }
success 頁面也需要修改瞭,通過 session.testSessionScope獲取數據展示:
... ... <p th:text="${session.testSessionScope}"></p> ... ...
重新部署訪問http://localhost:8080/springmvc/testSession:
3. 向 application 域共享數據
其實這裡的 application 指的就是 ServletContext 對象,用 session.getServletContext() 來獲取即可:
@RequestMapping("/testApplication") public String testApplication(HttpSession session){ ServletContext application = session.getServletContext(); application.setAttribute("testApplicationScope", "hello,application"); return "success"; }
success.html 修改:
... ...<p th:text="${application.testApplicationScope}"></p>... ...
重新部署訪問http://localhost:8080/springmvc/testApplication:
獲取成功。
感謝《尚矽谷》的學習資源。
以上就是SpringMVC域對象共享數據示例詳解的詳細內容,更多關於SpringMVC域對象共享數據的資料請關註WalkonNet其它相關文章!
推薦閱讀:
- Spring MVC數據響應處理詳解
- SpringMVC 域對象共享數據的實現示例
- SpringMVC處理數據輸出的實例代碼
- SpringMVC數據頁響應ModelAndView實現頁面跳轉
- 詳解SpringBoot中@SessionAttributes的使用