本文我打算用Java实现图论算法中的拓扑排序,并应用拓扑排序安排课程表。课程表就是很常规的那种Java学习的简单路线图,首先下图就是Java课程学习的一个拓扑顺序图:
上面这张图是什么意思呢?黑色的字就代表要学习的课程,而红色的箭头就代表课程学习的拓扑顺序,课程之间是有依赖的,箭头代表课程学习顺序:
- 最左边的Java、SQL、HTML、CSS这类课程则不需要提前学习任何课程,即可开始学习
- 想学习Servlet课程,你就需要先学习Java课程,然后才能学习Servlet课程
- 想学习JSP课程,你就得先学习Java课程和JavaScript课程,而学习JavaScript课程,就得先学习HTML和CSS课程
从上面的解读例子中,你应该明白了,课程学习是有依赖关系的,不是你想按照什么顺序来学都可以的。你只学了Servlet和JSP,没学过SQL,是无法学习SSM的(大家都懂的)。从上面的课程拓扑顺序可以看出,部分课程的学习都是在其他的课程学习完毕后,才能开始学习的,其依赖关系如下:
- Java:先决条件:无
- HTML:先决条件:无
- CSS:先决条件:无
- SQL:先决条件:无
- JavaScript:先决条件:HTML、CSS
- Servlet:先决条件:Java
- JSP:先决条件:Java、JavaScript
- SSM:先决条件:JSP、Servlet、SQL
- SpringBoot:先决条件:SSM
其实上面的课程拓扑顺序,也可以看做是一个有向无环图,也就是传说中的DAG图。如何按照上面的学习依赖顺序,安排所有课程的学习顺序呢?这里就用图论算法中的拓扑排序算法。
首先,我们构建上面的课程拓扑顺序图的邻接矩阵:
从上面的邻接矩阵图中可以看出,竖着的列,是1的就指着自己。比如SSM,竖着下来有3个1,横过去看,就是SQL、Servlet和JSP指着它。所以说,我们可以通过竖着数1的个数,来判断有多少课程指着自己,在图论中,就叫一个顶点的入度。在有向图中,如果有N条边的箭头指向某个顶点,就说这个顶点的入度是N。当然某一列的所有数字都是0,则代表这个顶点的入度是0,没有任何其他顶点指着它。
拓扑排序的思路如下:
- 先找到入度为0的顶点(排序List中不能存在),就是顶点的那一列全是0,如果有多个,就取其一,放入排序List中
- 放入后,在邻接矩阵中删除该顶点及其出去的边,也就是将顶点的那一行全部弄成0
- 再继续找入度为0的顶点,重复3,然后再接着重复4,直到排序List中的排序元素个数与顶点个数相等,或者说找不到入度为0且排序List中不存在的顶点了,完成拓扑排序
接下来就是我用Java实现的拓扑排序,实现上面课程的顺序安排方案(所有可行的方案),算法的代码和精髓都在下面的代码和其间详尽的注释中:
import java.util.ArrayList;
import java.util.List;
/**
* @author LiYang
* @ClassName TopologicalSort
* @Description 图论算法中的拓扑排序
* @date 2019/11/18 18:33
*/
public class TopologicalSort {
/**
* 返回示例图的邻接矩阵
* @return 示例图邻接矩阵
*/
public static int[][] initCourseMatrix() {
//创建示例图邻接矩阵
return new int[][]{
{0, 0, 0, 0, 0, 1, 1, 0, 0},
{0, 0, 0, 0, 1, 0, 0, 0, 0},
{0, 0, 0, 0, 1, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 1, 0},
{0, 0, 0, 0, 0, 0, 1, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 1, 0},
{0, 0, 0, 0, 0, 0, 0, 1, 0},
{0, 0, 0, 0, 0, 0, 0, 0, 1},
{0, 0, 0, 0, 0, 0, 0, 0, 0}
};
}
/**
* 拷贝matrix矩阵
* @param matrix 源邻接矩阵
* @return 拷贝的邻接矩阵
*/
public static int[][] copyMatrix(int[][] matrix) {
//新的邻接矩阵,和原来的一样大,正方形
int[][] newMatrix = new int[matrix.length][matrix.length];
//双重遍历拷贝
for (int i = 0; i < matrix.length; i++) {
for (int j = 0; j < matrix.length; j++) {
newMatrix[i][j] = matrix[i][j];
}
}
//返回拷贝的副本邻接矩阵
return newMatrix;
}
/**
* 拷贝List
* @param order 源orderList
* @return 拷贝的副本orderList
*/
public static List<Integer> copyList(List<Integer> order) {
//拷贝的List
List<Integer> copyList = new ArrayList<>();
//拷贝
for (Integer item : order) {
copyList.add(item);
}
//返回拷贝的副本
return copyList;
}
/**
* 打印课程顺序表
* @param order 课程排序表
* @param courseName 课程名字
*/
public static void printCourseOrderTable(List<Integer> order, String[] courseName) {
//课程表名字List
List<String> courseTable = new ArrayList<>();
//依据排好序的orderList,提取并加入课程名
for (Integer item : order) {
courseTable.add(courseName[item]);
}
//组装课程顺序表字符串
String courseList = courseTable.toString().replaceAll("\\[", "")
.replaceAll("]", "").replaceAll(", ", " -> ");
//打印课程顺序表
System.out.println(courseList);
}
/**
* 拓扑排序(安排示例课程图的课程表)
* @param matrix 课程拓扑顺序的邻接矩阵
* @param order 课程顺序List
* @param courseName 课程名称字符串数组
*/
public static void topologicalSort(int[][] matrix, List<Integer> order, String[] courseName) {
//如果所有课程已经排完序了
if (order.size() == matrix.length) {
//打印排好序的课程顺序表
printCourseOrderTable(order, courseName);
//结束递归
return;
}
//遍历找入度为0的课程
for (int i = 0; i < matrix.length; i++) {
//如果当前课程已经在拓扑排序列表里面了
if (order.contains(i)) {
//略过,不作处理
continue;
}
//判断课程是否全是0,也就是入度为0
boolean allZero = true;
//遍历查看是否是入度为0
for (int j = 0; j < matrix.length; j++) {
if (matrix[j][i] > 0) {
allZero = false;
break;
}
}
//如果课程入度为0,则可以用于拓扑排序的下一门课程
if (allZero) {
//复制当前排序表
List<Integer> newOrder = copyList(order);
//加入当前课程
newOrder.add(i);
//复制当前的邻接矩阵
int[][] newMatrix = copyMatrix(matrix);
//将当前已加入的课程删除,同时删除顶点和边
for (int k = 0; k < matrix.length; k++) {
newMatrix[i][k] = 0;
}
//继续往下,递归进行拓扑排序
topologicalSort(newMatrix, newOrder, courseName);
}
}
}
/**
* 拓扑排序的驱动程序
* @param matrix 课程拓扑顺序的邻接矩阵
* @param courseName 课程名字
*/
public static void topologicalSort(int[][] matrix, String[] courseName) {
//新建一个课程排序表
List<Integer> order = new ArrayList<>();
//启动课程表的拓扑排序
topologicalSort(matrix, order, courseName);
}
/**
* 运行拓扑排序算法,求出示例图中的所有课程安排方案
* @param args
*/
public static void main(String[] args) {
//获得示例图的邻接矩阵
int[][] matrix = initCourseMatrix();
//课程名称的字符串数组
String[] courseName = new String[]{"Java", "HTML", "CSS", "SQL", "JavaScript", "Servlet", "JSP", "SSM", "SpringBoot"};
//运行拓扑排序,求出示例图中的所有课程安排方案
topologicalSort(matrix, courseName);
}
}
运行TopologicalSort类的main方法,执行课程的拓扑排序算法,控制台打印了所有的可行的课程安排方案,测试通过:
Java -> HTML -> CSS -> SQL -> JavaScript -> Servlet -> JSP -> SSM -> SpringBoot
Java -> HTML -> CSS -> SQL -> JavaScript -> JSP -> Servlet -> SSM -> SpringBoot
Java -> HTML -> CSS -> SQL -> Servlet -> JavaScript -> JSP -> SSM -> SpringBoot
Java -> HTML -> CSS -> JavaScript -> SQL -> Servlet -> JSP -> SSM -> SpringBoot
Java -> HTML -> CSS -> JavaScript -> SQL -> JSP -> Servlet -> SSM -> SpringBoot
Java -> HTML -> CSS -> JavaScript -> Servlet -> SQL -> JSP -> SSM -> SpringBoot
Java -> HTML -> CSS -> JavaScript -> Servlet -> JSP -> SQL -> SSM -> SpringBoot
Java -> HTML -> CSS -> JavaScript -> JSP -> SQL -> Servlet -> SSM -> SpringBoot
Java -> HTML -> CSS -> JavaScript -> JSP -> Servlet -> SQL -> SSM -> SpringBoot
Java -> HTML -> CSS -> Servlet -> SQL -> JavaScript -> JSP -> SSM -> SpringBoot
Java -> HTML -> CSS -> Servlet -> JavaScript -> SQL -> JSP -> SSM -> SpringBoot
Java -> HTML -> CSS -> Servlet -> JavaScript -> JSP -> SQL -> SSM -> SpringBoot
Java -> HTML -> SQL -> CSS -> JavaScript -> Servlet -> JSP -> SSM -> SpringBoot
Java -> HTML -> SQL -> CSS -> JavaScript -> JSP -> Servlet -> SSM -> SpringBoot
Java -> HTML -> SQL -> CSS -> Servlet -> JavaScript -> JSP -> SSM -> SpringBoot
Java -> HTML -> SQL -> Servlet -> CSS -> JavaScript -> JSP -> SSM -> SpringBoot
Java -> HTML -> Servlet -> CSS -> SQL -> JavaScript -> JSP -> SSM -> SpringBoot
Java -> HTML -> Servlet -> CSS -> JavaScript -> SQL -> JSP -> SSM -> SpringBoot
Java -> HTML -> Servlet -> CSS -> JavaScript -> JSP -> SQL -> SSM -> SpringBoot
Java -> HTML -> Servlet -> SQL -> CSS -> JavaScript -> JSP -> SSM -> SpringBoot
Java -> CSS -> HTML -> SQL -> JavaScript -> Servlet -> JSP -> SSM -> SpringBoot
Java -> CSS -> HTML -> SQL -> JavaScript -> JSP -> Servlet -> SSM -> SpringBoot
Java -> CSS -> HTML -> SQL -> Servlet -> JavaScript -> JSP -> SSM -> SpringBoot
Java -> CSS -> HTML -> JavaScript -> SQL -> Servlet -> JSP -> SSM -> SpringBoot
Java -> CSS -> HTML -> JavaScript -> SQL -> JSP -> Servlet -> SSM -> SpringBoot
Java -> CSS -> HTML -> JavaScript -> Servlet -> SQL -> JSP -> SSM -> SpringBoot
Java -> CSS -> HTML -> JavaScript -> Servlet -> JSP -> SQL -> SSM -> SpringBoot
Java -> CSS -> HTML -> JavaScript -> JSP -> SQL -> Servlet -> SSM -> SpringBoot
Java -> CSS -> HTML -> JavaScript -> JSP -> Servlet -> SQL -> SSM -> SpringBoot
Java -> CSS -> HTML -> Servlet -> SQL -> JavaScript -> JSP -> SSM -> SpringBoot
Java -> CSS -> HTML -> Servlet -> JavaScript -> SQL -> JSP -> SSM -> SpringBoot
Java -> CSS -> HTML -> Servlet -> JavaScript -> JSP -> SQL -> SSM -> SpringBoot
Java -> CSS -> SQL -> HTML -> JavaScript -> Servlet -> JSP -> SSM -> SpringBoot
Java -> CSS -> SQL -> HTML -> JavaScript -> JSP -> Servlet -> SSM -> SpringBoot
Java -> CSS -> SQL -> HTML -> Servlet -> JavaScript -> JSP -> SSM -> SpringBoot
Java -> CSS -> SQL -> Servlet -> HTML -> JavaScript -> JSP -> SSM -> SpringBoot
Java -> CSS -> Servlet -> HTML -> SQL -> JavaScript -> JSP -> SSM -> SpringBoot
Java -> CSS -> Servlet -> HTML -> JavaScript -> SQL -> JSP -> SSM -> SpringBoot
Java -> CSS -> Servlet -> HTML -> JavaScript -> JSP -> SQL -> SSM -> SpringBoot
Java -> CSS -> Servlet -> SQL -> HTML -> JavaScript -> JSP -> SSM -> SpringBoot
Java -> SQL -> HTML -> CSS -> JavaScript -> Servlet -> JSP -> SSM -> SpringBoot
Java -> SQL -> HTML -> CSS -> JavaScript -> JSP -> Servlet -> SSM -> SpringBoot
Java -> SQL -> HTML -> CSS -> Servlet -> JavaScript -> JSP -> SSM -> SpringBoot
Java -> SQL -> HTML -> Servlet -> CSS -> JavaScript -> JSP -> SSM -> SpringBoot
Java -> SQL -> CSS -> HTML -> JavaScript -> Servlet -> JSP -> SSM -> SpringBoot
Java -> SQL -> CSS -> HTML -> JavaScript -> JSP -> Servlet -> SSM -> SpringBoot
Java -> SQL -> CSS -> HTML -> Servlet -> JavaScript -> JSP -> SSM -> SpringBoot
Java -> SQL -> CSS -> Servlet -> HTML -> JavaScript -> JSP -> SSM -> SpringBoot
Java -> SQL -> Servlet -> HTML -> CSS -> JavaScript -> JSP -> SSM -> SpringBoot
Java -> SQL -> Servlet -> CSS -> HTML -> JavaScript -> JSP -> SSM -> SpringBoot
Java -> Servlet -> HTML -> CSS -> SQL -> JavaScript -> JSP -> SSM -> SpringBoot
Java -> Servlet -> HTML -> CSS -> JavaScript -> SQL -> JSP -> SSM -> SpringBoot
Java -> Servlet -> HTML -> CSS -> JavaScript -> JSP -> SQL -> SSM -> SpringBoot
Java -> Servlet -> HTML -> SQL -> CSS -> JavaScript -> JSP -> SSM -> SpringBoot
Java -> Servlet -> CSS -> HTML -> SQL -> JavaScript -> JSP -> SSM -> SpringBoot
Java -> Servlet -> CSS -> HTML -> JavaScript -> SQL -> JSP -> SSM -> SpringBoot
Java -> Servlet -> CSS -> HTML -> JavaScript -> JSP -> SQL -> SSM -> SpringBoot
Java -> Servlet -> CSS -> SQL -> HTML -> JavaScript -> JSP -> SSM -> SpringBoot
Java -> Servlet -> SQL -> HTML -> CSS -> JavaScript -> JSP -> SSM -> SpringBoot
Java -> Servlet -> SQL -> CSS -> HTML -> JavaScript -> JSP -> SSM -> SpringBoot
HTML -> Java -> CSS -> SQL -> JavaScript -> Servlet -> JSP -> SSM -> SpringBoot
HTML -> Java -> CSS -> SQL -> JavaScript -> JSP -> Servlet -> SSM -> SpringBoot
HTML -> Java -> CSS -> SQL -> Servlet -> JavaScript -> JSP -> SSM -> SpringBoot
HTML -> Java -> CSS -> JavaScript -> SQL -> Servlet -> JSP -> SSM -> SpringBoot
HTML -> Java -> CSS -> JavaScript -> SQL -> JSP -> Servlet -> SSM -> SpringBoot
HTML -> Java -> CSS -> JavaScript -> Servlet -> SQL -> JSP -> SSM -> SpringBoot
HTML -> Java -> CSS -> JavaScript -> Servlet -> JSP -> SQL -> SSM -> SpringBoot
HTML -> Java -> CSS -> JavaScript -> JSP -> SQL -> Servlet -> SSM -> SpringBoot
HTML -> Java -> CSS -> JavaScript -> JSP -> Servlet -> SQL -> SSM -> SpringBoot
HTML -> Java -> CSS -> Servlet -> SQL -> JavaScript -> JSP -> SSM -> SpringBoot
HTML -> Java -> CSS -> Servlet -> JavaScript -> SQL -> JSP -> SSM -> SpringBoot
HTML -> Java -> CSS -> Servlet -> JavaScript -> JSP -> SQL -> SSM -> SpringBoot
HTML -> Java -> SQL -> CSS -> JavaScript -> Servlet -> JSP -> SSM -> SpringBoot
HTML -> Java -> SQL -> CSS -> JavaScript -> JSP -> Servlet -> SSM -> SpringBoot
HTML -> Java -> SQL -> CSS -> Servlet -> JavaScript -> JSP -> SSM -> SpringBoot
HTML -> Java -> SQL -> Servlet -> CSS -> JavaScript -> JSP -> SSM -> SpringBoot
HTML -> Java -> Servlet -> CSS -> SQL -> JavaScript -> JSP -> SSM -> SpringBoot
HTML -> Java -> Servlet -> CSS -> JavaScript -> SQL -> JSP -> SSM -> SpringBoot
HTML -> Java -> Servlet -> CSS -> JavaScript -> JSP -> SQL -> SSM -> SpringBoot
HTML -> Java -> Servlet -> SQL -> CSS -> JavaScript -> JSP -> SSM -> SpringBoot
HTML -> CSS -> Java -> SQL -> JavaScript -> Servlet -> JSP -> SSM -> SpringBoot
HTML -> CSS -> Java -> SQL -> JavaScript -> JSP -> Servlet -> SSM -> SpringBoot
HTML -> CSS -> Java -> SQL -> Servlet -> JavaScript -> JSP -> SSM -> SpringBoot
HTML -> CSS -> Java -> JavaScript -> SQL -> Servlet -> JSP -> SSM -> SpringBoot
HTML -> CSS -> Java -> JavaScript -> SQL -> JSP -> Servlet -> SSM -> SpringBoot
HTML -> CSS -> Java -> JavaScript -> Servlet -> SQL -> JSP -> SSM -> SpringBoot
HTML -> CSS -> Java -> JavaScript -> Servlet -> JSP -> SQL -> SSM -> SpringBoot
HTML -> CSS -> Java -> JavaScript -> JSP -> SQL -> Servlet -> SSM -> SpringBoot
HTML -> CSS -> Java -> JavaScript -> JSP -> Servlet -> SQL -> SSM -> SpringBoot
HTML -> CSS -> Java -> Servlet -> SQL -> JavaScript -> JSP -> SSM -> SpringBoot
HTML -> CSS -> Java -> Servlet -> JavaScript -> SQL -> JSP -> SSM -> SpringBoot
HTML -> CSS -> Java -> Servlet -> JavaScript -> JSP -> SQL -> SSM -> SpringBoot
HTML -> CSS -> SQL -> Java -> JavaScript -> Servlet -> JSP -> SSM -> SpringBoot
HTML -> CSS -> SQL -> Java -> JavaScript -> JSP -> Servlet -> SSM -> SpringBoot
HTML -> CSS -> SQL -> Java -> Servlet -> JavaScript -> JSP -> SSM -> SpringBoot
HTML -> CSS -> SQL -> JavaScript -> Java -> Servlet -> JSP -> SSM -> SpringBoot
HTML -> CSS -> SQL -> JavaScript -> Java -> JSP -> Servlet -> SSM -> SpringBoot
HTML -> CSS -> JavaScript -> Java -> SQL -> Servlet -> JSP -> SSM -> SpringBoot
HTML -> CSS -> JavaScript -> Java -> SQL -> JSP -> Servlet -> SSM -> SpringBoot
HTML -> CSS -> JavaScript -> Java -> Servlet -> SQL -> JSP -> SSM -> SpringBoot
HTML -> CSS -> JavaScript -> Java -> Servlet -> JSP -> SQL -> SSM -> SpringBoot
HTML -> CSS -> JavaScript -> Java -> JSP -> SQL -> Servlet -> SSM -> SpringBoot
HTML -> CSS -> JavaScript -> Java -> JSP -> Servlet -> SQL -> SSM -> SpringBoot
HTML -> CSS -> JavaScript -> SQL -> Java -> Servlet -> JSP -> SSM -> SpringBoot
HTML -> CSS -> JavaScript -> SQL -> Java -> JSP -> Servlet -> SSM -> SpringBoot
HTML -> SQL -> Java -> CSS -> JavaScript -> Servlet -> JSP -> SSM -> SpringBoot
HTML -> SQL -> Java -> CSS -> JavaScript -> JSP -> Servlet -> SSM -> SpringBoot
HTML -> SQL -> Java -> CSS -> Servlet -> JavaScript -> JSP -> SSM -> SpringBoot
HTML -> SQL -> Java -> Servlet -> CSS -> JavaScript -> JSP -> SSM -> SpringBoot
HTML -> SQL -> CSS -> Java -> JavaScript -> Servlet -> JSP -> SSM -> SpringBoot
HTML -> SQL -> CSS -> Java -> JavaScript -> JSP -> Servlet -> SSM -> SpringBoot
HTML -> SQL -> CSS -> Java -> Servlet -> JavaScript -> JSP -> SSM -> SpringBoot
HTML -> SQL -> CSS -> JavaScript -> Java -> Servlet -> JSP -> SSM -> SpringBoot
HTML -> SQL -> CSS -> JavaScript -> Java -> JSP -> Servlet -> SSM -> SpringBoot
CSS -> Java -> HTML -> SQL -> JavaScript -> Servlet -> JSP -> SSM -> SpringBoot
CSS -> Java -> HTML -> SQL -> JavaScript -> JSP -> Servlet -> SSM -> SpringBoot
CSS -> Java -> HTML -> SQL -> Servlet -> JavaScript -> JSP -> SSM -> SpringBoot
CSS -> Java -> HTML -> JavaScript -> SQL -> Servlet -> JSP -> SSM -> SpringBoot
CSS -> Java -> HTML -> JavaScript -> SQL -> JSP -> Servlet -> SSM -> SpringBoot
CSS -> Java -> HTML -> JavaScript -> Servlet -> SQL -> JSP -> SSM -> SpringBoot
CSS -> Java -> HTML -> JavaScript -> Servlet -> JSP -> SQL -> SSM -> SpringBoot
CSS -> Java -> HTML -> JavaScript -> JSP -> SQL -> Servlet -> SSM -> SpringBoot
CSS -> Java -> HTML -> JavaScript -> JSP -> Servlet -> SQL -> SSM -> SpringBoot
CSS -> Java -> HTML -> Servlet -> SQL -> JavaScript -> JSP -> SSM -> SpringBoot
CSS -> Java -> HTML -> Servlet -> JavaScript -> SQL -> JSP -> SSM -> SpringBoot
CSS -> Java -> HTML -> Servlet -> JavaScript -> JSP -> SQL -> SSM -> SpringBoot
CSS -> Java -> SQL -> HTML -> JavaScript -> Servlet -> JSP -> SSM -> SpringBoot
CSS -> Java -> SQL -> HTML -> JavaScript -> JSP -> Servlet -> SSM -> SpringBoot
CSS -> Java -> SQL -> HTML -> Servlet -> JavaScript -> JSP -> SSM -> SpringBoot
CSS -> Java -> SQL -> Servlet -> HTML -> JavaScript -> JSP -> SSM -> SpringBoot
CSS -> Java -> Servlet -> HTML -> SQL -> JavaScript -> JSP -> SSM -> SpringBoot
CSS -> Java -> Servlet -> HTML -> JavaScript -> SQL -> JSP -> SSM -> SpringBoot
CSS -> Java -> Servlet -> HTML -> JavaScript -> JSP -> SQL -> SSM -> SpringBoot
CSS -> Java -> Servlet -> SQL -> HTML -> JavaScript -> JSP -> SSM -> SpringBoot
CSS -> HTML -> Java -> SQL -> JavaScript -> Servlet -> JSP -> SSM -> SpringBoot
CSS -> HTML -> Java -> SQL -> JavaScript -> JSP -> Servlet -> SSM -> SpringBoot
CSS -> HTML -> Java -> SQL -> Servlet -> JavaScript -> JSP -> SSM -> SpringBoot
CSS -> HTML -> Java -> JavaScript -> SQL -> Servlet -> JSP -> SSM -> SpringBoot
CSS -> HTML -> Java -> JavaScript -> SQL -> JSP -> Servlet -> SSM -> SpringBoot
CSS -> HTML -> Java -> JavaScript -> Servlet -> SQL -> JSP -> SSM -> SpringBoot
CSS -> HTML -> Java -> JavaScript -> Servlet -> JSP -> SQL -> SSM -> SpringBoot
CSS -> HTML -> Java -> JavaScript -> JSP -> SQL -> Servlet -> SSM -> SpringBoot
CSS -> HTML -> Java -> JavaScript -> JSP -> Servlet -> SQL -> SSM -> SpringBoot
CSS -> HTML -> Java -> Servlet -> SQL -> JavaScript -> JSP -> SSM -> SpringBoot
CSS -> HTML -> Java -> Servlet -> JavaScript -> SQL -> JSP -> SSM -> SpringBoot
CSS -> HTML -> Java -> Servlet -> JavaScript -> JSP -> SQL -> SSM -> SpringBoot
CSS -> HTML -> SQL -> Java -> JavaScript -> Servlet -> JSP -> SSM -> SpringBoot
CSS -> HTML -> SQL -> Java -> JavaScript -> JSP -> Servlet -> SSM -> SpringBoot
CSS -> HTML -> SQL -> Java -> Servlet -> JavaScript -> JSP -> SSM -> SpringBoot
CSS -> HTML -> SQL -> JavaScript -> Java -> Servlet -> JSP -> SSM -> SpringBoot
CSS -> HTML -> SQL -> JavaScript -> Java -> JSP -> Servlet -> SSM -> SpringBoot
CSS -> HTML -> JavaScript -> Java -> SQL -> Servlet -> JSP -> SSM -> SpringBoot
CSS -> HTML -> JavaScript -> Java -> SQL -> JSP -> Servlet -> SSM -> SpringBoot
CSS -> HTML -> JavaScript -> Java -> Servlet -> SQL -> JSP -> SSM -> SpringBoot
CSS -> HTML -> JavaScript -> Java -> Servlet -> JSP -> SQL -> SSM -> SpringBoot
CSS -> HTML -> JavaScript -> Java -> JSP -> SQL -> Servlet -> SSM -> SpringBoot
CSS -> HTML -> JavaScript -> Java -> JSP -> Servlet -> SQL -> SSM -> SpringBoot
CSS -> HTML -> JavaScript -> SQL -> Java -> Servlet -> JSP -> SSM -> SpringBoot
CSS -> HTML -> JavaScript -> SQL -> Java -> JSP -> Servlet -> SSM -> SpringBoot
CSS -> SQL -> Java -> HTML -> JavaScript -> Servlet -> JSP -> SSM -> SpringBoot
CSS -> SQL -> Java -> HTML -> JavaScript -> JSP -> Servlet -> SSM -> SpringBoot
CSS -> SQL -> Java -> HTML -> Servlet -> JavaScript -> JSP -> SSM -> SpringBoot
CSS -> SQL -> Java -> Servlet -> HTML -> JavaScript -> JSP -> SSM -> SpringBoot
CSS -> SQL -> HTML -> Java -> JavaScript -> Servlet -> JSP -> SSM -> SpringBoot
CSS -> SQL -> HTML -> Java -> JavaScript -> JSP -> Servlet -> SSM -> SpringBoot
CSS -> SQL -> HTML -> Java -> Servlet -> JavaScript -> JSP -> SSM -> SpringBoot
CSS -> SQL -> HTML -> JavaScript -> Java -> Servlet -> JSP -> SSM -> SpringBoot
CSS -> SQL -> HTML -> JavaScript -> Java -> JSP -> Servlet -> SSM -> SpringBoot
SQL -> Java -> HTML -> CSS -> JavaScript -> Servlet -> JSP -> SSM -> SpringBoot
SQL -> Java -> HTML -> CSS -> JavaScript -> JSP -> Servlet -> SSM -> SpringBoot
SQL -> Java -> HTML -> CSS -> Servlet -> JavaScript -> JSP -> SSM -> SpringBoot
SQL -> Java -> HTML -> Servlet -> CSS -> JavaScript -> JSP -> SSM -> SpringBoot
SQL -> Java -> CSS -> HTML -> JavaScript -> Servlet -> JSP -> SSM -> SpringBoot
SQL -> Java -> CSS -> HTML -> JavaScript -> JSP -> Servlet -> SSM -> SpringBoot
SQL -> Java -> CSS -> HTML -> Servlet -> JavaScript -> JSP -> SSM -> SpringBoot
SQL -> Java -> CSS -> Servlet -> HTML -> JavaScript -> JSP -> SSM -> SpringBoot
SQL -> Java -> Servlet -> HTML -> CSS -> JavaScript -> JSP -> SSM -> SpringBoot
SQL -> Java -> Servlet -> CSS -> HTML -> JavaScript -> JSP -> SSM -> SpringBoot
SQL -> HTML -> Java -> CSS -> JavaScript -> Servlet -> JSP -> SSM -> SpringBoot
SQL -> HTML -> Java -> CSS -> JavaScript -> JSP -> Servlet -> SSM -> SpringBoot
SQL -> HTML -> Java -> CSS -> Servlet -> JavaScript -> JSP -> SSM -> SpringBoot
SQL -> HTML -> Java -> Servlet -> CSS -> JavaScript -> JSP -> SSM -> SpringBoot
SQL -> HTML -> CSS -> Java -> JavaScript -> Servlet -> JSP -> SSM -> SpringBoot
SQL -> HTML -> CSS -> Java -> JavaScript -> JSP -> Servlet -> SSM -> SpringBoot
SQL -> HTML -> CSS -> Java -> Servlet -> JavaScript -> JSP -> SSM -> SpringBoot
SQL -> HTML -> CSS -> JavaScript -> Java -> Servlet -> JSP -> SSM -> SpringBoot
SQL -> HTML -> CSS -> JavaScript -> Java -> JSP -> Servlet -> SSM -> SpringBoot
SQL -> CSS -> Java -> HTML -> JavaScript -> Servlet -> JSP -> SSM -> SpringBoot
SQL -> CSS -> Java -> HTML -> JavaScript -> JSP -> Servlet -> SSM -> SpringBoot
SQL -> CSS -> Java -> HTML -> Servlet -> JavaScript -> JSP -> SSM -> SpringBoot
SQL -> CSS -> Java -> Servlet -> HTML -> JavaScript -> JSP -> SSM -> SpringBoot
SQL -> CSS -> HTML -> Java -> JavaScript -> Servlet -> JSP -> SSM -> SpringBoot
SQL -> CSS -> HTML -> Java -> JavaScript -> JSP -> Servlet -> SSM -> SpringBoot
SQL -> CSS -> HTML -> Java -> Servlet -> JavaScript -> JSP -> SSM -> SpringBoot
SQL -> CSS -> HTML -> JavaScript -> Java -> Servlet -> JSP -> SSM -> SpringBoot
SQL -> CSS -> HTML -> JavaScript -> Java -> JSP -> Servlet -> SSM -> SpringBoot