
本书主要包括IntelliJ IDEA,JDBC,Servlet,Vue四部分内容,这四部分是学习Java Web开发的重点。在IntelliJ IDEA部分介绍了40多种使用技巧,还介绍了IntelliJ IDEA的核心技能,包括调试Java项目,创建Java/Web/JavaMaven/WebMaven项目等。JDBC部分介绍如何处理海量数据的查询与添加操作,常见JDBC接口的使用等功能。Servlet部分介绍了request-response请求响应模型原理,接口Servlet,ServletConfig的使用,web.xml中常见的配置,HttpServletRequest和HttpServletResponse接口的使用等核心技术的使用。Vue章节介绍了模板语法、计算属性和侦听器、Class和Style操作、条件渲染、列表渲染、事件处理、等核心技能。最后以购物车的案例将所有知识点串联,达到综合演练的目的。
前 言 每当有 Java 学习者问我,怎么样才能学好 SSM(Spring-SpringMVC-MyBatis) 时,我都会陷入沉思,原因并不是不能立即给予答案,而是内心非常愧疚,又有学 习者遇到了迷茫点,而我能为他们做些什么呢?这就是本书出版的主要原因。 有 SSM 开发经验的人都知道,SSM 的基础是 Java SE 和 Java Web。如果在学习 SSM 之前没有打好 Java Web 的基础,则往往会遇到前面学习者同样的问题。因为 SSM 内部就是把 Java Web 相关的技术进行封装,如果不知道 Java Web 基础的技术 原理,又怎么能学好和写好 SSM 呢? 笔者认为,在从 Java SE 到 SSM 的过程中,最关键的技术是 Java Web 开发,它 能起到承上启下的作用。Java Web 能把 Java SE 传统的控制台开发方式转移到基于 B/S 架构的 Web 开发,能把从 Java SE 中学习的技术点应用到实际的 Web 场景。学 习 Java Web 后,读者能立即做一些小项目,如记事本、博客、留言板、企业网站等, 增加了他们继续学习的信心。当看到自己写的程序成功运行在互联网上时,那种学 会之后的成就感和自信心,只有经历过的人才能体会。 本书的写作风格是以案例的形式结合手把手式的教学,每一个小节都是一个技 术点,每一章就是一个学习目标和学习结果。本书由浅入深地介绍知识点,中间还 穿插一些浏览器开发者工具的使用,还深入 Tomcat 源代码探究技术的实现原理、剖 析 JDBC 驱动源代码内部的细节等,力求尽可能多地介绍更有实战价值的知识点, 让读者有所收获。 全书共分为 16 章: 第 1 章主要介绍 IntelliJ IDEA 开发工具的 50 多个常用的使用技巧,这些都是笔 者在开发中高频率使用的,有些技巧能大幅提升开发效率。学习后,也许你会感叹 Java Web 实操 IDE 具有如此强大的功能,操作方便,插件丰富,可以对提升开发效率产生事半功 倍的效果。 第 2 章主要介绍 IntelliJ IDEA 开发工具的核心技能,如调试程序代码、创建非 Maven 和 Maven 的 Java Web 项目、导出 jar 和 war 包文件、创建非 Maven 和 Maven 的多模块项目环境,还介绍了非 Maven 环境下的多 Web 模块的项目搭建,这些都是 Java 开发要创建的项目类型。本书基本上把常用的项目搭建场景都做了介绍,涵盖 面较广。 第 3 章主要介绍 JDBC 的核心技术,包含 JDBC 接口的介绍、不同注册驱动写 法的区别、使用 JDBC 实现基本的 CURD 操作、如何避免 SQL 注入、预编译的原理、 JDBC 使用 finally 的必要性、多条件查询、封装 DAO 类等。 第 4 章主要介绍 JDBC 的实战技术,本章也是学习 JDBC 的重点内容。可以说, MyBatis 框架中提供的核心功能的内部实现在本章都有介绍,如 JDBC 结合高性能的 连接池框架 HikariCP、在 JDBC 中如何处理事务、转账操作发生异常时事务为什么 不回滚及解决办法、使用 JDBC 操作 CLOB 和 BLOB 类型的数据、Batch 批处理的 使用、操作 Date 数据类型。另外,还介绍了 ACID 特性及对脏读、不可重复读和幻 读的理论解释。最为重要的是,本章用大量篇幅介绍了事务隔离性的代码实现,以 及与脏读、不可重复读和幻读的关系,并配有完整的代码进行论证,遵守“少废话, 上代码”的写作方式。 第 5 章主要介绍 Servlet 的核心技术,属于 Java Web 最核心的技术,详细介绍 了 Servlet 接口、ServletConfig 接口和 Servlet 接口的关系,以及接口中全部 API 的 应用实现,还详细介绍了 HttpServletRequest 和 HttpServletResponse 接口中常用 API 的使用,以及两种请求提交方式在传输内容及格式上的区别,并使用 Servlet+JDBC 实现基于 Web 的 CURD。 第 6 章主要介绍如何使用 Cookie 对象,在此基础上结合浏览器开发者工具,把 Cookie 在请求和响应中的传输过程进行可视化介绍,这样有助于读者学习 HttpSession,因为 HttpSession 的技术原理就是 Cookie。另外,还介绍了对 Cookie IV 前 言 V 进行 CURD 操作、在 Cookie 中读写中文等常用案例。 第 7 章主要介绍如何使用 HttpSession 接口,同时结合浏览器开发者工具,从内 部执行流程上查看 Cookie 和 HttpSession 的关系和完整的处理过程,还介绍了 HttpSession 中的 URL 重写技术、使用 HttpSession 实现简易版购物车等案例。可以 说,通过对本章内容的学习,读者会对 HttpSession 的原理有更加深入的了解。 第 8 章主要介绍如何使用 ServletContext 接口,介绍了 ServletContext 接口的使 用场景、与初始化参数的结合使用、实现 charset 编码可配置等常用案例。 第 9 章主要介绍如何使用 Filter 接口,该接口是 Java Web 开发中比较常用的技 术点,主要介绍了 Filter 的生命周期、私有/公共初始化参数的使用、使用注解声明 Filter、过滤链、使用 Filter 实现编码处理、过滤转发和请求、实现权限验证、结合 ThreadLocal 对 CookieTools 进行解耦等常用的使用案例。 第 10 章主要介绍如何使用 Listener 接口,将常用的 Listener 接口结合代码进行 详细介绍。 第 11 章主要介绍 JSP,JSTL 和 EL 必备技术,包含 JSP 和 Servlet 的关系、常 用 JSP 指令的使用、JSP 内部对象的使用、JSTL 和 EL 的使用,以及设计纯正的基 于 MVC 模式的分层应用。 第 12 章主要介绍异步处理 Ajax 技术,包含无参和有参、无返回值和有返回值 等常见场景的使用、get()和 post()两种方法的使用、异步和同步在执行上的区别、 formdata 和 payload 在提交格式上的区别、实现 form 有刷新和 Ajax 无刷新文件上传 等实战案例。 第 13 章主要介绍搭建 Maven Nexus 私服环境,包含下载 Nexus、安装 Nexus、 配置 Nexus,还介绍了 hosted,proxy 和 group 仓库的区别及在使用上的联系,并结 合 IDEA 实现 RELEASE 和 SNAPSHOT 版本的管理。 第 14 章主要介绍在 IDEA 中处理 Maven 项目的生命周期,并把 IDEA 中与 Maven 生命周期有关的菜单以案例的方式进行详细讲解。 第 15 章主要介绍 Maven 依赖的应用,包含依赖范围、依赖调解、可选依赖、 排除依赖、集中处理版本、显示依赖结构、源代码打包、跳过测试等常用使用方式。 Java Web 实操 第 16 章主要介绍 Maven 的聚合与继承,包含使用聚合和继承的目的及优势, 并在 IDEA 环境下创建这两种环境,目的是在实际的软件项目中更好地管理 Maven 项目。 虽然在此不能全部罗列本书讲解的技术点,但相信读者用心阅读本书后一定会 有所收获。笔者对本书的整理花费大量精力,力求使 Java Web 技术最核心的内容得 以体现,因为不管是现阶段的 SSM 框架还是未来更高级 Java Web 框架的出现,它 们的核心原理还是这些内容,因此,学好这些内容,再学习任何框架都不会怕。 本书的出版离不开背后辛勤工作的朋友,非常感谢李淑丽编辑对本书出版的付 出,李姐,辛苦了!还要感谢那些与我并没有直接交集的编辑们,虽然与他们素不 相识,但内心依然有很真诚的感谢。最后,也要感谢我的家人,我的爸爸、妈妈和 老婆,还有我最可爱的儿子高晟京,看到你们为家庭默默地付出,我该做些什么予 以报答呢?只有好好学习,好好工作!祝所有人身体健康。 高洪岩 于天津工业大学 2021-07-06
目 录 第 1 章 IntelliJ IDEA 常用技巧 ················································································.1 1.1 初次配置 IntelliJ IDEA ···············································································.2 1.2 创建 Java 项目 ···························································································.4 1.2.1 关联 JDK 并创建 Java 项目 ······································································.4 1.2.2 查看项目结构 ·······················································································.6 1.2.3 创建 Java 类 ·························································································.6 1.2.4 运行 Java 类 ·························································································.7 1.3 IntelliJ IDEA 相关配置与使用技巧 ······························································.7 1.3.1 配置界面皮肤 ·······················································································.8 1.3.2 设置 Eclipse 风格的快捷键 ······································································.8 1.3.3 更改代码编辑器文字大小 ········································································.8 1.3.4 快速生成代码 ························································································.8 1.3.5 设置快捷键“Alt+/” ···············································································.9 1.3.6 设置代码完成对大小写不敏感 ·································································.10 1.3.7 配置 JDK ···························································································.11 1.3.8 设置自动编译 ······················································································.13 1.3.10 抛出异常 ··························································································.13 1.3.11 使用“Ctrl+Alt+T”快捷键生成代码块 ····················································.13 1.3.12 使用 Generate 菜单生成方法 ··································································.14 1.3.13 使用 fori 生成 for 语句 ·········································································.16 1.3.14 实现自动导入的功能 ···········································································.16 1.3.15 实现水平或垂直分屏的功能 ··································································.16 1.3.16 树形显示包结构 ·················································································.17 1.3.17 设置“F2”键用于改名 ········································································.18 1.3.18 将类的方法抽取成接口 ········································································.18 1.3.19 Maven 项目下载源代码和帮助文档 ·························································.19 Java Web 实操 1.3.20 Find Usages 菜单查看方法调用 ······························································.20 1.3.21 增加控制台保存输出信息的缓冲区大小 ···················································.20 1.3.22 增加可用内存 ····················································································.21 1.3.23 启用 Toolbar ······················································································.21 1.3.24 显示方法分割符 ·················································································.21 1.3.25 设置文件编码 ····················································································.22 1.3.26 使用快捷键找到对应的功能名称 ····························································.24 1.3.27 使用快捷键自动生成返回值或声明变量 ···················································.24 1.3.28 使用快捷键实现代码导航 ·····································································.24 1.3.29 使用“F4”键查看类继承结构 ·······························································.24 1.3.30 使用快捷键查看类大纲结构 ··································································.24 1.3.31 使用快捷键搜索与替换文本功能 ····························································.25 1.3.32 使用“Ctrl+H”快捷键实现查询更大范围的功能 ········································.25 1.3.33 使用“Shift”键实现全局搜索 ·······························································.26 1.3.34 生成 UML 类图 ··················································································.27 1.3.35 使用快捷键查看方法的重写或实现 ····························································.28 1.3.36 使用快捷键查看文件 ···········································································.28 1.3.37 生成.jar 文件 ·····················································································.29 1.3.38 设置显示 API 文档提示框的延迟时间 ······················································.31 1.3.39 使用多行 Tab 显示 ··············································································.32 1.3.40 设置背景图片 ····················································································.32 1.3.41 自动生成 serialVersionUID 属性 ······························································.33 1.3.42 查看当前文件的位置 ···········································································.33 1.3.43 禁用 toString()方法查看对象内容 ····························································.34 1.3.44 设置注释不在最前面 ···········································································.35 1.3.45 连接数据库的配置 ··············································································.36 1.3.46 实现在控制台中进行查询 ·····································································.39 1.3.47 获取完整的包类路径 ···········································································.39 1.3.48 导入/导出 IntelliJ IDEA 的配置 ·······························································.40 1.3.49 使用 Toolbox App 管理 IntelliJ IDEA ························································.40 1.3.50 还原默认界面布局 ··············································································.41 1.3.51 使用内置控制台 ·················································································.41 VIII 目 录 1.3.52 查看参数信息 ····················································································.42 第 2 章 IntelliJ IDEA 核心技能 ···············································································.43 2.1 调试 Java 代码 ··························································································.43 2.1.1 准备调试代码 ······················································································.43 2.1.2 设置断点 ····························································································.44 2.1.3 调试 ··································································································.44 2.1.4 跟踪按钮解释 ······················································································.44 2.1.5 更改“force step into”按钮快捷键 ···························································.44 2.1.6 查看所有断点 ······················································································.45 2.1.7 设置条件断点 ······················································································.46 2.1.8 正确终止进程 ······················································································.46 2.1.9 设置运行到光标处暂停 ··········································································.47 2.1.10 显示完整包路径 ·················································································.47 2.2 为 Java 项目引用 jar 包文件 ······································································.48 2.2.1 使用 Global Libraries 引用 jar 包文件 ·························································.48 2.2.2 使用 Libraries 引用 jar 包文件 ··································································.52 2.2.3 使用 Add as Library 引用 jar 包文件 ··························································.54 2.3 对 Java 项目导出的.jar 文件实现转换 ························································.56 2.4 创建 Web 项目 ··························································································.57 2.4.1 创建 Java 项目并配置 Web 环境 ·······························································.57 2.4.2 使用向导创建 Servlet ············································································.59 2.4.3 添加与 Servlet 相关的.jar 文件依赖 ···························································.59 2.4.4 完善 Servlet 代码 ··················································································.59 2.4.5 创建 test1.jsp 文件 ················································································.60 2.4.6 关联 Tomcat ························································································.60 2.4.7 运行项目并解决 Tomcat 启动乱码 ····························································.62 2.4.8 实现热部署 ·························································································.63 2.4.9 上传文件路径的小提示 ··········································································.64 2.4.10 禁止启动 Tomcat 完成后弹出网页 ···························································.64 2.4.11 设置.html 文件自动缩进 ·······································································.64 2.4.12 导出 war 包文件 ·················································································.65 IX Java Web 实操 2.5 创建 Maven Web 项目 ···············································································.66 2.5.1 搭建 Maven 环境 ··················································································.67 2.5.2 创建 Maven Web 项目 ············································································.69 2.5.3 改变 JDK 版本 ·····················································································.71 2.5.4 创建 java 和 resource 文件夹 ···································································.71 2.5.5 其他方式创建 java 和 resources 文件夹 ······················································.72 2.5.6 创建 Servlet 类 ·····················································································.73 2.5.7 创建 JSP 文件 ······················································································.74 2.5.8 启动项目并解决 Servlet 打印乱码的问题 ····················································.75 2.5.9 解决 EL 表达式无效的问题 ····································································.75 2.5.10 导出 war 包文件 ·················································································.76 2.6 创建 Maven Java 项目并导出.jar 文件 ························································.77 2.6.1 创建 Maven Java 项目 ············································································.77 2.6.2 编辑 pom.xml 文件 ···············································································.79 2.6.3 创建运行类 ·························································································.79 2.6.4 执行运行类 ·························································································.80 2.6.5 打包并在 CMD 中运行类 ·······································································.80 2.7 配置全局 Maven ·······················································································.81 2.8 多 Modules 模块 Web 环境的搭建—非 Maven 环境 ·································.82 2.8.1 创建父项目 ·························································································.82 2.8.2 创建 DAO 子模块 ·················································································.83 2.8.3 创建 Service 子模块 ··············································································.84 2.8.4 创建 Web 子模块 ··················································································.84 2.8.5 在 DAO 模块中创建实体类及 DAO 类 ·······················································.85 2.8.6 在 Service 模块中引用 DAO 模块 ·····························································.86 2.8.7 创建 Global Libraries 全局库 ···································································.88 2.8.8 在 Web 模块中创建 Servlet ·····································································.88 2.8.9 创建 JSP 视图 ······················································································.89 2.8.10 启动 Tomcat 并解决类找不到的异常 ························································.90 2.8.11 导出.war 文件 ····················································································.91 2.9 多 Modules 模块 Web 环境的搭建—Maven 环境 ·····································.92 2.9.1 创建父项目 ·························································································.92 X 目 录 2.9.2 创建 DAO 子模块 ·················································································.92 2.9.3 创建 Service 子模块和 Web 子模块 ···························································.93 2.9.4 给 DAO 模块中的 pom.xml 文件添加依赖 ··················································.95 2.9.5 在 DAO 模块中创建 DAO 类 ···································································.95 2.9.6 在 Service 模块中创建业务类并引用 DAO 模块 ···········································.95 2.9.7 在 Web 模块中配置 Sources Root 文件夹 ····················································.96 2.9.8 给 Web 模块中的 pom.xml 文件添加依赖 ···················································.96 2.9.9 创建 Servlet ························································································.96 2.9.10 运行项目 ··························································································.97 2.9.11 导出.war 文件 ····················································································.97 2.10 多 Web Modules 模块环境的搭建—非 Maven 环境 ···································.98 2.10.1 创建 Empty Project ··············································································.98 2.10.2 创建 Web 模块 ···················································································.98 2.10.3 创建 Servlet ·······················································································.99 2.10.4 配置 Tomcat ······················································································.99 2.10.5 启动 Tomcat ····················································································.103 2.10.6 导出.war 文件 ··················································································.103 第 3 章 JDBC 核心技术 ·······················································································.104 3.1 什么是 JDBC ··························································································.104 3.2 为什么要使用 JDBC ···············································································.104 3.3 什么是 JDBC 驱动 ··················································································.106 3.4 JDBC 核心接口介绍 ···············································································.107 3.4.1 Driver ······························································································.107 3.4.2 Connection ························································································.109 3.4.3 Statement ··························································································.110 3.4.4 ResultSet ···························································································.111 3.4.5 PreparedStatement ···············································································.113 3.5 创建 Driver 对象 ·····················································································.114 3.6 创建 Connection 对象 ··············································································.114 3.7 创建 Statement 对象 ················································································.115 3.8 创建 ResultSet 对象 ·················································································.116 XI Java Web 实操 3.9 使用 Statement 接口有损软件的安全性 ····················································.117 3.10 创建 PreparedStatement 接口 ··································································.119 3.11 PreparedStatement 的预编译特性 ····························································.122 3.12 PreparedStatement 执行效率高 ·······························································.123 3.13 不同方式注册驱动的比较 ······································································.125 3.13.1 方法 1 ····························································································.125 3.13.2 方法 2 ····························································································.125 3.13.3 方法 3 ····························································································.126 3.13.4 读懂源代码的基本知识 ······································································.126 3.13.5 针对 MySQL 驱动源码分析 ·································································.127 3.13.6 针对 Oracle 驱动源码分析 ···································································.129 3.13.7 方法 3 的原理 ··················································································.130 3.13.8 三种方法的使用场景 ·········································································.132 3.14 使用 PreparedStatement 实现记录的增删改 ·············································.133 3.15 建议释放资源放入 finally 块 ··································································.136 3.16 实现 Connection 工厂类 ·········································································.142 3.17 多条件查询 ···························································································.145 3.18 DTO、ENTITY 和 DAO 介绍 ································································.147 3.19 将 JDBC 操作封装为 DAO 数据访问对象···············································.150 3.20 允许 MySQL 被远程访问 ······································································.156 第 4 章 JDBC 实战技术 ·······················································································.157 4.1 元数据的获取 ·························································································.157 4.2 简化 CURD 的操作代码 ··········································································.161 4.3 反射与泛型结合为泛型 DAO ··································································.163 4.4 数据源和连接池的使用 ···········································································.170 4.4.1 创建数据源接口的实现类 ·····································································.171 4.4.2 使用驱动提供的 DataSource 接口的实现类 ···············································.174 4.4.3 DataSource 接口的弊端 ········································································.175 4.4.4 连接池 ·····························································································.178 4.4.5 不使用连接池与使用连接池的比较 ·························································.179 4.4.6 HikariCP 作为连接池···········································································.180 XII 目 录 4.5 在 JDBC 中处理数据库的事务 ·································································.182 4.6 多事务导致转账发生异常不回滚 ·····························································.187 4.7 使用 ThreadLocal 解决问题 ·····································································.193 4.8 使用 JDBC 操作 CLOB ···········································································.200 4.8.1 添加 CLOB 类型的数据 ·······································································.200 4.8.2 获取 CLOB 字段中的数据 ····································································.201 4.9 使用 JDBC 操作 BLOB ···········································································.203 4.9.1 添加 BLOB 类型的数据 ·······································································.203 4.9.2 获取 BLOB 字段的数据 ·······································································.205 4.10 实现 Batch 批处理 ·················································································.207 4.11 插入 Date 数据类型并查询区间 ·····························································.210 4.12 返回最新版的 ID 值 ··············································································.212 4.13 事务的 ACID 特性 ················································································.214 4.14 数据库事务的类型 ················································································.215 4.15 脏读、可重复读、不可重复读及幻读的解释 ··········································.216 4.16 事务隔离级别 ·······················································································.217 4.16.1 TRANSACTION_READ_UNCOMMITTED ·············································.217 4.16.2 TRANSACTION_READ_COMMITTED ··················································.224 4.16.3 TRANSACTION_REPEATABLE_READ ·················································.231 4.16.4 TRANSACTION_SERIALIZABLE ························································.238 第 5 章 Servlet 核心技术 ·····················································································.245 5.1 Servlet 简介 ····························································································.245 5.2 更改访问 Tomcat 的端口号 ······································································.247 5.3 Servlet 技术开发 ·····················································································.248 5.3.1 Servlet 的继承与实现关系 ····································································.249 5.3.2 创建基于 xml 的 Servlet 案例 ································································.251 5.3.3 正确与错误配置 Servlet 的不同情况 ························································.254 5.3.4 创建基于注解的 Servlet 案例 ·································································.257 5.3.5 接口 Servlet ······················································································.259 5.3.6 接口 ServletConfig ··············································································.267 5.3.7 使用<load-on-startup>配置 Servlet ···························································.275 XIII Java Web 实操 5.3.8 使用注解实现<load-on-startup>的功能 ·····················································.276 5.3.9 执行 doGet()方法或 doPost()方法的方式 ···················································.278 5.3.10 doGet()方法与 doPost()方法的区别 ························································.280 5.3.11 Application context 选项的作用 ·····························································.282 5.3.12 HttpServletRequest 和 HttpServletResponse 接口的使用 ·······························.282 5.3.13 配置 Servlet 具有后缀 ········································································.317 5.4 请求与响应 ····························································································.318 5.4.1 请求/响应模型 ···················································································.318 5.4.2 请求与响应的数据格式 ········································································.319 5.5 使用 Servlet+JDBC 实现基于 Web 的 CURD 增删改查 ······························.323 第 6 章 Cookie 对象 ····························································································.340 6.1 创建 Cookie ····························································································.340 6.2 查询 Cookie ····························································································.342 6.3 修改 Cookie ····························································································.343 6.4 删除 Cookie ····························································································.343 6.5 设置 setMaxAge()值为负数 ······································································.344 6.6 使用 Cookie 存储中文或空格 ···································································.344 6.7 为什么找不到 Cookie ··············································································.345 6.8 创建工具类封装 Cookie 操作 ···································································.346 6.9 使用 Cookie 实现免登录 ··········································································.348 第 7 章 HttpSession 接口 ····················································································.351 7.1 HttpSession 接口的使用 ···········································································.352 7.2 HttpServletRequest 接口与 HttpSession 的区别 ··········································.353 7.3 Session 与 Cookie 的运行机制 ·································································.355 7.4 HttpSession 接口与 URL 重写 ··································································.358 7.5 使用 HttpSession 实现免登录功能 ····························································.363 7.6 使用 HttpSession 实现简易购物车功能 ·····················································.365 7.6.1 创建一个 V 层 ···················································································.366 7.6.2 创建三个 C 层 ···················································································.366 7.6.3 创建两个 entity 实体类 ········································································.368 7.6.4 创建两个 DAO 数据访问层 ···································································.369 XIV 目 录 7.6.5 创建三个 Model 业务逻辑层 ·································································.370 第 8 章 ServletContext 接口 ················································································.372 8.1 session 中的数据是私有的 ·······································································.373 8.2 ServletContext 中的数据是公共的 ····························································.374 8.3 ServletConfig.getInitParameter()方法的弊端 ··················································.375 8.4 使用 ServletContext.getInitParameter()方法解决问题 ·································.377 8.5 实现 charset 编码可配置 ··········································································.379 8.6 使用 getRealPath("/")方法获取项目运行的路径 ············································.380 第 9 章 Filter 接口 ·······························································································.381 9.1 Filter 的使用 ···························································································.382 9.2 Filter 的生命周期 ····················································································.385 9.3 获取私有/公共 init 初始化参数 ································································.387 9.4 使用注解声明 Filter ················································································.389 9.5 过滤链的顺序——xml 方式 ·····································································.390 9.6 过滤链的顺序——annotation 方式 ···························································.392 9.7 使用 Filter 实现编码的处理 ·····································································.393 9.8 Filter 拦截请求和转发 ·············································································.395 9.9 使用 Filter 实现权限验证 ·········································································.398 9.10 综合使用 Filter+ThreadLocal+Cookie 实现解耦合 ·······································.401 9.11 使用 Cookie 实现购物车的核心逻辑 ······················································.406 第 10 章 Listener 接口 ························································································.412 10.1 HttpSessionActivationListener 接口的使用 ···············································.412 10.2 HttpSessionAttributeListener 接口的使用 ·················································.416 10.3 HttpSessionBindingListener 接口的使用 ··················································.418 10.4 HttpSessionListener 接口的使用 ·····························································.420 10.5 ServletContextAttributeListener 接口的使用 ·············································.421 10.6 ServletContextListener 接口的使用 ·························································.424 10.7 ServletRequestAttributeListener 接口的使用 ············································.427 10.8 ServletRequestListener 接口的使用 ·························································.429 10.9 HttpSessionIdListener 接口的使用 ··························································.430 XV Java Web 实操 10.10 使用 HttpSessionListener 接口实现在线人数统计 ·······························.432 第 11 章 JSP-JSTL-EL 必备技术 ·········································································.435 11.1 JSP 技术 ·······························································································.435 11.1.1 使用 Servlet 生成网页 ········································································.435 11.1.2 使用 JSP 生成网页 ············································································.436 11.1.3 在 JSP 中执行 Java 程序 ·····································································.438 11.1.4 JSP 本质上是 Servlet ··········································································.440 11.1.5 JSP 文件的内容 ················································································.445 11.1.6 JSP 的指令 ······················································································.447 11.1.7 几种指令的区别 ···············································································.448 11.1.8 验证 Servlet 使用 write()方法和 print()方法进行输出 ··································.449 11.1.9 从 Servlet 转发到 JSP 文件 ··································································.452 11.1.10 Java 代码块<%%>和<%!%>的区别 ······················································.453 11.1.11 内置对象 pageContext 的使用 ·····························································.455 11.1.12 常用内置对象的使用 ········································································.457 11.1.13 使用 pageContext 向不同作用域中存取值 ··············································.459 11.1.14 使用<%@ include file=""%>指令静态导入其他资源 ·································.460 11.1.15 使用<jsp:include page=" ">动态导入其他资源 ·········································.461 11.1.16 JSP 的注释 ····················································································.462 11.1.17 使用<jsp:useBean>,<jsp:setProperty>和<jsp:getProperty>访问类信息 ···········.463 11.1.18 使用<jsp:forward page="">实现转发 ·····················································.465 11.2 JSTL 和 EL 表达式 ················································································.466 11.2.1 使用 EL 表达式获取字符串 ·································································.466 11.2.2 使用 EL 表达式获取 JavaBean 中的数据 ·················································.467 11.2.3 使用 EL 表达式查找数据 ····································································.467 11.2.4 key 优先获取作用域小的 scope 值 ·························································.468 11.2.5 使用 EL 表达式获取指定作用域中的值 ··················································.468 11.2.6 使用 EL 表达式打印 property 属性名 ·····················································.468 11.2.7 使用 EL 表达式获取 List,array[]与 Map 中的数据 ···································.469 11.2.8 使用 EL 表达式输出 NULL 值 ······························································.471 11.2.9 使用 EL 表达式打印嵌套中的值 ···························································.472 XVI 目 录 11.2.10 在 EL 表达式中使用 empty 进行空的判断 ··············································.472 11.2.11 使用${param}获取 URL 中的参数值 ····················································.474 11.2.12 使用 JSTL 表达式进行逻辑处理 ··························································.474 11.2.13 对 Date 进行 String 格式化 ·································································.477 11.3 实现基于 MVC 的 CURD 增删改查 ························································.477 第 12 章 异步处理 AJAX 技术 ·············································································.493 12.1 实现无传参无返回值——get 提交方式 ···················································.494 12.2 实现有传参无返回值——get 提交方式 ···················································.495 12.3 实现无传参无返回值——post 提交方式 ·················································.496 12.4 实现有传参无返回值——post 提交方式 ·················································.497 12.5 实现无传参有返回值 String——get 提交方式 ·········································.497 12.6 实现无传参有返回值 XML——get 提交方式 ··········································.499 12.7 实现异步效果 ·······················································································.500 12.8 实现同步效果 ·······················································································.501 12.9 实现无刷新 login 登录案例 ····································································.502 12.10 formdata 和 payload 提交 ······································································.504 12.10.1 测试 get 方式传输数据需要依赖 URL ···················································.506 12.10.2 测试 post 提交使用 formdata 方式传输数据 ············································.508 12.10.3 测试 post 提交使用 payload 方式传输数据 ·············································.511 12.11 实现文件上传:<form>有刷新 ·····························································.513 12.12 实现文件上传:AJAX 无刷新 ······························································.515 第 13 章 搭建 Maven Nexus 私服环境 ································································.516 13.1 下载 Nexus OSS 版本 ············································································.517 13.2 配置 Nexus OSS 环境变量 ·····································································.520 13.3 安装服务和启动服务 ·············································································.520 13.4 登录 Nexus ···························································································.521 13.5 重置 Nexus 登录密码 ············································································.523 13.6 解决连接异常 ·······················································································.524 13.7 仓库的类型 ···························································································.526 13.8 创建 hosted 类型的 Maven 仓库 ·····························································.527 13.9 创建 proxy 类型的 Maven 仓库 ······························································.529 XVII Java Web 实操 13.10 创建 group 类型的 Maven 仓库 ····························································.531 13.11 group-local-proxy 仓库之间的关系 ························································.532 13.12 配置 Nexus 私服 URL ··········································································.532 13.13 配置登录 Nexus 的账号和密码 ·····························································.533 13.14 开启 SNAPSHOT 版本支持 ··································································.534 13.15 确认 maven-group 仓库内容为空 ··························································.535 13.16 在 IDEA 中创建测试用的项目 ·····························································.536 13.17 创建 Java 类和执行 deploy 操作 ···························································.537 13.18 成功进行依赖 ·····················································································.540 13.19 获取最新的 RELEASE 版本 ·································································.542 13.20 在 Maven 仓库中进行搜索 ···································································.543 第 14 章 Maven 项目生命周期 ············································································.545 14.1 生命周期 ······························································································.545 14.1.1 clean 生命周期 ·················································································.546 14.1.2 default 生命周期 ···············································································.546 14.1.3 site 生命周期 ···················································································.547 14.2 创建测试项目 ·······················································································.550 14.3 clean 菜单的使用 ··················································································.553 14.4 validate 菜单的使用 ···············································································.553 14.5 compile 菜单的使用 ··············································································.555 14.6 test 菜单的使用 ·····················································································.556 14.7 package 菜单的使用 ··············································································.557 14.8 verify 菜单的使用 ·················································································.558 14.9 install 菜单的使用 ·················································································.558 14.10 site 菜单的使用 ···················································································.559 14.11 deploy 菜单的使用 ···············································································.560 第 15 章 Maven 依赖的应用 ················································································.561 15.1 依赖的范围 ···························································································.561 15.1.1 依赖范围:compile ···········································································.561 15.1.2 依赖范围:test ·················································································.564 15.1.3 依赖范围:provided ··········································································.565 XVIII 目 录 15.1.4 依赖范围:runtime ············································································.566 15.1.5 四种依赖范围总结 ············································································.568 15.2 传递性依赖和依赖范围 ·········································································.568 15.3 依赖调解 ······························································································.573 15.3.1 最短路径 ························································································.573 15.3.2 路径相同 ························································································.576 15.4 可选依赖 ······························································································.577 15.5 排除依赖 ······························································································.580 15.6 集中处理版本 ·······················································································.582 15.7 显示依赖结构 ·······················································································.584 15.7.1 在 IDEA 中显示依赖结构 ···································································.584 15.7.2 使用命令 mvn dependency:list 显示依赖列表 ············································.586 15.7.3 使用命令 mvn dependency:tree 显示依赖树 ··············································.587 15.7.4 使用命令 mvn dependency:analyze 分析依赖 ············································.588 15.8 依赖 snapshot 版本的自动更新特性 ························································.590 15.9 将 source 源代码打包并发布 ··································································.593 15.10 跳过测试 ·························································································.594 第 16 章 Maven 的聚合与继承 ············································································.596 16.1 项目的聚合 ···························································································.596 16.1.1 创建父项目 ·····················································································.596 16.1.2 创建 DAO 子模块 ·············································································.597 16.1.3 创建 Service 子模块和 Web 子模块 ························································.598 16.1.4 编辑 DAO 子模块中的 pom.xml 配置文件 ···············································.600 16.1.5 创建 DAO 类并发布 ··········································································.600 16.1.6 创建 Service 类并引用 DAO 子模块 ·······················································.601 16.1.7 编辑 Service 子模块中的 pom.xml 配置文件并发布 ···································.602 16.1.8 创建 java 和 resources 文件夹 ·······························································.603 16.1.9 添加 Servlet 和 JSTL 依赖 ···································································.603 16.1.10 创建 Servlet 类并引用 Service 子模块 ···················································.603 16.1.11 编辑 Web 子模块中的 pom.xml 配置文件并发布 ······································.604 16.1.12 运行项目 ·······················································································.605 XIX Java Web 实操 16.1.13 自动导出 war 包文件 ········································································.605 16.1.14 远程仓库中的内容 ···········································································.606 16.2 实现项目的继承 ····················································································.607 16.2.1 搭建继承环境 ··················································································.608 16.2.2 配置<dependencyManagement></dependencyManagement> ···························.616 16.2.3 配置<scope>import</scope>依赖范围 ·····················································.622 16.2.4 配置<pluginManagement></pluginManagement> ········································.628