从 Latke 开始学习 Java web 开发

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

作为一个 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 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3201 引用 • 8216 回帖 • 1 关注
  • Latke

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

    71 引用 • 535 回帖 • 832 关注

相关帖子

欢迎来到这里!

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

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

推荐标签 标签

  • Vditor

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

    369 引用 • 1846 回帖 • 4 关注
  • 七牛云

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

    28 引用 • 226 回帖 • 128 关注
  • 叶归
    8 引用 • 36 回帖 • 17 关注
  • Vim

    Vim 是类 UNIX 系统文本编辑器 Vi 的加强版本,加入了更多特性来帮助编辑源代码。Vim 的部分增强功能包括文件比较(vimdiff)、语法高亮、全面的帮助系统、本地脚本(Vimscript)和便于选择的可视化模式。

    29 引用 • 66 回帖 • 1 关注
  • PostgreSQL

    PostgreSQL 是一款功能强大的企业级数据库系统,在 BSD 开源许可证下发布。

    22 引用 • 22 回帖 • 3 关注
  • 资讯

    资讯是用户因为及时地获得它并利用它而能够在相对短的时间内给自己带来价值的信息,资讯有时效性和地域性。

    56 引用 • 85 回帖
  • Hibernate

    Hibernate 是一个开放源代码的对象关系映射框架,它对 JDBC 进行了非常轻量级的对象封装,使得 Java 程序员可以随心所欲的使用对象编程思维来操纵数据库。

    39 引用 • 103 回帖 • 725 关注
  • ZeroNet

    ZeroNet 是一个基于比特币加密技术和 BT 网络技术的去中心化的、开放开源的网络和交流系统。

    1 引用 • 21 回帖 • 647 关注
  • SMTP

    SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。SMTP 协议属于 TCP/IP 协议簇,它帮助每台计算机在发送或中转信件时找到下一个目的地。

    4 引用 • 18 回帖 • 636 关注
  • WebComponents

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

    1 引用 • 8 关注
  • WebClipper

    Web Clipper 是一款浏览器剪藏扩展,它可以帮助你把网页内容剪藏到本地。

    3 引用 • 9 回帖
  • Windows

    Microsoft Windows 是美国微软公司研发的一套操作系统,它问世于 1985 年,起初仅仅是 Microsoft-DOS 模拟环境,后续的系统版本由于微软不断的更新升级,不但易用,也慢慢的成为家家户户人们最喜爱的操作系统。

    227 引用 • 476 回帖
  • JavaScript

    JavaScript 一种动态类型、弱类型、基于原型的直译式脚本语言,内置支持类型。它的解释器被称为 JavaScript 引擎,为浏览器的一部分,广泛用于客户端的脚本语言,最早是在 HTML 网页上使用,用来给 HTML 网页增加动态功能。

    730 引用 • 1280 回帖
  • API

    应用程序编程接口(Application Programming Interface)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。

    79 引用 • 431 回帖
  • DevOps

    DevOps(Development 和 Operations 的组合词)是一组过程、方法与系统的统称,用于促进开发(应用程序/软件工程)、技术运营和质量保障(QA)部门之间的沟通、协作与整合。

    58 引用 • 25 回帖 • 3 关注
  • 房星科技

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

    6 引用 • 141 回帖 • 590 关注
  • Swagger

    Swagger 是一款非常流行的 API 开发工具,它遵循 OpenAPI Specification(这是一种通用的、和编程语言无关的 API 描述规范)。Swagger 贯穿整个 API 生命周期,如 API 的设计、编写文档、测试和部署。

    26 引用 • 35 回帖
  • 反馈

    Communication channel for makers and users.

    121 引用 • 907 回帖 • 274 关注
  • 单点登录

    单点登录(Single Sign On)是目前比较流行的企业业务整合的解决方案之一。SSO 的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。

    9 引用 • 25 回帖
  • 以太坊

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

    34 引用 • 367 回帖 • 1 关注
  • Netty

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

    49 引用 • 33 回帖 • 35 关注
  • OAuth

    OAuth 协议为用户资源的授权提供了一个安全的、开放而又简易的标准。与以往的授权方式不同之处是 oAuth 的授权不会使第三方触及到用户的帐号信息(如用户名与密码),即第三方无需使用用户的用户名与密码就可以申请获得该用户资源的授权,因此 oAuth 是安全的。oAuth 是 Open Authorization 的简写。

    36 引用 • 103 回帖 • 30 关注
  • JVM

    JVM(Java Virtual Machine)Java 虚拟机是一个微型操作系统,有自己的硬件构架体系,还有相应的指令系统。能够识别 Java 独特的 .class 文件(字节码),能够将这些文件中的信息读取出来,使得 Java 程序只需要生成 Java 虚拟机上的字节码后就能在不同操作系统平台上进行运行。

    180 引用 • 120 回帖 • 2 关注
  • 博客

    记录并分享人生的经历。

    273 引用 • 2388 回帖 • 1 关注
  • TextBundle

    TextBundle 文件格式旨在应用程序之间交换 Markdown 或 Fountain 之类的纯文本文件时,提供更无缝的用户体验。

    1 引用 • 2 回帖 • 81 关注
  • 机器学习

    机器学习(Machine Learning)是一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、算法复杂度理论等多门学科。专门研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构使之不断改善自身的性能。

    83 引用 • 37 回帖
  • 思源笔记

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

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

    25453 引用 • 105285 回帖