从 Latke 开始学习 Java web 开发 (1)

本贴最后更新于 2938 天前,其中的信息可能已经时过境迁

作为 PHP 程序员是很无聊的, 所以看看 Java.我对 Java 一无所知,以下内容一定有错漏的地方,请路过的高手开示一二.多谢多谢.

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

latke-demoStarter.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))

  • Latke

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

    71 引用 • 535 回帖 • 788 关注
  • Java

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

    3187 引用 • 8213 回帖

相关帖子

欢迎来到这里!

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

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

推荐标签 标签

  • 正则表达式

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

    31 引用 • 94 回帖
  • 智能合约

    智能合约(Smart contract)是一种旨在以信息化方式传播、验证或执行合同的计算机协议。智能合约允许在没有第三方的情况下进行可信交易,这些交易可追踪且不可逆转。智能合约概念于 1994 年由 Nick Szabo 首次提出。

    1 引用 • 11 回帖 • 3 关注
  • 深度学习

    深度学习(Deep Learning)是机器学习的分支,是一种试图使用包含复杂结构或由多重非线性变换构成的多个处理层对数据进行高层抽象的算法。

    53 引用 • 40 回帖
  • MySQL

    MySQL 是一个关系型数据库管理系统,由瑞典 MySQL AB 公司开发,目前属于 Oracle 公司。MySQL 是最流行的关系型数据库管理系统之一。

    691 引用 • 535 回帖
  • CSDN

    CSDN (Chinese Software Developer Network) 创立于 1999 年,是中国的 IT 社区和服务平台,为中国的软件开发者和 IT 从业者提供知识传播、职业发展、软件开发等全生命周期服务,满足他们在职业发展中学习及共享知识和信息、建立职业发展社交圈、通过软件开发实现技术商业化等刚性需求。

    14 引用 • 155 回帖 • 1 关注
  • ActiveMQ

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

    19 引用 • 13 回帖 • 672 关注
  • AngularJS

    AngularJS 诞生于 2009 年,由 Misko Hevery 等人创建,后为 Google 所收购。是一款优秀的前端 JS 框架,已经被用于 Google 的多款产品当中。AngularJS 有着诸多特性,最为核心的是:MVC、模块化、自动化双向数据绑定、语义化标签、依赖注入等。2.0 版本后已经改名为 Angular。

    12 引用 • 50 回帖 • 477 关注
  • gRpc
    11 引用 • 9 回帖 • 72 关注
  • WebComponents

    Web Components 是 W3C 定义的标准,它给了前端开发者扩展浏览器标签的能力,可以方便地定制可复用组件,更好的进行模块化开发,解放了前端开发者的生产力。

    1 引用 • 2 关注
  • Ant-Design

    Ant Design 是服务于企业级产品的设计体系,基于确定和自然的设计价值观上的模块化解决方案,让设计者和开发者专注于更好的用户体验。

    17 引用 • 23 回帖 • 1 关注
  • Sphinx

    Sphinx 是一个基于 SQL 的全文检索引擎,可以结合 MySQL、PostgreSQL 做全文搜索,它可以提供比数据库本身更专业的搜索功能,使得应用程序更容易实现专业化的全文检索。

    1 引用 • 215 关注
  • IPFS

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

    21 引用 • 245 回帖 • 240 关注
  • 服务

    提供一个服务绝不仅仅是简单的把硬件和软件累加在一起,它包括了服务的可靠性、服务的标准化、以及对服务的监控、维护、技术支持等。

    41 引用 • 24 回帖 • 3 关注
  • ngrok

    ngrok 是一个反向代理,通过在公共的端点和本地运行的 Web 服务器之间建立一个安全的通道。

    7 引用 • 63 回帖 • 627 关注
  • Electron

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

    15 引用 • 136 回帖
  • RYMCU

    RYMCU 致力于打造一个即严谨又活泼、专业又不失有趣,为数百万人服务的开源嵌入式知识学习交流平台。

    4 引用 • 6 回帖 • 53 关注
  • 程序员

    程序员是从事程序开发、程序维护的专业人员。

    568 引用 • 3532 回帖
  • Vditor

    Vditor 是一款浏览器端的 Markdown 编辑器,支持所见即所得、即时渲染(类似 Typora)和分屏预览模式。它使用 TypeScript 实现,支持原生 JavaScript、Vue、React 和 Angular。

    352 引用 • 1815 回帖 • 4 关注
  • 思源笔记

    思源笔记是一款隐私优先的个人知识管理系统,支持完全离线使用,同时也支持端到端加密同步。

    融合块、大纲和双向链接,重构你的思维。

    22416 引用 • 89750 回帖
  • B3log

    B3log 是一个开源组织,名字来源于“Bulletin Board Blog”缩写,目标是将独立博客与论坛结合,形成一种新的网络社区体验,详细请看 B3log 构思。目前 B3log 已经开源了多款产品:SymSoloVditor思源笔记

    1063 引用 • 3453 回帖 • 202 关注
  • 笔记

    好记性不如烂笔头。

    308 引用 • 793 回帖
  • WebSocket

    WebSocket 是 HTML5 中定义的一种新协议,它实现了浏览器与服务器之间的全双工通信(full-duplex)。

    48 引用 • 206 回帖 • 333 关注
  • InfluxDB

    InfluxDB 是一个开源的没有外部依赖的时间序列数据库。适用于记录度量,事件及实时分析。

    2 引用 • 74 关注
  • Mobi.css

    Mobi.css is a lightweight, flexible CSS framework that focus on mobile.

    1 引用 • 6 回帖 • 734 关注
  • Mac

    Mac 是苹果公司自 1984 年起以“Macintosh”开始开发的个人消费型计算机,如:iMac、Mac mini、Macbook Air、Macbook Pro、Macbook、Mac Pro 等计算机。

    166 引用 • 595 回帖 • 1 关注
  • 七牛云

    七牛云是国内领先的企业级公有云服务商,致力于打造以数据为核心的场景化 PaaS 服务。围绕富媒体场景,七牛先后推出了对象存储,融合 CDN 加速,数据通用处理,内容反垃圾服务,以及直播云服务等。

    27 引用 • 225 回帖 • 168 关注
  • 以太坊

    以太坊(Ethereum)并不是一个机构,而是一款能够在区块链上实现智能合约、开源的底层系统。以太坊是一个平台和一种编程语言 Solidity,使开发人员能够建立和发布下一代去中心化应用。 以太坊可以用来编程、分散、担保和交易任何事物:投票、域名、金融交易所、众筹、公司管理、合同和知识产权等等。

    34 引用 • 367 回帖 • 1 关注