Java Web 核心知识点总结
一、HTTP协议
-
核心概念
- 请求/响应模型
- 无状态协议
- 持久连接
-
关键要素
- 请求方法(GET/POST/PUT/DELETE)
- 状态码(2xx成功/3xx重定向/4xx客户端错误/5xx服务器错误)
- 常用请求头和响应头
二、Servlet
-
生命周期
- 加载类
- 创建实例(单例)
- init()初始化
- service()服务
- destroy()销毁
-
核心功能
- 接收请求参数
- 处理业务逻辑
- 响应处理结果
- 请求转发与重定向
三、JSP
-
运行原理
- JSP转译成Servlet
- 编译成class文件
- 加载和执行
-
核心要素
- 脚本元素
- 指令元素
- 九大内置对象
- 四大作用域
JSP九大内置对象和四大作用域详解与应用场景
一、常用内置对象及最佳实践
1. request对象
核心功能
- 获取请求参数
- 获取请求头
- 获取客户端信息
典型应用场景
- 处理表单提交
java">// 用户注册表单处理 String username = request.getParameter("username"); String password = request.getParameter("password"); String[] hobbies = request.getParameterValues("hobby"); // 复选框// 获取客户端信息 String clientIP = request.getRemoteAddr(); String userAgent = request.getHeader("User-Agent");
- 文件上传
java">// 获取上传的文件 Part filePart = request.getPart("file"); String fileName = filePart.getSubmittedFileName();
2. session对象
核心功能
- 会话管理
- 用户状态维护
- 登录信息存储
典型应用场景
- 用户登录状态管理
java">// 登录成功后存储用户信息 User user = userService.login(username, password); if(user != null) {session.setAttribute("loginUser", user); }// 检查用户是否登录 User loginUser = (User)session.getAttribute("loginUser"); if(loginUser == null) {response.sendRedirect("login.jsp"); }
- 购物车实现
java">// 添加商品到购物车 @SuppressWarnings("unchecked") List<Item> cart = (List<Item>)session.getAttribute("cart"); if(cart == null) {cart = new ArrayList<>();session.setAttribute("cart", cart); } cart.add(new Item(productId, quantity));
3. application对象
核心功能
- 全局数据存储
- 应用级配置
典型应用场景
- 网站访问统计
java">// 统计在线人数 Integer onlineCount = (Integer)application.getAttribute("onlineCount"); if(onlineCount == null) {onlineCount = 1; } else {onlineCount++; } application.setAttribute("onlineCount", onlineCount);
- 系统初始化配置
java">// 在应用启动时加载配置 public void contextInitialized(ServletContextEvent sce) {ServletContext application = sce.getServletContext();// 加载系统配置Properties config = loadSystemConfig();application.setAttribute("sysConfig", config); }
4. out对象 (JspWriter)
核心功能
- 向客户端输出内容
- 管理输出缓冲区
典型应用场景
- 动态输出HTML内容
<% List<User> users = userService.findAll(); for(User user : users) {out.println("<tr>");out.println("<td>" + user.getName() + "</td>");out.println("<td>" + user.getAge() + "</td>");out.println("</tr>"); } %>
- 控制缓冲区
<% out.clearBuffer(); // 清除缓冲区 out.flush(); // 刷新缓冲区 int size = out.getBufferSize(); // 获取缓冲区大小 int remaining = out.getRemaining(); // 获取剩余大小 %>
5. pageContext对象 (PageContext)
核心功能
- 统一访问其他内置对象
- 管理页面属性
- 提供便捷查找方法
典型应用场景
- 统一获取属性
<% // 搜索所有作用域 Object value = pageContext.findAttribute("user");// 获取指定作用域的属性 Object pageValue = pageContext.getAttribute("name", PageContext.PAGE_SCOPE); Object requestValue = pageContext.getAttribute("name", PageContext.REQUEST_SCOPE); %>
- 获取其他内置对象
<% HttpServletRequest request = (HttpServletRequest)pageContext.getRequest(); ServletContext application = pageContext.getServletContext(); HttpSession session = pageContext.getSession(); %>
6. config对象 (ServletConfig)
核心功能
- 获取Servlet初始化参数
- 获取Servlet名称
典型应用场景
- 读取初始化参数
<%-- web.xml配置 --%> <servlet><servlet-name>MyServlet</servlet-name><init-param><param-name>dbUrl</param-name><param-value>jdbc:mysql://localhost:3306/mydb</param-value></init-param> </servlet><%-- JSP中使用 --%> <% String dbUrl = config.getInitParameter("dbUrl"); String servletName = config.getServletName(); %>
7. page对象 (Object)
核心功能
- 代表当前JSP页面的实例
- 类似于Java类中的this引用
典型应用场景
- 获取页面信息
<% String servletInfo = page.getServletInfo(); String className = page.getClass().getName(); %>
8. exception对象 (Throwable)
核心功能
- 处理JSP页面异常
- 获取异常信息
典型应用场景
- 错误页面处理
<%-- 错误页面: error.jsp --%> <%@ page isErrorPage="true" %> <html> <head><title>Error</title></head> <body>错误信息: <%= exception.getMessage() %>堆栈跟踪: <% exception.printStackTrace(new java.io.PrintWriter(out)); %> </body> </html><%-- 普通页面指定错误页面 --%> <%@ page errorPage="error.jsp" %>
9. response对象 (HttpServletResponse)(前面已详细介绍)
实际开发建议
1. 使用频率排序
- request/response:最常用,请求处理的基础
- session:用户状态管理必备
- out:动态输出内容
- pageContext:获取其他对象和属性
- application:全局数据
- config:初始化配置
- page:较少使用
- exception:错误处理
2. 最佳实践
- 缓冲控制
<% // 设置不缓存页面 response.setHeader("Cache-Control", "no-cache"); response.setHeader("Pragma", "no-cache"); response.setDateHeader("Expires", -1); %>
- 异常处理
<% try {// 业务代码 } catch(Exception e) {// 记录日志pageContext.setAttribute("error", e.getMessage());// 转发到错误页面pageContext.forward("error.jsp"); } %>
- 属性读写
<% // 推荐使用pageContext统一访问属性 pageContext.setAttribute("user", user, PageContext.SESSION_SCOPE); User sessionUser = (User)pageContext.getAttribute("user", PageContext.SESSION_SCOPE);// 查找属性(按PAGE、REQUEST、SESSION、APPLICATION顺序) Object value = pageContext.findAttribute("searchKey"); %>
二、四大作用域实战应用
1. page作用域
适用场景: 当前页面的临时变量
<%-- 在复杂页面中暂存计算结果 --%> <% pageContext.setAttribute("total", calculateTotal()); %> ... 页面其他处理 ... 总价: ${pageContext.getAttribute("total")}
2. request作用域
适用场景: 请求转发时的数据传递
java">// 在MVC模式中的应用 public class ProductServlet extends HttpServlet {protected void doGet(HttpServletRequest request, HttpServletResponse response) {// 查询商品列表List<Product> products = productService.findAll();// 存储到requestrequest.setAttribute("products", products);// 转发到JSP页面request.getRequestDispatcher("/product/list.jsp").forward(request, response);} }
3. session作用域
适用场景: 用户会话相关的数据
java">// 多步骤表单提交 public class RegisterServlet extends HttpServlet {// 第一步:基本信息protected void doPost(HttpServletRequest request, HttpServletResponse response) {UserDTO userDTO = new UserDTO();userDTO.setUsername(request.getParameter("username"));userDTO.setEmail(request.getParameter("email"));// 存储到sessionrequest.getSession().setAttribute("userDTO", userDTO);response.sendRedirect("register-step2.jsp");}// 第二步:详细信息protected void doPost(HttpServletRequest request, HttpServletResponse response) {UserDTO userDTO = (UserDTO)request.getSession().getAttribute("userDTO");// 补充详细信息userDTO.setAddress(request.getParameter("address"));// 完成注册userService.register(userDTO);// 清理sessionrequest.getSession().removeAttribute("userDTO");} }
4. application作用域
适用场景: 全站共享的数据
java">// 系统字典数据缓存 @WebListener public class DictionaryListener implements ServletContextListener {@Overridepublic void contextInitialized(ServletContextEvent sce) {ServletContext application = sce.getServletContext();// 加载系统字典Map<String, List<Dict>> dictMap = dictService.loadAllDict();application.setAttribute("systemDict", dictMap);} }// 在JSP中使用 <select name="status"><c:forEach items="${applicationScope.systemDict.status}" var="dict"><option value="${dict.code}">${dict.name}</option></c:forEach> </select>
作用域选择建议
-
数据生命周期
- 临时计算结果 -> page
- 一次性展示数据 -> request
- 用户相关状态 -> session
- 全局共享数据 -> application
-
性能考虑
- session数据不宜过多,会占用服务器内存
- application数据要考虑并发安全
- request作用域最常用且最安全
-
安全考虑
- 敏感数据优先存储在session
- application数据要考虑权限控制
这些场景和示例展示了不同作用域的实际应用,帮助我们在开发中选择合适的作用域来存储数据。
四、JDBC
-
核心步骤
- 加载驱动
- 建立连接
- 创建语句
- 执行SQL
- 处理结果
- 释放资源
-
关键技术
- 连接池
- 预编译SQL
- 事务处理
- 批处理操作
五、会话管理
-
Cookie
- 客户端存储
- 键值对格式
- 有效期设置
- 域和路径限制
-
Session
- 服务端存储
- 会话跟踪
- 超时机制
- 会话安全
六、核心过滤器和监听器
-
Filter
- 请求过滤
- 响应过滤
- 编码处理
- 权限控制
-
Listener
- 生命周期监听
- 属性变更监听
- 会话监听
- 应用监听
七、MVC模式
-
组成部分
- Model(JavaBean)
- View(JSP)
- Controller(Servlet)
-
核心价值
- 解耦
- 复用
- 维护性
- 可扩展性