网站流量盈利,如何制作公司网页百度发布,pc端和手机端网站建设,易网拓营销型网站在Spring MVC中#xff0c;Model中的数据会被自动放入到请求域#xff08;Request Scope#xff09;中。也就是说#xff0c;当我们在控制器中使用model.addAttribute()时#xff0c;这些属性会被放入到HttpServletRequest对象的属性中。
让我们通过代码来详细解释#…在Spring MVC中Model中的数据会被自动放入到请求域Request Scope中。也就是说当我们在控制器中使用model.addAttribute()时这些属性会被放入到HttpServletRequest对象的属性中。
让我们通过代码来详细解释
控制器中设置属性 GetMapping(/list)
public String list(Model model) {// 这里的数据会被放入请求域中model.addAttribute(contentPage, event/list);return layout/base;
}
JSP中获取属性 !-- 以下三种写法是等价的 -- !-- 1. 直接使用EL表达式 -- ${contentPage} !-- 2. 显式指定从请求域获取 -- ${requestScope.contentPage} !-- 3. 使用JSP内置对象request -- %request.getAttribute(contentPage)%
在JSP中有四个主要的域对象
页面域Page Scope
最小的作用范围
仅在当前页面有效
通过pageContext对象访问
请求域Request Scope
在一次请求中有效
Spring MVC的Model数据就是存在这里
通过request对象访问
会话域Session Scope
在一次会话中有效
用户登录信息通常存在这里
通过session对象访问
例如${sessionScope.loginUser}
应用域Application Scope
在整个Web应用中有效
所有用户共享
通过application对象访问
在我们的项目中 !-- base.jsp --!-- contentPage 从请求域获取 --jsp:include page/WEB-INF/views/${contentPage}.jsp/!-- 用户信息从会话域获取 --c:if test${not empty sessionScope.loginUser}span欢迎${sessionScope.loginUser.username}/span/c:if
当使用EL表达式${contentPage}时它会按照以下顺序查找属性
先找页面域pageScope
再找请求域requestScope
3. 再找会话域sessionScope
最后找应用域applicationScope
所以虽然我们在JSP中直接写${contentPage}但实际上它是从请求域中获取的因为Spring MVC把Model中的数据都放在了请求域中。
这就是为什么
页面切换时contentPage的值会改变因为是请求域每次请求都是新的
而用户登录信息不会丢失因为是会话域会一直保持到用户退出登录
这种域的概念是JSP中非常重要的一个概念它们的作用范围不同我们需要根据数据的特性选择合适的域来存储。
jsp页面有几种域
JSP页面有四种域作用域/Scope按照作用范围从小到大排序
页面域 (Page Scope) // 存值%pageContext.setAttribute(name, value);%// 取值${pageScope.name} - 作用范围仅在当前页面有效
生命周期当前页面的处理完成之前
适用场景只在当前页面使用的数据
访问对象pageContext
请求域 (Request Scope) // 存值%request.setAttribute(name, value);%// 或在控制器中model.addAttribute(name, value);// 取值${requestScope.name}// 或简写为${name} - 作用范围一次请求内有效
生命周期从请求开始到响应结束
适用场景在一次请求中传递的数据如从控制器传到JSP的数据
访问对象request
会话域 (Session Scope) // 存值%session.setAttribute(loginUser, user);%// 或在控制器中session.setAttribute(loginUser, user);// 取值${sessionScope.loginUser}
作用范围一次会话内有效
生命周期从会话开始到会话结束用户关闭浏览器或超时
适用场景用户相关的数据如登录信息
访问对象session
应用域 (Application Scope) // 存值%application.setAttribute(appConfig, config);%// 取值${applicationScope.appConfig} - 作用范围整个Web应用有效
生命周期从服务器启动到服务器关闭
适用场景所有用户共享的数据如系统配置
访问对象application
在我们的项目中的实际应用
1. 请求域用于页面显示数据
// 控制器中GetMapping(/list)public String list(Model model) {model.addAttribute(contentPage, event/list); // 存入请求域return layout/base;}
!-- JSP中 --
jsp:include page/WEB-INF/views/${contentPage}.jsp/ // 从请求域获取 会话域用于用户登录状态 // 控制器中PostMapping(/login)public ResultUser login(String username, String password, HttpSession session) {// ... 登录验证 ...session.setAttribute(loginUser, user); // 存入会话域} jsp!-- JSP中 --c:if test${not empty sessionScope.loginUser} // 从会话域获取 span欢迎${sessionScope.loginUser.username}/span/c:if
数据查找顺序
当使用${name}这样的EL表达式时会按照以下顺序查找
pageScope
requestScope
3. sessionScope
applicationScope
选择使用哪个域的原则
能用小范围的就不用大范围的
根据数据的生命周期选择合适的域
考虑性能影响作用域越大占用资源越多