编程自学指南:java程序设计开发,内置对象的属性范围详解
一、课程信息
学习目标
- 理解四大作用域的生命周期与作用范围
- 掌握在不同作用域中存储、读取、删除数据的方法
- 能根据业务场景选择合适的作用域
- 理解作用域与其他 Web 技术的协作关系
二、课程导入:数据存储的 “抽屉”
🌰 生活类比
作用域 | 存储位置 | 可见性范围 | 典型用途 |
---|---|---|---|
page | 单页抽屉 | 当前页面 | 临时计算结果 |
request | 单请求信封 | 一次请求内 | 表单提交数据 |
session | 个人储物柜 | 整个会话 | 登录状态、购物车 |
application | 公共储物柜 | 整个应用 | 全局配置、计数器 |
三、四大作用域核心概念
🔍 1. 作用域对比
作用域 | 类型 | 生命周期 | 访问方式 |
---|---|---|---|
page | PageContext | 页面响应结束后销毁 | pageContext.getAttribute() |
request | HttpServletRequest | 请求处理完成后销毁 | request.getAttribute() |
session | HttpSession | 用户会话超时或关闭浏览器时销毁 | session.getAttribute() |
application | ServletContext | 服务器重启时销毁 | application.getAttribute() |
🔍 2. 作用域优先级
graph TD
page --> request --> session --> application
查找顺序:从当前作用域依次向上查找,直到找到匹配的属性
四、作用域实战案例
🔥 案例 1:page 作用域
JSP 代码
<%-- page.jsp --%>
<%
pageContext.setAttribute("msg", "PAGE");
out.println("page 作用域 msg: " + pageContext.getAttribute("msg"));
%>
输出结果
page 作用域 msg: PAGE
🔥 案例 2:request 作用域
Servlet 代码
@WebServlet("/request")
public class RequestServlet extends HttpServlet {
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
req.setAttribute("user", "john");
req.getRequestDispatcher("/request.jsp").forward(req, resp);
}
}
JSP 代码
jsp
<%-- request.jsp --%>
request 作用域 user: ${requestScope.user}
🔥 案例 3:session 作用域
Servlet 代码
@WebServlet("/login")
public class LoginServlet extends HttpServlet {
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws IOException {
HttpSession session = req.getSession();
session.setAttribute("user", "admin");
resp.sendRedirect("/home.jsp");
}
}
JSP 代码
<%-- home.jsp --%>
session 作用域 user: ${sessionScope.user}
🔥 案例 4:application 作用域
Servlet 代码
@WebServlet("/counter")
public class CounterServlet extends HttpServlet {
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws IOException {
ServletContext app = getServletContext();
int count = (int) app.getAttribute("count");
app.setAttribute("count", ++count);
resp.getWriter().write("总访问量:" + count);
}
}
五、作用域协作案例
🔥 案例:用户信息展示(MVC 模式)
Servlet(Controller)
@WebServlet("/user")
public class UserServlet extends HttpServlet {
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
User user = userService.getUser(1);
req.setAttribute("user", user); // request 作用域
req.getRequestDispatcher("/user.jsp").forward(req, resp);
}
}
JSP(View)
<%-- user.jsp --%>
用户姓名:${requestScope.user.name}
🔥 案例:全局配置读取
web.xml
<context-param>
<param-name>appName</param-name>
<param-value>JavaWeb 学院</param-value>
</context-param>
Servlet 代码
ServletContext app = getServletContext();
String appName = app.getInitParameter("appName");
六、关联知识:作用域与其他技术
🔗 1. 与 Filter 的协作
@WebFilter("/*")
public class EncodingFilter implements Filter {
@Override
public void doFilter(ServletRequest req, ServletResponse res,
FilterChain chain) throws IOException, ServletException {
req.setCharacterEncoding("UTF-8");
res.setContentType("text/html;charset=UTF-8");
chain.doFilter(req, res);
}
}
🔗 2. 与 EL 表达式的协作
<%@ page contentType="text/html;charset=UTF-8" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<c:forEach items="${requestScope.students}" var="s">
${s.name}
</c:forEach>
七、课堂练习
练习 1:作用域实验
任务:
- 在
A.jsp
中向四个作用域存入相同键名的数据 - 在
B.jsp
中通过 EL 输出各作用域的值
练习 2:购物车功能
任务:
- 使用 session 作用域存储购物车商品
- 用 EL+JSTL 展示购物车列表
八、课程总结
知识图谱:
四大作用域
↳ page:页面级,响应结束即销毁
↳ request:请求级,转发可见
↳ session:会话级,跨请求保持
↳ application:应用级,全局共享
↳ 选择原则:
✅ 临时数据 → page/request
✅ 用户数据 → session
✅ 全局数据 → application
口诀记忆:
“作用域分四级,page 请求 session 应用,
生命周期各不同,选择场景要牢记,
EL 表达式真便利,${作用域。键} 取数据,
合理运用作用域,代码结构更清晰!”
九、课后作业
必做 1:多语言切换
要求:
- 使用 session 作用域存储用户语言偏好(中文 / 英文)
- 根据语言动态加载不同的资源文件
必做 2:应用级配置管理
任务:
- 在 web.xml 中配置数据库连接参数
- 使用 application 作用域读取并缓存这些参数