作为 PHP 程序员是很无聊的, 所以看看 Java.我对 Java 一无所知,以下内容一定有错漏的地方,请路过的高手开示一二.多谢多谢.
这个学习笔记暂时会停留在 servlet, latkes 上, 暂时不会跨越 jetty.
从 latke-demo 的 Starter.java
开始:
Latkes.setScanPath("org.b3log.latke.demo.hello"); // For Latke IoC
Latkes.initRuntimeEnv();
String classesPath = ClassLoader.getSystemResource("").getPath(); // Real path including maven sub folder
String webappDirLocation = classesPath.replace("target/classes/","src/main/webapp/"); // POM structure in dev env
final File file = new File(webappDirLocation);
if (!file.exists()) {
webappDirLocation = "."; // production environment
}
System.out.println(webappDirLocation);
final Server server = new Server(Integer.valueOf(Latkes.getServerPort()));
final WebAppContext root = new WebAppContext();
root.setParentLoaderPriority(true); // Use parent class loader
root.setContextPath("/");
root.setDescriptor(webappDirLocation + "/WEB-INF/web.xml");
root.setResourceBase(webappDirLocation);
server.setHandler(root);
try {
server.start();
} catch (final Exception e) {
e.printStackTrace();
System.exit(-1);
}
这段代码前两行 Latkes 的先略过不表.从这里开始看:
ClassLoader.getSystemResource("")
行为上看: 按照 classpath
顺序查找参数中指定的资源,包括 jar 包里面.但是当参数为空串的时候,只会查找目录而不包含 jar 包.
比如: java -cp WEB-INF/lib/*:WEB-INF/classes Starter
传递空串会返回 /path/to/WEB-INF/classes
路径
非空串则会检索 jar 包,返回类似这种路径 /path/to/WEB-INF/lib/cdi-api-1.0.jar!beans.xsd
内部实现没有找到.
classPath.replace
目的是调试, 因为后和开发时生成的目录结构不一样, 所以算是一个补丁.
上面的代码在产品环境下按照注释
java-cp WEB-INF/lib/*:WEB-INF/classes org.b3log.latke.demo.hello.Starter
应该是跑不通的,因为找不到 web.xml
,只需要 -cp .:WEB-INF/lib/*:WEB-INF/classes
, 这样做的原因还是看前面的 classloader 部分.
接下来都是关于 jetty 的, 相关资料看这里: embedding-jetty,暂时不会深入.
Latkes.getServerPort()
问题: 这个 port 是怎么来的呢?
Latke 类有一个静态初始化块, 里面加载了:
- latke.properties
- local.properties
- remote.properties
三个文件, 第一个是 latke 框架本身的配置.端口在此配置.那 latke 是如何加载的呢?回到代码的第二句.
Latkes.initRuntimeEnv()
这个函数根据 latke.properties
初始化了运行环境和数据库配置, 看代码 runtimeEnv
的值总是 Local
, 这样的话就会总是去初始化数据库了.不确定为什么.
latke 到这里算是告一个小小的段落,接下来有一些 servlet 相关的东西.
Starter 的代码中, jetty 加载了 web.xml, 到底 jetty 如何运作我们先不管,以免战线太长.总之先理解为 jetty 按照 web.xml 的说明进行一些初始化工作吧.
但是 servlet 是绕不过去的,先看 web.xml:
Listener: org.b3log.latke.demo.hello.HelloServletListener
(这个编辑器不支持 xml 标签)
这一行定义了 servlet 的 listerner, 什么是 listener 呢?看这里: filters & listeners
event listener 在 servlet 发生关键事件时给予应用监听此事件的能力. servlet 事件包含两个级别:
- 应用级别(怎么形容?就是应用吧)
- 会话级别(同一个用户的一系列请求)
但是看 latke 的代码还有一个请求级别的 ServletRequestListener
, 暂时还不确定和 session 级别有多大区别,之后验证.
现在我们知道 jetty 在初始化后会通过 ServletContextListener
通知我们可以接收请求了.接下来 latke 到底做了哪些事情?下回再说.
PS: jetty 工作原理, [http://www.ibm.com/developerworks/cn/java/j-lo-jetty/index.html](http://www.ibm.com/developerworks/cn/java/j-lo-jetty/index.html%5D(http:/www.ibm.com/developerworks/cn/java/j-lo-jetty/index.html))
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于