从 Latke 开始学习 Java web 开发

本贴最后更新于 2722 天前,其中的信息可能已经事过景迁

作为一个 PHP 程序员内心是空虚的,抛开了 fastcgi 我就无所适从了.所以我要学一些和以往不一样的东西.
Java 的 web 开发框架很多, 为什么选择 latke?没有理由,因为我没得对比嘛.为什么要阅读框架而不是基于框架做一个应用?因为个人习惯.做 php 时也是一样,每用一个新框架都会读一遍它的源码(结构上),当然了 php 的框架结构都很简单.


我对 Java 一无所知,以下一定会有错误疏漏,若有路过的大神肯开示一二,不胜感激!


这个学习笔记暂时会停留在 servlet, latke 上, 暂时不会跨越 jetty.

从 Starter 开始

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("") get 到了什么?

行为上看: 按照 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-cpWEB-INF/lib/*:WEB-INF/classesorg.b3log.latke.demo.hello.Starter

应该是跑不通的,因为找不到 web.xml,只需要 -cp .:WEB-INF/lib/*:WEB-INF/classes 这样, 原因还是看前面的 classloader.

接下来都是关于 jetty 的, 主要是加载 web.xml, 相关资料看这里: http://www.eclipse.org/jetty/documentation/current/embedding-jetty.html ,暂时不会深入.



Latkes.getServerPort()

问题: 这个 port 是怎么来的呢?

我们回到最前面两句

Latkes.setScanPath("org.b3log.latke.demo.hello"); // For Latke IoC
Latkes.initRuntimeEnv();

Latke 类有一个静态初始化块, 里面加载了

  • latke.properties
  • local.properties
  • remote.properties

三个文件, 第一个是 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 呢?看此文档: https://docs.oracle.com/cd/B14099_19/web.1012/b14017/filters.htm

如上文档可知, event listener 在 servlet(容器?)发生关键事件时给予应用监听此事件的能力. servlet 事件包含两个级别:

  • 应用级别(如何形容?就是应用)
  • 会话级别(同一个用户的一系列请求)

但是看 latke 的代码还有一个请求级别的 ServletRequestListener, 暂时还不确定和 session 级别有多大区别,之后验证.



现在我们知道 jetty 在初始化后会通过 ServletContextListener 通知我们的应用可以接收请求了.接下来 latke 到底做了哪些事情?
明天继续.



PS: jetty 工作原理,可以先大概了解下 http://www.ibm.com/developerworks/cn/java/j-lo-jetty/index.html

  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3168 引用 • 8207 回帖 • 1 关注
  • Latke

    Latke 是一款以 JSON 为主的 Java Web 框架。

    70 引用 • 532 回帖 • 712 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • 房星科技

    房星网,我们不和没有钱的程序员谈理想,我们要让程序员又有理想又有钱。我们有雄厚的房地产行业线下资源,遍布昆明全城的 100 家门店、四千地产经纪人是我们坚实的后盾。

    6 引用 • 141 回帖 • 558 关注
  • Love2D

    Love2D 是一个开源的, 跨平台的 2D 游戏引擎。使用纯 Lua 脚本来进行游戏开发。目前支持的平台有 Windows, Mac OS X, Linux, Android 和 iOS。

    14 引用 • 53 回帖 • 513 关注
  • Netty

    Netty 是一个基于 NIO 的客户端-服务器编程框架,使用 Netty 可以让你快速、简单地开发出一个可维护、高性能的网络应用,例如实现了某种协议的客户、服务端应用。

    49 引用 • 33 回帖 • 23 关注
  • Flume

    Flume 是一套分布式的、可靠的,可用于有效地收集、聚合和搬运大量日志数据的服务架构。

    9 引用 • 6 回帖 • 594 关注
  • CentOS

    CentOS(Community Enterprise Operating System)是 Linux 发行版之一,它是来自于 Red Hat Enterprise Linux 依照开放源代码规定释出的源代码所编译而成。由于出自同样的源代码,因此有些要求高度稳定的服务器以 CentOS 替代商业版的 Red Hat Enterprise Linux 使用。两者的不同在于 CentOS 并不包含封闭源代码软件。

    238 引用 • 224 回帖
  • Thymeleaf

    Thymeleaf 是一款用于渲染 XML/XHTML/HTML5 内容的模板引擎。类似 Velocity、 FreeMarker 等,它也可以轻易的与 Spring 等 Web 框架进行集成作为 Web 应用的模板引擎。与其它模板引擎相比,Thymeleaf 最大的特点是能够直接在浏览器中打开并正确显示模板页面,而不需要启动整个 Web 应用。

    11 引用 • 19 回帖 • 318 关注
  • 反馈

    Communication channel for makers and users.

    123 引用 • 906 回帖 • 192 关注
  • 正则表达式

    正则表达式(Regular Expression)使用单个字符串来描述、匹配一系列遵循某个句法规则的字符串。

    31 引用 • 94 回帖
  • Rust

    Rust 是一门赋予每个人构建可靠且高效软件能力的语言。Rust 由 Mozilla 开发,最早发布于 2014 年 9 月。

    57 引用 • 22 回帖 • 4 关注
  • 博客

    记录并分享人生的经历。

    270 引用 • 2386 回帖
  • Postman

    Postman 是一款简单好用的 HTTP API 调试工具。

    4 引用 • 3 回帖 • 1 关注
  • IPFS

    IPFS(InterPlanetary File System,星际文件系统)是永久的、去中心化保存和共享文件的方法,这是一种内容可寻址、版本化、点对点超媒体的分布式协议。请浏览 IPFS 入门笔记了解更多细节。

    20 引用 • 245 回帖 • 229 关注
  • Solidity

    Solidity 是一种智能合约高级语言,运行在 [以太坊] 虚拟机(EVM)之上。它的语法接近于 JavaScript,是一种面向对象的语言。

    3 引用 • 18 回帖 • 349 关注
  • 脑图

    脑图又叫思维导图,是表达发散性思维的有效图形思维工具 ,它简单却又很有效,是一种实用性的思维工具。

    21 引用 • 58 回帖
  • Electron

    Electron 基于 Chromium 和 Node.js,让你可以使用 HTML、CSS 和 JavaScript 构建应用。它是一个由 GitHub 及众多贡献者组成的活跃社区共同维护的开源项目,兼容 Mac、Windows 和 Linux,它构建的应用可在这三个操作系统上面运行。

    15 引用 • 136 回帖 • 8 关注
  • 新人

    让我们欢迎这对新人。哦,不好意思说错了,让我们欢迎这位新人!
    新手上路,请谨慎驾驶!

    51 引用 • 226 回帖
  • 爬虫

    网络爬虫(Spider、Crawler),是一种按照一定的规则,自动地抓取万维网信息的程序。

    106 引用 • 275 回帖
  • 外包

    有空闲时间是接外包好呢还是学习好呢?

    26 引用 • 232 回帖 • 6 关注
  • CodeMirror
    1 引用 • 2 回帖 • 116 关注
  • OkHttp

    OkHttp 是一款 HTTP & HTTP/2 客户端库,专为 Android 和 Java 应用打造。

    16 引用 • 6 回帖 • 54 关注
  • etcd

    etcd 是一个分布式、高可用的 key-value 数据存储,专门用于在分布式系统中保存关键数据。

    5 引用 • 26 回帖 • 491 关注
  • CAP

    CAP 指的是在一个分布式系统中, Consistency(一致性)、 Availability(可用性)、Partition tolerance(分区容错性),三者不可兼得。

    11 引用 • 5 回帖 • 562 关注
  • ActiveMQ

    ActiveMQ 是 Apache 旗下的一款开源消息总线系统,它完整实现了 JMS 规范,是一个企业级的消息中间件。

    19 引用 • 13 回帖 • 628 关注
  • Google

    Google(Google Inc.,NASDAQ:GOOG)是一家美国上市公司(公有股份公司),于 1998 年 9 月 7 日以私有股份公司的形式创立,设计并管理一个互联网搜索引擎。Google 公司的总部称作“Googleplex”,它位于加利福尼亚山景城。Google 目前被公认为是全球规模最大的搜索引擎,它提供了简单易用的免费服务。不作恶(Don't be evil)是谷歌公司的一项非正式的公司口号。

    49 引用 • 192 回帖
  • 微信

    腾讯公司 2011 年 1 月 21 日推出的一款手机通讯软件。用户可以通过摇一摇、搜索号码、扫描二维码等添加好友和关注公众平台,同时可以将自己看到的精彩内容分享到微信朋友圈。

    129 引用 • 793 回帖
  • Logseq

    Logseq 是一个隐私优先、开源的知识库工具。

    Logseq is a joyful, open-source outliner that works on top of local plain-text Markdown and Org-mode files. Use it to write, organize and share your thoughts, keep your to-do list, and build your own digital garden.

    4 引用 • 55 回帖 • 7 关注
  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3168 引用 • 8207 回帖 • 1 关注