2021SC@SDUSC
目录
本模块为JPress核心包下的安装模块,用于新用户初始化个人JPress账户密码、JPress数据库的工作。
一、InstallManager
安装管理器使用了懒汉式的单例模式,在类创建的同时就已经创建好一个静态的InstallManager对象供系统使用,以后不再改变,所以天生是线程安全的。好处是没有线程安全的问题,坏处是浪费内存空间。浪费内存空间是因为一开始就实例化了,系统资源开销大。
InstallManager主要的函数还是init()函数,用于安装新用户的数据库。根据用户提供的dbName, dbUser, dbPassword, dbHost, dbHostPort来初始化数据库执行器。查询数据库中的表来判断该数据库是否创建成功、是否是最新版本、或者其他版本。
public void init( String dbName, String dbUser, String dbPassword, String dbHost, int dbHostPort) { dbExecuter = new DbExecuter(dbName, dbUser, dbPassword, dbHost, dbHostPort); List<String> tables = dbExecuter.queryTables(); if (ArrayUtil.isNullOrEmpty(tables)) { dbExist = false; isJPressDb = false; isNeedUpgrade = false; } else if (tables.containsAll(Consts.LATEST_TABLES)) { dbExist = true; isJPressDb = true; isNeedUpgrade = false; } else if (tables.containsAll(Consts.V2_TABLES)) { dbExist = true; isJPressDb = true; isNeedUpgrade = true; upgradeSqlFileName = "v2_upgrade.sql"; } else { dbExist = true; isJPressDb = false; } }
InstallManager还可以提供数据库执行器来初始化基础数据库。
public void doInitDatabase() throws SQLException { String sqlFilePath = PathKit.getWebRootPath() + "/WEB-INF/install/sqls/install.sql"; String installSql = FileUtil.readString(new File(sqlFilePath)); dbExecuter.executeSql(installSql); }
这被用于初始化网页中,当用户的账号密码、数据库地址都输入正确后,执行该方法。
二、DbExecuter
DbExecuter用于管理数据库,它需要dbName, dbUser, dbPassword, dbHost, dbHostPort来初始化。它作为InstallManager的一个私有属性,它在install控制器收到用户的请求后,执行InstallManager类的init方法,然后就会一直保存在JVM的方法区中,在整个程序中永远唯一存在。
它的功能有:连接数据库、提供数据库增删改查接口、提供数据库及用户的基本信息。
三、InstallHandler
InstallHandler为安装JPress的处理器,继承了Handler类。
@Override public void handle(String target, HttpServletRequest request, HttpServletResponse response, boolean[] isHandled) { if (Installer.isInstalled()) { next.handle(target, request, response, isHandled); return; } if (target.indexOf('.') != -1) { return; } if (!target.startsWith("/install")) { HandlerKit.redirect(request.getContextPath() + "/install",request,response,isHandled); } else { next.handle(target, request, response, isHandled); } }
如果JPress已经正常安装了,就可以继续正常的请求。如果如果找不到'.'字符,则直接返回,因为这往往是一个非法的请求。其他情况下,会跳转到安装步骤。