【JPress】Install

2021SC@SDUSC

目录

2021SC@SDUSC

一、InstallManager

二、DbExecuter

三、InstallHandler


本模块为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已经正常安装了,就可以继续正常的请求。如果如果找不到'.'字符,则直接返回,因为这往往是一个非法的请求。其他情况下,会跳转到安装步骤。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值