正所谓:“工欲善其事,必先利其器”,在正式开始设计并开发我们的轻量级Java Web 框架之前,有必要掌握以下技能:
- 使用 IDEA 搭建并开发 Java 项目;
- 使用 Maven 自动化构建 Java 项目;
- 使用 Git 管理项目源代码;
我的程序之旅
正所谓:“工欲善其事,必先利其器”,在正式开始设计并开发我们的轻量级Java Web 框架之前,有必要掌握以下技能:
RESTful 成熟度模型
Level 0: 使用 HTTP 作为传输方式
Level 1: 引入资源的概念,每个资源都有对应的 URL
Level 2: 使用 HTTP 方法进行不同的操作,使用不同的 HTTP 状态码来表示不同的结果
Level 3: 使用超媒体,在资源的表达中包含了链接信息
抽象数据类型(ADT,abstract data type)是指一些数据以及对这些数据所进行的操作的集合。
一个ADT可能是一个图形窗体以及所有能影响该窗体的操作;也可以是一个文件以及对这个文件进行的操作;或者是一张保险费率表以及相关操作等。
‘深入一种语言去编程’而不是‘在一种语言上编程’。
可以隐藏实现细节
改动不会影响到整个程序
更容易提高性能
让程序的正确性更显而易见
程序更具有自我说明性
无需在程序内到处传递数据
你可以像在现实世界中那样操作实体,而不用在底层实现上操作它
把常见的底层数据类型创建为 ADT 并使用这些 ADT ,而不再使用底层数据类型
把像文件这样的常用对象当成 ADT
简单的事物也可以当做 ADT
不要让 ADT 依赖于其存储介质
Class = ADT + 继承 + 多态
类的接口应该展现一致的抽象层次
一定要理解类所实现的抽象是什么
提供成对的服务
把不相关的信息转移到其他类中
尽可能让接口可编程,而不是表达语义
谨防在修改时破坏接口的抽象
不要添加与接口抽象不一致的公用成员
同时考虑抽象性和内聚性
尽可能限制类和成员的可访问性
不要公开暴露成员数据
避免私用的实现细节放入类的接口中
避免使用友元类(friend class)
不要因为一个子程序里仅使用公用子程序,就把它归入公开接口
让阅读代码比编写代码更方便
要格外警惕从语义上破坏封装性
留意过于紧密的耦合关系
一台物理主机上搭建多个WEB站点,每个WEB站点独立运行,互不干扰。这些站点就称为“虚拟主机”。
节省资源,便于管理。
多个域名解析到同一个IP地址,在WEB服务器里添加多个站点,每个站点设定一个主机名。HTTP协议里包含了主机名信息,当WEB服务器收到访问请求时,就可以根据不同的主机名来访问不同的网站。
一个IP地址,通过不同的端口实现不同网站的访问。
服务器绑定多个IP,然后配置服务器,把多个网站绑定在不同的IP上。
1 | https://www.baidu.com/course/2064.html |
Tomcat 默认根目录
1 | apache-tomcat-8.0.24\webapps\ROOT |
物理目录:实际存放在主目录(根目录)下的子文件夹
虚拟目录:URL地址中不存在于主目录(根目录)下面的子文件夹
1 | <Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true"></Host> |
1 | <Content docBase="E:\myapp" path="" reloadable="true"/> |
1 | <Content docBase="E:\myapp" path="" reloadable="true"/> |
Accidental and Essential Difficulties
管理复杂度的重要性
如何应对复杂度
高代价、低效率的设计源于下面这三种根源
偶然的难题和本质的难题
理想的设计特征
最小复杂度
易于维护
松散耦合
可扩展性
可重用性
高扇入
低扇出
可移植性
精简性
层次性
标准技术
软件开发中的各种不同的活动(Activity)
A typical bootstrapping process consists of six distinct phases: