 Hello 算法 1.1.0 Java版我深深赞同费曼教授所言:“Knowledge isn’t free. You have to pay attention.”从这个意义上看,这本 书并非完全“免费”。为了不辜负你为本书所付出的宝贵“注意力”,我会竭尽所能,投入最大的“注意力” 来完成本书的创作。 本人自知学疏才浅,书中内容虽然已经过一段时间的打磨,但一定仍有许多错误,恳请各位老师和同学批评 指正。 本书中的代码附有可一键运行的源文件,托管于 github ”。 2. 归:触发“终止条件”后,程序从最深层的递归函数开始逐层返回,汇聚每一层的结果。 而从实现的角度看,递归代码主要包含三个要素。 1. 终止条件:用于决定什么时候由“递”转“归”。 2. 递归调用:对应“递”,函数调用自身,通常输入更小或更简化的参数。 3. 返回结果:对应“归”,将当前递归层级的结果返回至上一层。 观察以下代码,我们只需调用函数 recur(n) ,就可以完成 间效率上与迭代相当。这种情况被称为尾递归(tail recursion)。 ‧ 普通递归:当函数返回到上一层级的函数后,需要继续执行代码,因此系统需要保存上一层调用的上下 文。 ‧ 尾递归:递归调用是函数返回前的最后一个操作,这意味着函数返回到上一层级后,无须继续执行其他 操作,因此系统无须保存上一层函数的上下文。 以计算 1 + 2 + ⋯ + ? 为例,我们可以将结果变量 res 设为函数参数,从而实现尾递归:0 码力 | 378 页 | 18.47 MB | 1 年前3 Hello 算法 1.1.0 Java版我深深赞同费曼教授所言:“Knowledge isn’t free. You have to pay attention.”从这个意义上看,这本 书并非完全“免费”。为了不辜负你为本书所付出的宝贵“注意力”,我会竭尽所能,投入最大的“注意力” 来完成本书的创作。 本人自知学疏才浅,书中内容虽然已经过一段时间的打磨,但一定仍有许多错误,恳请各位老师和同学批评 指正。 本书中的代码附有可一键运行的源文件,托管于 github ”。 2. 归:触发“终止条件”后,程序从最深层的递归函数开始逐层返回,汇聚每一层的结果。 而从实现的角度看,递归代码主要包含三个要素。 1. 终止条件:用于决定什么时候由“递”转“归”。 2. 递归调用:对应“递”,函数调用自身,通常输入更小或更简化的参数。 3. 返回结果:对应“归”,将当前递归层级的结果返回至上一层。 观察以下代码,我们只需调用函数 recur(n) ,就可以完成 间效率上与迭代相当。这种情况被称为尾递归(tail recursion)。 ‧ 普通递归:当函数返回到上一层级的函数后,需要继续执行代码,因此系统需要保存上一层调用的上下 文。 ‧ 尾递归:递归调用是函数返回前的最后一个操作,这意味着函数返回到上一层级后,无须继续执行其他 操作,因此系统无须保存上一层函数的上下文。 以计算 1 + 2 + ⋯ + ? 为例,我们可以将结果变量 res 设为函数参数,从而实现尾递归:0 码力 | 378 页 | 18.47 MB | 1 年前3
 Hello 算法 1.0.0 Java版我深深赞同费曼教授所言:“Knowledge isn’t free. You have to pay attention.”从这个意义上看,这本 书并非完全“免费”。为了不辜负你为本书所付出的宝贵“注意力”,我会竭尽所能,投入最大的“注意力” 来完成本书的创作。本人自知学疏才浅,书中内容虽然已经过一段时间的打磨,但一定仍有许多错误,恳请 各位老师和同学批评指正。 本书中的代码附有可一键运行的源文件,托管于 github ”。 2. 归:触发“终止条件”后,程序从最深层的递归函数开始逐层返回,汇聚每一层的结果。 而从实现的角度看,递归代码主要包含三个要素。 1. 终止条件:用于决定什么时候由“递”转“归”。 2. 递归调用:对应“递”,函数调用自身,通常输入更小或更简化的参数。 3. 返回结果:对应“归”,将当前递归层级的结果返回至上一层。 观察以下代码,我们只需调用函数 recur(n) ,就可以完成 间效率上与迭代相当。这种情况被称为「尾递归 tail recursion」。 ‧ 普通递归:当函数返回到上一层级的函数后,需要继续执行代码,因此系统需要保存上一层调用的上下 文。 ‧ 尾递归:递归调用是函数返回前的最后一个操作,这意味着函数返回到上一层级后,无须继续执行其他 操作,因此系统无须保存上一层函数的上下文。 以计算 1 + 2 + ⋯ + ? 为例,我们可以将结果变量 res 设为函数参数,从而实现尾递归:0 码力 | 376 页 | 17.59 MB | 1 年前3 Hello 算法 1.0.0 Java版我深深赞同费曼教授所言:“Knowledge isn’t free. You have to pay attention.”从这个意义上看,这本 书并非完全“免费”。为了不辜负你为本书所付出的宝贵“注意力”,我会竭尽所能,投入最大的“注意力” 来完成本书的创作。本人自知学疏才浅,书中内容虽然已经过一段时间的打磨,但一定仍有许多错误,恳请 各位老师和同学批评指正。 本书中的代码附有可一键运行的源文件,托管于 github ”。 2. 归:触发“终止条件”后,程序从最深层的递归函数开始逐层返回,汇聚每一层的结果。 而从实现的角度看,递归代码主要包含三个要素。 1. 终止条件:用于决定什么时候由“递”转“归”。 2. 递归调用:对应“递”,函数调用自身,通常输入更小或更简化的参数。 3. 返回结果:对应“归”,将当前递归层级的结果返回至上一层。 观察以下代码,我们只需调用函数 recur(n) ,就可以完成 间效率上与迭代相当。这种情况被称为「尾递归 tail recursion」。 ‧ 普通递归:当函数返回到上一层级的函数后,需要继续执行代码,因此系统需要保存上一层调用的上下 文。 ‧ 尾递归:递归调用是函数返回前的最后一个操作,这意味着函数返回到上一层级后,无须继续执行其他 操作,因此系统无须保存上一层函数的上下文。 以计算 1 + 2 + ⋯ + ? 为例,我们可以将结果变量 res 设为函数参数,从而实现尾递归:0 码力 | 376 页 | 17.59 MB | 1 年前3
 Hello 算法 1.2.0 简体中文 Java 版我深深赞同费曼教授所言:“Knowledge isn’t free. You have to pay attention.”从这个意义上看,这本 书并非完全“免费”。为了不辜负你为本书所付出的宝贵“注意力”,我会竭尽所能,投入最大的“注意力” 来完成本书的创作。 本人自知学疏才浅,书中内容虽然已经过一段时间的打磨,但一定仍有许多错误,恳请各位老师和同学批评 指正。 本书中的代码附有可一键运行的源文件,托管于 github ”。 2. 归:触发“终止条件”后,程序从最深层的递归函数开始逐层返回,汇聚每一层的结果。 而从实现的角度看,递归代码主要包含三个要素。 1. 终止条件:用于决定什么时候由“递”转“归”。 2. 递归调用:对应“递”,函数调用自身,通常输入更小或更简化的参数。 3. 返回结果:对应“归”,将当前递归层级的结果返回至上一层。 观察以下代码,我们只需调用函数 recur(n) ,就可以完成 间效率上与迭代相当。这种情况被称为尾递归(tail recursion)。 ‧ 普通递归:当函数返回到上一层级的函数后,需要继续执行代码,因此系统需要保存上一层调用的上下 文。 ‧ 尾递归:递归调用是函数返回前的最后一个操作,这意味着函数返回到上一层级后,无须继续执行其他 操作,因此系统无须保存上一层函数的上下文。 以计算 1 + 2 + ⋯ + ? 为例,我们可以将结果变量 res 设为函数参数,从而实现尾递归:0 码力 | 379 页 | 18.48 MB | 10 月前3 Hello 算法 1.2.0 简体中文 Java 版我深深赞同费曼教授所言:“Knowledge isn’t free. You have to pay attention.”从这个意义上看,这本 书并非完全“免费”。为了不辜负你为本书所付出的宝贵“注意力”,我会竭尽所能,投入最大的“注意力” 来完成本书的创作。 本人自知学疏才浅,书中内容虽然已经过一段时间的打磨,但一定仍有许多错误,恳请各位老师和同学批评 指正。 本书中的代码附有可一键运行的源文件,托管于 github ”。 2. 归:触发“终止条件”后,程序从最深层的递归函数开始逐层返回,汇聚每一层的结果。 而从实现的角度看,递归代码主要包含三个要素。 1. 终止条件:用于决定什么时候由“递”转“归”。 2. 递归调用:对应“递”,函数调用自身,通常输入更小或更简化的参数。 3. 返回结果:对应“归”,将当前递归层级的结果返回至上一层。 观察以下代码,我们只需调用函数 recur(n) ,就可以完成 间效率上与迭代相当。这种情况被称为尾递归(tail recursion)。 ‧ 普通递归:当函数返回到上一层级的函数后,需要继续执行代码,因此系统需要保存上一层调用的上下 文。 ‧ 尾递归:递归调用是函数返回前的最后一个操作,这意味着函数返回到上一层级后,无须继续执行其他 操作,因此系统无须保存上一层函数的上下文。 以计算 1 + 2 + ⋯ + ? 为例,我们可以将结果变量 res 设为函数参数,从而实现尾递归:0 码力 | 379 页 | 18.48 MB | 10 月前3
 《Java 应用与开发》课程讲义 - 王晓东调用父类中定义的成员方法 1 super.<方法名>(<实参列表>) 子类构造方法中调用父类的构造方法 1 super(<实参列表>) super 的追溯不仅限于直接父类,而是先从直接父类开始查找,如果找不到则逐层 上溯,一旦在某个层次父类中找到匹配成员即停止追溯并使用该成员。 示例代码:super 用法示例 A 1 class Animal { 2 protected int i = 1; //用于测试同名属性,无现实含义 况需 要注意: 1. 从子类到父类的类型转换可以自动进行。 1 Person p = new Student(); 2. 在多态的情况下,有时我们可能需要恢复一个对象的本来面目,以发挥其全部潜 力。从父类到子类的类型转换必须通过造型实现。 1 Person p1 = new Student(); 2 Student s1 = (Student)p1; // 合法 3 Person p2 应用被分为三层,降低各层耦合,提高了可扩展性。 4. 控制层把不同模型和视图组合在一起,完成不同的请求,控制层包含了用户请求 权限的概念。 5. MVC 符合软件工程化管理的思想,不同层各司其职,有利于通过工程化和工具 化产生管理程序代码。 数据是动的,数据在 View 和 Control 层一旦运动起来,就会产生许多的问题: • 数据从 View 层传递到 Control 层,如何使得一个个扁平的字符串,转化成一个个0 码力 | 330 页 | 6.54 MB | 1 年前3 《Java 应用与开发》课程讲义 - 王晓东调用父类中定义的成员方法 1 super.<方法名>(<实参列表>) 子类构造方法中调用父类的构造方法 1 super(<实参列表>) super 的追溯不仅限于直接父类,而是先从直接父类开始查找,如果找不到则逐层 上溯,一旦在某个层次父类中找到匹配成员即停止追溯并使用该成员。 示例代码:super 用法示例 A 1 class Animal { 2 protected int i = 1; //用于测试同名属性,无现实含义 况需 要注意: 1. 从子类到父类的类型转换可以自动进行。 1 Person p = new Student(); 2. 在多态的情况下,有时我们可能需要恢复一个对象的本来面目,以发挥其全部潜 力。从父类到子类的类型转换必须通过造型实现。 1 Person p1 = new Student(); 2 Student s1 = (Student)p1; // 合法 3 Person p2 应用被分为三层,降低各层耦合,提高了可扩展性。 4. 控制层把不同模型和视图组合在一起,完成不同的请求,控制层包含了用户请求 权限的概念。 5. MVC 符合软件工程化管理的思想,不同层各司其职,有利于通过工程化和工具 化产生管理程序代码。 数据是动的,数据在 View 和 Control 层一旦运动起来,就会产生许多的问题: • 数据从 View 层传递到 Control 层,如何使得一个个扁平的字符串,转化成一个个0 码力 | 330 页 | 6.54 MB | 1 年前3
 Hello 算法 1.2.0 繁体中文 Java 版我深深認同費曼教授所言:“Knowledge isn’t free. You have to pay attention.”從這個意義上看,這本 書並非完全“免費”。為了不辜負你為本書所付出的寶貴“注意力”,我會竭盡所能,投入最大的“注意力” 來完成本書的創作。 本人自知學疏才淺,書中內容雖然已經過一段時間的打磨,但一定仍有許多錯誤,懇請各位老師與同學批評 指正。 本書中的程式碼附有可一鍵執行的原始檔,託管於 github capacity 觀察以上公式,當雜湊表容量 capacity 固定時,雜湊演算法 hash() 決定了輸出值,進而決定了鍵值對在雜 湊表中的分佈情況。 這意味著,為了降低雜湊衝突的發生機率,我們應當將注意力集中在雜湊演算法 hash() 的設計上。 6.3.1 雜湊演算法的目標 為了實現“既快又穩”的雜湊表資料結構,雜湊演算法應具備以下特點。 ‧ 確定性:對於相同的輸入,雜湊演算法應始終產生相同的輸出。這樣才能確保雜湊表是可靠的。 left subtree 左子树 左子樹 right subtree 右子树 右子樹 root node 根节点 根節點 leaf node 叶节点 葉節點 edge 边 邊 level 层 層 degree 度 度 height 高度 高度 depth 深度 深度 perfect binary tree 完美二叉树 完美二元樹 complete binary tree 完全二叉树0 码力 | 379 页 | 18.79 MB | 10 月前3 Hello 算法 1.2.0 繁体中文 Java 版我深深認同費曼教授所言:“Knowledge isn’t free. You have to pay attention.”從這個意義上看,這本 書並非完全“免費”。為了不辜負你為本書所付出的寶貴“注意力”,我會竭盡所能,投入最大的“注意力” 來完成本書的創作。 本人自知學疏才淺,書中內容雖然已經過一段時間的打磨,但一定仍有許多錯誤,懇請各位老師與同學批評 指正。 本書中的程式碼附有可一鍵執行的原始檔,託管於 github capacity 觀察以上公式,當雜湊表容量 capacity 固定時,雜湊演算法 hash() 決定了輸出值,進而決定了鍵值對在雜 湊表中的分佈情況。 這意味著,為了降低雜湊衝突的發生機率,我們應當將注意力集中在雜湊演算法 hash() 的設計上。 6.3.1 雜湊演算法的目標 為了實現“既快又穩”的雜湊表資料結構,雜湊演算法應具備以下特點。 ‧ 確定性:對於相同的輸入,雜湊演算法應始終產生相同的輸出。這樣才能確保雜湊表是可靠的。 left subtree 左子树 左子樹 right subtree 右子树 右子樹 root node 根节点 根節點 leaf node 叶节点 葉節點 edge 边 邊 level 层 層 degree 度 度 height 高度 高度 depth 深度 深度 perfect binary tree 完美二叉树 完美二元樹 complete binary tree 完全二叉树0 码力 | 379 页 | 18.79 MB | 10 月前3
 Hello 算法 1.0.0b4 Java版省略所有系数。例如,循环 2? 次、5? + 1 次等,都可以简化记为 ? 次,因为 ? 前面的系数对时间复 杂度没有影响。 3. 循环嵌套时使用乘法。总操作数量等于外层循环和内层循环操作数量之积,每一层循环依然可以分别 套用上述 1. 和 2. 技巧。 以下示例展示了使用上述技巧前、后的统计结果。 ?(?) = 2?(? + 1) + (5? + 1) + 2 完整统计 (‑.‑|||) = logRecur(float n) { if (n <= 1) return 0; return logRecur(n / 2) + 1; } 线性对数阶 ?(? log ?) 线性对数阶常出现于嵌套循环中,两层循环的时间复杂度分别为 ?(log ?) 和 ?(?) 。 主流排序算法的时间复杂度通常为 ?(? log ?) ,例如快速排序、归并排序、堆排序等。 // === File: time_complexity 个互不重复的元素,求其所有可能的排列方案,方案数量为: ?! = ? × (? − 1) × (? − 2) × ⋯ × 2 × 1 阶乘通常使用递归实现。例如以下代码,第一层分裂出 ? 个,第二层分裂出 ? − 1 个,以此类推,直至第 ? 层时终止分裂。 // === File: time_complexity.java === /* 阶乘阶(递归实现) */ int factorialRecur(int0 码力 | 342 页 | 27.39 MB | 1 年前3 Hello 算法 1.0.0b4 Java版省略所有系数。例如,循环 2? 次、5? + 1 次等,都可以简化记为 ? 次,因为 ? 前面的系数对时间复 杂度没有影响。 3. 循环嵌套时使用乘法。总操作数量等于外层循环和内层循环操作数量之积,每一层循环依然可以分别 套用上述 1. 和 2. 技巧。 以下示例展示了使用上述技巧前、后的统计结果。 ?(?) = 2?(? + 1) + (5? + 1) + 2 完整统计 (‑.‑|||) = logRecur(float n) { if (n <= 1) return 0; return logRecur(n / 2) + 1; } 线性对数阶 ?(? log ?) 线性对数阶常出现于嵌套循环中,两层循环的时间复杂度分别为 ?(log ?) 和 ?(?) 。 主流排序算法的时间复杂度通常为 ?(? log ?) ,例如快速排序、归并排序、堆排序等。 // === File: time_complexity 个互不重复的元素,求其所有可能的排列方案,方案数量为: ?! = ? × (? − 1) × (? − 2) × ⋯ × 2 × 1 阶乘通常使用递归实现。例如以下代码,第一层分裂出 ? 个,第二层分裂出 ? − 1 个,以此类推,直至第 ? 层时终止分裂。 // === File: time_complexity.java === /* 阶乘阶(递归实现) */ int factorialRecur(int0 码力 | 342 页 | 27.39 MB | 1 年前3
 Hello 算法 1.0.0b5 Java版”。 2. 归:触发“终止条件”后,程序从最深层的递归函数开始逐层返回,汇聚每一层的结果。 而从实现的角度看,递归代码主要包含三个要素。 1. 终止条件:用于决定什么时候由“递”转“归”。 2. 递归调用:对应“递”,函数调用自身,通常输入更小或更简化的参数。 3. 返回结果:对应“归”,将当前递归层级的结果返回至上一层。 观察以下代码,我们只需调用函数 recur(n) ,就可以完成 间效率上与迭代相当。这种情况被称为「尾递归 tail recursion」。 ‧ 普通递归:当函数返回到上一层级的函数后,需要继续执行代码,因此系统需要保存上一层调用的上下 文。 ‧ 尾递归:递归调用是函数返回前的最后一个操作,这意味着函数返回到上一层级后,无需继续执行其他 操作,因此系统无需保存上一层函数的上下文。 以计算 1 + 2 + ⋯ + ? 为例,我们可以将结果变量 res 设为函数参数,从而实现尾递归。 省略所有系数。例如,循环 2? 次、5? + 1 次等,都可以简化记为 ? 次,因为 ? 前面的系数对时间复 杂度没有影响。 3. 循环嵌套时使用乘法。总操作数量等于外层循环和内层循环操作数量之积,每一层循环依然可以分别 套用第 1. 点和第 2. 点的技巧。 给定一个函数,我们可以用上述技巧来统计操作数量。 void algorithm(int n) { int a = 1; // +0(技巧0 码力 | 376 页 | 30.69 MB | 1 年前3 Hello 算法 1.0.0b5 Java版”。 2. 归:触发“终止条件”后,程序从最深层的递归函数开始逐层返回,汇聚每一层的结果。 而从实现的角度看,递归代码主要包含三个要素。 1. 终止条件:用于决定什么时候由“递”转“归”。 2. 递归调用:对应“递”,函数调用自身,通常输入更小或更简化的参数。 3. 返回结果:对应“归”,将当前递归层级的结果返回至上一层。 观察以下代码,我们只需调用函数 recur(n) ,就可以完成 间效率上与迭代相当。这种情况被称为「尾递归 tail recursion」。 ‧ 普通递归:当函数返回到上一层级的函数后,需要继续执行代码,因此系统需要保存上一层调用的上下 文。 ‧ 尾递归:递归调用是函数返回前的最后一个操作,这意味着函数返回到上一层级后,无需继续执行其他 操作,因此系统无需保存上一层函数的上下文。 以计算 1 + 2 + ⋯ + ? 为例,我们可以将结果变量 res 设为函数参数,从而实现尾递归。 省略所有系数。例如,循环 2? 次、5? + 1 次等,都可以简化记为 ? 次,因为 ? 前面的系数对时间复 杂度没有影响。 3. 循环嵌套时使用乘法。总操作数量等于外层循环和内层循环操作数量之积,每一层循环依然可以分别 套用第 1. 点和第 2. 点的技巧。 给定一个函数,我们可以用上述技巧来统计操作数量。 void algorithm(int n) { int a = 1; // +0(技巧0 码力 | 376 页 | 30.69 MB | 1 年前3
 Java 应用与开发 - MVC 和框架初步应用任何显 示技术,例如,使用 JSP、Velocity 模板或者直接产生 Excel。 3. 应用被分为三层,降低各层耦合,提高了可扩展性。 4. 控制层把不同模型和视图组合在一起,完成不同的请求,控 制层包含了用户请求权限的概念。 5. MVC 符合软件工程化管理的思想,不同层各司其职,有利 于通过工程化和工具化产生管理程序代码。 大纲 Java Web 应用的开发演化 经典 MVC 框架 数据是动的,数据在 View 和 Control 层一旦运动起来,就会产 生许多的问题: ▶ 数据从 View 层传递到 Control 层,如何使得一个个扁平的字符 串,转化成一个个生龙活虎的 Java 对象。 ▶ 数据从 View 层传递到 Control 层,如何方便的进行数据格式和 内容的校验? ▶ 数据从 Control 层传递到 View 层,一个个生龙活虎的 Java 对象, 又如何在页面上以各种各样的形式展现出来。 ▶ 如果你试图将数据请求从 View 层发送到 Control 层,你如何才 能知道你要调用的究竟是哪个类,哪个方法?一个 HTTP 的请求, 又如何与 Control 层的 Java 代码建立起关系来? 大纲 Java Web 应用的开发演化 经典 MVC 框架 - Struts 2 本节习题 MVC 数据是动的,数据在 View 和 Control 层一旦运动起来,就会产 生许多的问题:0 码力 | 51 页 | 837.26 KB | 1 年前3 Java 应用与开发 - MVC 和框架初步应用任何显 示技术,例如,使用 JSP、Velocity 模板或者直接产生 Excel。 3. 应用被分为三层,降低各层耦合,提高了可扩展性。 4. 控制层把不同模型和视图组合在一起,完成不同的请求,控 制层包含了用户请求权限的概念。 5. MVC 符合软件工程化管理的思想,不同层各司其职,有利 于通过工程化和工具化产生管理程序代码。 大纲 Java Web 应用的开发演化 经典 MVC 框架 数据是动的,数据在 View 和 Control 层一旦运动起来,就会产 生许多的问题: ▶ 数据从 View 层传递到 Control 层,如何使得一个个扁平的字符 串,转化成一个个生龙活虎的 Java 对象。 ▶ 数据从 View 层传递到 Control 层,如何方便的进行数据格式和 内容的校验? ▶ 数据从 Control 层传递到 View 层,一个个生龙活虎的 Java 对象, 又如何在页面上以各种各样的形式展现出来。 ▶ 如果你试图将数据请求从 View 层发送到 Control 层,你如何才 能知道你要调用的究竟是哪个类,哪个方法?一个 HTTP 的请求, 又如何与 Control 层的 Java 代码建立起关系来? 大纲 Java Web 应用的开发演化 经典 MVC 框架 - Struts 2 本节习题 MVC 数据是动的,数据在 View 和 Control 层一旦运动起来,就会产 生许多的问题:0 码力 | 51 页 | 837.26 KB | 1 年前3
 基于 Java EE 的企业应用系统设计 - Spring MVC 01应用任何显 示技术,例如,使用 JSP、Velocity 模板或者直接产生 Excel。 3. 应用被分为三层,降低各层耦合,提高了可扩展性。 4. 控制层把不同模型和视图组合在一起,完成不同的请求,控 制层包含了用户请求权限的概念。 5. MVC 符合软件工程化管理的思想,不同层各司其职,有利 于通过工程化和工具化产生管理程序代码。 大纲 Java Web 应用的开发演化 MVC 模式示例 数据是动的,数据在 View 和 Control 层一旦运动起来,就会产生 许多的问题: ▶ 数据从 View 层传递到 Control 层,如何使得一个个扁平的字符串, 转化成一个个生龙活虎的 Java 对象。 ▶ 数据从 View 层传递到 Control 层,如何方便的进行数据格式和内 容的校验? ▶ 数据从 Control 层传递到 View 层,一个个 Java 对象,又如何在页 面上以各种各样的形式展现出来。 如果试图将数据请求从 View 层发送到 Control 层,你如何才能知 道你要调用的究竟是哪个类,哪个方法?一个 Http 的请求,又如 何与 Control 层的 Java 代码建立起关系来? 大纲 Java Web 应用的开发演化 MVC 模式示例 Spring MVC 数据绑定和表单标签库 MVC 数据是动的,数据在 View 和 Control 层一旦运动起来,就会产生 许多的问题:0 码力 | 67 页 | 792.43 KB | 1 年前3 基于 Java EE 的企业应用系统设计 - Spring MVC 01应用任何显 示技术,例如,使用 JSP、Velocity 模板或者直接产生 Excel。 3. 应用被分为三层,降低各层耦合,提高了可扩展性。 4. 控制层把不同模型和视图组合在一起,完成不同的请求,控 制层包含了用户请求权限的概念。 5. MVC 符合软件工程化管理的思想,不同层各司其职,有利 于通过工程化和工具化产生管理程序代码。 大纲 Java Web 应用的开发演化 MVC 模式示例 数据是动的,数据在 View 和 Control 层一旦运动起来,就会产生 许多的问题: ▶ 数据从 View 层传递到 Control 层,如何使得一个个扁平的字符串, 转化成一个个生龙活虎的 Java 对象。 ▶ 数据从 View 层传递到 Control 层,如何方便的进行数据格式和内 容的校验? ▶ 数据从 Control 层传递到 View 层,一个个 Java 对象,又如何在页 面上以各种各样的形式展现出来。 如果试图将数据请求从 View 层发送到 Control 层,你如何才能知 道你要调用的究竟是哪个类,哪个方法?一个 Http 的请求,又如 何与 Control 层的 Java 代码建立起关系来? 大纲 Java Web 应用的开发演化 MVC 模式示例 Spring MVC 数据绑定和表单标签库 MVC 数据是动的,数据在 View 和 Control 层一旦运动起来,就会产生 许多的问题:0 码力 | 67 页 | 792.43 KB | 1 年前3
 Nacos架构&原理
 开放性,设计和讨论保持社区互动和透明,方便大家协作。 架构图 整体架构分为用户层、业务层、内核层和插件,用户层主要解决用户使用的易用性问题,业务层主 要解决服务发现和配置管理的功能问题,内核层解决分布式系统⼀致性、存储、高可用等核心问题, 插件解决扩展性问题。 Nacos 架构 < 18 用户层  OpenAPI:暴露标准 Rest 风格 HTTP 接口,简单易用,方便多语言集成。 CLI:命令行对产品进行轻量化管理,像 git ⼀样好用。 业务层  服务管理:实现服务 CRUD,域名 CRUD,服务健康状态检查,服务权重管理等功能。  配置管理:实现配置管 CRUD,版本管理,灰度管理,监听管理,推送轨迹,聚合数据等功能。  元数据管理:提供元数据 CURD 和打标能力,为实现上层流量和服务灰度非常关键。 19 > Nacos 架构 内核层  插件机制:实现三个模块可分可合能力,实现扩展点 维护,耦合了⼀致性协议层的数据状态,难以做到计算存储彻底分离,以及对计算层的无限水平扩 容能力也有⼀定的影响。因此为了解决这个问题,必然需要对 Nacos 的⼀致性协议做抽象以及下 31 > Nacos 架构 沉,使其成为 Core 模块的能力,彻底让服务注册发现模块只充当计算能力,同时为配置模块去外 部数据库存储打下了架构基础。 当前 Nacos 的⼀致性协议层 正如前面所说,在当前的0 码力 | 326 页 | 12.83 MB | 9 月前3 Nacos架构&原理
 开放性,设计和讨论保持社区互动和透明,方便大家协作。 架构图 整体架构分为用户层、业务层、内核层和插件,用户层主要解决用户使用的易用性问题,业务层主 要解决服务发现和配置管理的功能问题,内核层解决分布式系统⼀致性、存储、高可用等核心问题, 插件解决扩展性问题。 Nacos 架构 < 18 用户层  OpenAPI:暴露标准 Rest 风格 HTTP 接口,简单易用,方便多语言集成。 CLI:命令行对产品进行轻量化管理,像 git ⼀样好用。 业务层  服务管理:实现服务 CRUD,域名 CRUD,服务健康状态检查,服务权重管理等功能。  配置管理:实现配置管 CRUD,版本管理,灰度管理,监听管理,推送轨迹,聚合数据等功能。  元数据管理:提供元数据 CURD 和打标能力,为实现上层流量和服务灰度非常关键。 19 > Nacos 架构 内核层  插件机制:实现三个模块可分可合能力,实现扩展点 维护,耦合了⼀致性协议层的数据状态,难以做到计算存储彻底分离,以及对计算层的无限水平扩 容能力也有⼀定的影响。因此为了解决这个问题,必然需要对 Nacos 的⼀致性协议做抽象以及下 31 > Nacos 架构 沉,使其成为 Core 模块的能力,彻底让服务注册发现模块只充当计算能力,同时为配置模块去外 部数据库存储打下了架构基础。 当前 Nacos 的⼀致性协议层 正如前面所说,在当前的0 码力 | 326 页 | 12.83 MB | 9 月前3
共 18 条
- 1
- 2













