jpress转换html5,JPress技术精讲:JPress如何做到安装后重新加载的?
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如何做到安装后重新加载的?相关推荐
- Flink - 尚硅谷- 大数据高级 Flink 技术精讲 - 2
七.Flink 时间语义与 Watermark 7.1 Flink 中的时间语义 7.2 设置 Event Time 7.3 水位线 - Watermark 7.3.1 基本概念 7.3.2 Wate ...
- RabbitMQ消息中间件技术精讲全集
RabbitMQ消息中间件技术精讲 导航: RabbitMQ消息中间件技术精讲 一. 主流消息中间件介绍 1.1 ActiveMQ 1.2 Kafka 1.3 RocketMQ 1.4 RabbitM ...
- 老的消息中间件投递失败的类型值_RabbitMQ消息中间件技术精讲11 高级篇四 confirm 确认消息...
RabbitMQ消息中间件技术精讲11 高级篇四 confirm 确认消息 理解Confirm消息确认机制: 消息的确认,是指生产者投递消息后,如果broker收到消息,则会给生产者一个应答: 生产者 ...
- 技术精讲丨多线程环境下时间轮-海量定时任务的定时器设计
多线程环境下海量定时任务处理-定时器设计 1. 定时器设计 2. 红黑树.最小堆以及跳表的实现对比 3. 时间轮的实现 视频讲解如下,点击观看: 技术精讲丨多线程环境下时间轮-海量定时任务的定时 ...
- html中init是什么作用,HTML5教程:精讲__init__、__new__、__call__方法(可面试用)
原标题:HTML5教程:精讲__init__.__new__.__call__方法(可面试用) 任何事物都有一个从创建,被使用,再到消亡的过程,在程序语言面向对象编程模型中,对象也有相似的命运:创建. ...
- [小森数据结构]看电影-顺序表技术精讲
故事前研(言) 小森去看电影<<流浪地球2>>的时候买电影票的场景. 突然一个叫高启强的人买电影票 拉了两个Hei友,来看电影 <<流浪地球2>> 当场 ...
- 视频教程-华为路由交换精讲系列20:OSPF技术精讲 [肖哥]视频课程-华为认证
华为路由交换精讲系列20:OSPF技术精讲 [肖哥]视频课程 肖老师(肖哥),思科认证讲师讲师(CCIE#27529),RedHat Linux认证讲师讲师,Juniper 认证讲师讲师,微软认证讲师 ...
- Hadoop和大数据技术精讲班
尊敬的先生/女士: 思数于计算和大数据服务中心http://www.bihadoop.com,简称思数于(隶属亍北京思数科技有限公司),是国内与业大数据分析培训.咨询机构.中国于计算大数据处理委员会. ...
- 【微信技术-微信小程序】------- 渐进式骨架屏(加载流)(第二篇)
提示:看如下内容需要了解第一篇:简单入门(骨架屏(加载流) 简单入门(第一篇)) 目录 一.什么是渐进式骨架屏? 二.实现渐进式骨架屏 三.效果展示 下载示例代码地址: 渐进式骨架屏示例代码-下载 一 ...
- html5的技术串讲,Web前端开发职业标准串讲(初级).pdf
Web前端开发职业技能标准串讲 初级 工业和信息化部教育与考试中心 Web前端开发职业技能等级标准 初级能力标准知识点解析 ➢1 Web页面制作基础 ➢2 HTML5和CSS3开发基础与应用 ➢3 J ...
最新文章
- ajax制作表格,Ajax实现表格实时编辑(示例代码)
- 怎么重写MDK(KEIL)Flash烧写程序
- 文巾解题1588. 所有奇数长度子数组的和
- Hexo+腾讯CVM+又拍云+github+gitee+coding
- Linux du指令
- boost::sort模块实现整数排序与右移函子反向排序示例
- 利用Quartus设计4位同步二进制加法计数器
- 使用 010 Editor 分析二进制文件格式
- 洛谷2014 选课(树形DP)树形背包问题
- CSS中的position
- Flutter时间轴(timeline)
- 使用python将数据存入SQLite3数据库
- Linux命令格式及帮助命令详解
- 客户端浏览器Chrome过早断开连接导致Nginx报400错误的解决办法
- php在函数中定义全局变量,PHP 全局变量在用户自定义函数内部不足见
- [Hbase]Hbase知识大全
- javaJSON字符串转换实体类
- 程序员申请加班调休被HR拒绝:996是行规,不想加班就滚?
- 如歌岁月--之《老鹰之歌》
- 关于手机天气应用中的城市搜索的联想查找方式优化
热门文章
- PHP汉字取拼音缩写
- 亚夏汽车首发申请通过 成第2家IPO经销商_135
- 解决接收 ACTION_PACKAGE_REPLACED 的广播会另外接收到 REMOVED 和 ADDED 的问题
- SCI检索与EI检索
- 全国卖菜大爷将大面积失业,社区团购夺走卖菜商贩生计,真的会出问题吗
- 国内怎么captcha测试_通过简单的数字测试或PHP图像处理使CAPTCHA更友好
- Proofs for Inner Pairing Products and Applications 学习笔记
- wps下载的简历无法删除空白页
- 红孩儿编辑器的详细设计第四部分
- 身家破亿!86版「红孩儿」拒绝出道成学霸,已是中科院博士,名下52家公司