1. 简介
1.1. Contexte
文档中的 PDF 可在 |HERE| 处找到。
文档中的示例可参见 |HERE|。
本文既是一门课程,也是一份大学TD(指导作业)。它面向初学者。本文参考了以下资料:
参考资料:
我们将分别将这些参考文献标记为 [ref1] 和 [ref2]。参考文献 [ref1] 虽已过时(2002年),但对于本文而言已足够,本文仅将其用于介绍 Java 语言的语法及其基本操作。 本文件中,实现 TD 所需的其余内容在标题为 [Cours] 的章节中呈现。这些章节直接源自 [ref2](2015年),部分内容已进行简化。
本文件旨在从职业角度教授Java语言。因此,我们大量采用了在JEE(Java企业版)开发中广泛使用的Spring框架[http://spring.io/]。 从逻辑上讲,本课程应作为JEE课程的后续学习。在安格斯大学(Istia)便是如此。目前(2015年11月),JEE是拥有硕士学位的年轻开发人员的主要就业来源。 在JEE领域中,除了Spring之外还有许多其他技术。Spring的优势在于其易于理解,更重要的是它提供了可在Spring生态系统之外复用的良好编码实践。这正是本课程选择Spring的原因。
该TD已使用超过10年,并随着技术的发展而不断演进。 其后续版本(在IstiA之后)包括TD、JEE和[Introduction à Java EE]。 最新版本TD发布于2012年(当前为2015年),亟待更新。 该文档通过JSF2(Java Server Faces)和EJB3(Enterprise Java Bean)这两个Web框架,阐述了JEE的正统规范。 这两项技术相结合,帮助许多学生在数字服务企业中获得了实习机会,并随即被录用。
本文并非对Java所有方面的正式介绍。多年来,初级开发人员面对问题时的行为方式发生了很大变化。如今,他们几乎总是利用互联网寻找代码片段,将这些片段拼凑起来便形成了一个程序。 即便提供课程资料,他们也鲜少使用,仍更倾向于上网搜索。起初我对这种工作方式持怀疑态度,但最终取得的成果令我惊讶。那些成绩较差的学生竟能编写出可运行的程序,而若没有互联网的帮助,他们很可能无法做到这一点。因此,我现在采用这种工作方式。
零散的代码片段无法展现解决方案的整体架构,而阐明这一架构正是本文件的目标之一。学生们像完成TP那样,自主完成TD。这里没有讲授式课程。 课程安排明确了各阶段的预期进度。学生可以快于或慢于该进度。他们的学习进度将通过若干次向教师提交的成果验证来核查。教师既会在学生提出要求时提供解释,也会对他们的作业进行评估。每个人都按自己的节奏学习。 在为该课程TD分配的36小时结束时,有些人完成的考核任务可能比其他人多出50%,但无论如何,我们的目标是确保每个人都能理解自己自主完成的内容。 本TD课程无需教师指导即可完成。因此,该课程已在[https://tahe.developpez.com]平台上线。
本文件不适合那些寻求Java学术课程的人——即那种循序渐进、结构清晰,且对每个语法细节都进行详细解释和论证的课程。 本文提供的是更具实验性的学习方法。学生可能无法完全理解文档中的所有内容,但通常能够合理运用其中知识,而对细节的理解将随着实践经验的积累而逐渐加深。
本文同样不是算法课程。TD算法非常基础,任何刚接触算法课程的初学者都能解决。 本文档重点关注Java专业开发环境及其丰富的库和框架,以及代码架构。我接触的大多数学生在算法方面都存在薄弱环节,这一点随后也得到了实习导师的证实。因此,虽然掌握算法很重要,但这并非本习题课的重点。
最后,本文件(2015年12月版)未涵盖Java的最新特性,特别是流(streams)和lambda表达式。 不过,其中使用了一些最新版本JDK(即JDK 1.8)的特性,后续代码需使用该版本进行编译。
1.2. Contenu
第2章介绍了TD这一主题,即选举结果的计算。这是一个基础性问题。第2章要求使用C#和Java这两种非常相似的语言来实现该解决方案。 实现过程中不使用类。本章旨在介绍Java的语法、基本语句,以及用于构建Java项目的集成开发环境(IDE)Eclipse。
第3章要求使用Java类实现该解决方案。其目的是介绍类、继承、接口和泛型类等概念。同时引入了单元测试的概念。
第4章介绍了后续章节的基础概念:
- 分层架构;
- 基于接口的编程;
- 使用 Spring 实现上述两个概念;

第5章通过四个项目介绍了Spring框架。
第6章介绍了API JDBC,这是一个数据库访问接口。
第7章利用API、JDBC和Spring,实现了TD的[DAO](数据访问对象)层。

第 8 章实现了 TD 的 [métier] 层:

第 9 章通过一个控制台应用程序实现了 TD 的 [ui] 层:

第 10 章通过使用 Swing 组件库的图形应用程序实现了 TD 的 [ui] 层:


第 11 章介绍了如何使用 [Spring Data] 框架(Spring 生态系统的一个分支)进行数据库管理。 本章介绍了 JPA 规范(Java Persistence API),该规范使 [DAO] 层能够操作对象,而非直接操作 SQL (结构化查询语言)。分层架构演变如下:

第 12 章通过使用 [Spring Data] 实现对 TD 数据库的访问,从而应用了第 11 章的内容。
第13章展示了如何使用[Spring MVC](Spring生态系统的另一个分支)将数据库发布到Web上。架构演变为客户端/服务器架构:

第 14 章和第 15 章将 TD 中的应用程序转换为客户端/服务器应用程序:

第 16 章演示了如何使用 [Spring Security](Spring 生态系统的另一个分支)来保障 Web 应用程序的访问安全。

第 17 章延续 TD 的内容,并为选举 Web 服务提供安全保障。
第 18 章探讨了跨域请求的问题:
![]() |
- 在 [1] 中,一个 Web 应用程序提供 HTML / JavaScript 页面;
- 在 [2] 中,浏览器执行 HTML 页面中嵌入的 JavaScript,以查询安全 Web 服务 [3-4];
假设 D1=http://machine1:port1 是服务器 [1] 的域名,D4=http://machine4:port4 是服务器 [4] 的域名。 如果服务器 [1] 和 [4] 不属于同一个域名 [D1!=D4], 那么 [3] 向 [4] 发出的请求就被称为跨域请求。由于浏览器实施的安全限制,其配置可能会遇到问题。我们将探讨一种解决方案。
第 19 章将通过选举应用程序来实现跨域请求。
1.3. 使用的工具
以下示例已在以下环境中经过测试:
- Windows 10 Pro 64位系统;
- JDK 1.8(第22.1节);
- IDE Spring Tool Suite 3.6.3(第1节);
- NetBeans 8.1(第 22.4 节);
- Chrome 浏览器(未使用其他浏览器);
- Chrome 扩展程序 [Advanced Rest Client](第 1 段);
- WampServer,该工具调用 SGBD、MySQL 以及 [PhpMyAdmin] 进行管理(第 22.7 段);
务必使用 JDK 1.8 版本。部分示例使用了该 JDK 中的组件。 大多数示例都是 Maven 项目,可通过 IDE、Eclipse [https://www.eclipse.org/]、 IntellijIDEA Community Edition、[https://www.jetbrains.com/idea/download/] 以及 NetBeans [https://netbeans.org/] 均可打开。下文中的屏幕截图均来自 IDE Spring Tool Suite(Eclipse 的一个变体)。
1.4. 支持
本文档中的 Eclipse 项目可在 [https://tahe.developpez.com/tutoriels-cours/intro-java-spring/serge-tahe-introduction-au-langage-java-et-a-l-ecosysteme-spring/] 网站上获取。
![]() |
要导入某章节的项目,请按照 [1-8] 中的说明在 Eclipse 中操作:
![]() |
大多数项目均为 Maven 项目。若加载后出现错误,请执行 [Alt-F5] 并按照 [9-10] 中的步骤操作。所选的 Maven 项目将被重新构建。
![]() |



