JPress安装完成后,如何能重新加载?

1、jetty模式下,JFinal会自动指定检查WebRoot目录,如果有发生变化,会自动重新加载。

2、tomcat容器下,可以通过tomcat的相关配置,让tomcat监控相应的文件,如果发生变化会自动重新加载。

下面简要通过代码来看下JFinal在jetty模式下如何做到重新加载的。2

玩过JFinla的人都知道,JFinal有一个start方法,通过start方法来启动jetty服务,方便开发调试。代码如下:

public static void start(int port){

JFinal.start("WebRoot", 8080, "/", 5);

}

通过JFinal.start方法,传入相关的配置,即可启动jetty。

JFinal的start方法也非常简单,代码如下:

public final class JFinal{        //....此处省略

public static void start(){

server = ServerFactory.getServer();

server.start();

}        //....此处省略}

通过ServerFactory.getServer()获取一个Server,然后启动Server。这里获取的Server是一个jettyServer。代码如下:

class JettyServer implements IServer{        // ...此处省略

public void start(){if (!running) {try {doStart();} catch (Exception e) {LogKit.error(e.getMessage(), e);}

running = true;

}

}private void doStart(){// ...此处省略

Scanner scanner = new Scanner(PathKit.getRootClassPath(), scanIntervalSeconds) {public void onChange(){try {

System.err.println("\nLoading changes ......");

webApp.stop();

JFinalClassLoader loader = new JFinalClassLoader(webApp, getClassPath());

webApp.setClassLoader(loader);

webApp.start();

System.err.println("Loading complete.");

} catch (Exception e) {

System.err.println("Error reconfiguring/restarting webapp after change in watched files");

LogKit.error(e.getMessage(), e);

}

}

};

scanner.start();

}

// ...此处省略

}        // ...此处省略}

当Server调用start方法后,start方法会调用doStart()方法,doStart()里面创建了一个扫描器Scanner,传入一个匿名内部类,实现监听onChange监听,并调用Scanner.start()启动Scanner。

Scanner的简要代码如下:

public abstract class Scanner{        public void start(){if (!running) {

timer = new Timer("JFinal-Scanner", true);

task = new TimerTask() {public void run(){working();}};

timer.schedule(task, 1010L * interval, 1010L * interval);

running = true;

}

}        private void working(){

scan(rootDir);

compare();

preScan.clear();

preScan.putAll(curScan);

curScan.clear();

}

private void scan(File file){if (file == null || !file.exists())return ;

if (file.isFile()) {try {

curScan.put(file.getCanonicalPath(), new TimeSize(file.lastModified(),file.length()));

} catch (IOException e) {

LogKit.error(e.getMessage(), e);

}

}else if (file.isDirectory()) {

File[] fs = file.listFiles();if (fs != null)for (File f : fs)

scan(f);

}

}

private void compare(){if (preScan.size() == 0)return;

if (!preScan.equals(curScan))

onChange();

}

}

当Scanner的start方法被调用的时候,会启动一个定时器执行working()方法,working()方法内部只做两件事情。

1、通过scan方法扫描文件,并把文件的最后修改时间添加到curScan这个map里面去。

2、通过compare方法来判断刚刚扫描的额这个map和之前已经的map是否相同,如果不相同就调用onChange()方法。

刚才我们在JettyServer传入了一个匿名内部类,并实现了onChange()方法了,因此,Scanner调用onChange其实就是调用了JettyServer传入的这个匿名内部类的onChange()。

再回头来看一下匿名内部类的onChange()的实现:

Scanner scanner = new Scanner(PathKit.getRootClassPath(), scanIntervalSeconds) { public void onChange(){try {

System.err.println("\nLoading changes ......");

webApp.stop();

JFinalClassLoader loader = new JFinalClassLoader(webApp, getClassPath());

webApp.setClassLoader(loader);

webApp.start();

System.err.println("Loading complete.");

} catch (Exception e) {

System.err.println("Error reconfiguring/restarting webapp after change in watched files");

LogKit.error(e.getMessage(), e);

}

}

};

在这里,我们能够很明显的看到,通过webApp.stop方法停止了web服务,然后又通过start()方法启动了web服务。

到此,Jetty环境下讲解完毕。我们也得到了这么一个结论:只要RootClassPath下有文件发生变化,就会造成jetty重新加载,JPress也是利用了JFinal的这个特性,安装完毕后会在ClassPath下创建db.properties文件,发生了文件变化,从而让Jetty达到重新加载的目的。

精通JFinal视频教程

http://www.roncoo.com/course/view/a033a4dff3a2473f9f9f6667cf069ffd

JFinal是国人开发的一个精巧而简单的JavaWeb开发框架

《精通JFinal》视频教程

1、实用,实战。

2、和JPress相结合。JPress并不是一个demo,而是一个真正的商业级产品,在讲JFinal方方面面的时候,我会讲到在JPress中是如何使用的。因此,学完这个课程,您也会学会了在企业产品开发中应该注意的方方面面。

3、实战+源码级讲解,学完不仅仅只会使用,更能深入了解JFinal的机制,甚至自己的可以写出一个JFinal。

jpress转换html5,JPress技术精讲:JPress如何做到安装后重新加载的?相关推荐

  1. Flink - 尚硅谷- 大数据高级 Flink 技术精讲 - 2

    七.Flink 时间语义与 Watermark 7.1 Flink 中的时间语义 7.2 设置 Event Time 7.3 水位线 - Watermark 7.3.1 基本概念 7.3.2 Wate ...

  2. RabbitMQ消息中间件技术精讲全集

    RabbitMQ消息中间件技术精讲 导航: RabbitMQ消息中间件技术精讲 一. 主流消息中间件介绍 1.1 ActiveMQ 1.2 Kafka 1.3 RocketMQ 1.4 RabbitM ...

  3. 老的消息中间件投递失败的类型值_RabbitMQ消息中间件技术精讲11 高级篇四 confirm 确认消息...

    RabbitMQ消息中间件技术精讲11 高级篇四 confirm 确认消息 理解Confirm消息确认机制: 消息的确认,是指生产者投递消息后,如果broker收到消息,则会给生产者一个应答: 生产者 ...

  4. 技术精讲丨多线程环境下时间轮-海量定时任务的定时器设计

    多线程环境下海量定时任务处理-定时器设计 1.  定时器设计 2.  红黑树.最小堆以及跳表的实现对比 3.  时间轮的实现 视频讲解如下,点击观看: 技术精讲丨多线程环境下时间轮-海量定时任务的定时 ...

  5. html中init是什么作用,HTML5教程:精讲__init__、__new__、__call__方法(可面试用)

    原标题:HTML5教程:精讲__init__.__new__.__call__方法(可面试用) 任何事物都有一个从创建,被使用,再到消亡的过程,在程序语言面向对象编程模型中,对象也有相似的命运:创建. ...

  6. [小森数据结构]看电影-顺序表技术精讲

    故事前研(言) 小森去看电影<<流浪地球2>>的时候买电影票的场景. 突然一个叫高启强的人买电影票 拉了两个Hei友,来看电影 <<流浪地球2>> 当场 ...

  7. 视频教程-华为路由交换精讲系列20:OSPF技术精讲 [肖哥]视频课程-华为认证

    华为路由交换精讲系列20:OSPF技术精讲 [肖哥]视频课程 肖老师(肖哥),思科认证讲师讲师(CCIE#27529),RedHat Linux认证讲师讲师,Juniper 认证讲师讲师,微软认证讲师 ...

  8. Hadoop和大数据技术精讲班

    尊敬的先生/女士: 思数于计算和大数据服务中心http://www.bihadoop.com,简称思数于(隶属亍北京思数科技有限公司),是国内与业大数据分析培训.咨询机构.中国于计算大数据处理委员会. ...

  9. 【微信技术-微信小程序】------- 渐进式骨架屏(加载流)(第二篇)

    提示:看如下内容需要了解第一篇:简单入门(骨架屏(加载流) 简单入门(第一篇)) 目录 一.什么是渐进式骨架屏? 二.实现渐进式骨架屏 三.效果展示 下载示例代码地址: 渐进式骨架屏示例代码-下载 一 ...

  10. html5的技术串讲,Web前端开发职业标准串讲(初级).pdf

    Web前端开发职业技能标准串讲 初级 工业和信息化部教育与考试中心 Web前端开发职业技能等级标准 初级能力标准知识点解析 ➢1 Web页面制作基础 ➢2 HTML5和CSS3开发基础与应用 ➢3 J ...

最新文章

  1. ajax制作表格,Ajax实现表格实时编辑(示例代码)
  2. 怎么重写MDK(KEIL)Flash烧写程序
  3. 文巾解题1588. 所有奇数长度子数组的和
  4. Hexo+腾讯CVM+又拍云+github+gitee+coding
  5. Linux du指令
  6. boost::sort模块实现整数排序与右移函子反向排序示例
  7. 利用Quartus设计4位同步二进制加法计数器
  8. 使用 010 Editor 分析二进制文件格式
  9. 洛谷2014 选课(树形DP)树形背包问题
  10. CSS中的position
  11. Flutter时间轴(timeline)
  12. 使用python将数据存入SQLite3数据库
  13. Linux命令格式及帮助命令详解
  14. 客户端浏览器Chrome过早断开连接导致Nginx报400错误的解决办法
  15. php在函数中定义全局变量,PHP 全局变量在用户自定义函数内部不足见
  16. [Hbase]Hbase知识大全
  17. javaJSON字符串转换实体类
  18. 程序员申请加班调休被HR拒绝:996是行规,不想加班就滚?
  19. 如歌岁月--之《老鹰之歌》
  20. 关于手机天气应用中的城市搜索的联想查找方式优化

热门文章

  1. PHP汉字取拼音缩写
  2. 亚夏汽车首发申请通过 成第2家IPO经销商_135
  3. 解决接收 ACTION_PACKAGE_REPLACED 的广播会另外接收到 REMOVED 和 ADDED 的问题
  4. SCI检索与EI检索
  5. 全国卖菜大爷将大面积失业,社区团购夺走卖菜商贩生计,真的会出问题吗
  6. 国内怎么captcha测试_通过简单的数字测试或PHP图像处理使CAPTCHA更友好
  7. Proofs for Inner Pairing Products and Applications 学习笔记
  8. wps下载的简历无法删除空白页
  9. 红孩儿编辑器的详细设计第四部分
  10. 身家破亿!86版「红孩儿」拒绝出道成学霸,已是中科院博士,名下52家公司