背景
只有真正明白了java web 服务器运行机理 ,才能 对各种web服务器 的问题处理得心应手. python java 的web服务器工作原理是一样的.
关键三点:
-
web项目所需的对象:
1)servlet程序 ,被java编译后的可被jvm调用的 类 *.class
通常servlet filter listener 都是被编译成了.class 文件
注意:java 编译文件的输出目录是可以配置的(build path)2)web项目路径 包含了静态文件,和类文件
静态文件和目录:
包含 .css .html .js .txt文件 .xml.json.配置文件/上传下载文件和图片,.jsp文件等
注意:
静态资源文件无须java编译, 而交给web服务程序动态调用
jsp 文件要交给web程序编译成.class 后才能被javajvm调用类文件: 1) 是预先编译的servlet.class文件 ; 2) web服务器启动以后, 有web服务程序动态编译的 xxxx_jsp.class文件
3)web服务程序(tomcat netty jetty )
主要负责监听新连接,解析请求,路由到指定的处理程序文件或资源文件; -
web服务器工作机制
1)[必须]专有核心配置文件加载
设置web工程绝对路径
设置web工程的类文件绝对路径
(类文件:.class结尾的文件,以及后期动态编译jsp后生成的.class文件存放的目录)
设置web工程的虚拟目录2)[必须]开启网络监听程序
监听不同的ip地址和端口3)[可选]到指定目录加载web.xml
4)[可选]class反射加载,注解解析
加载 .class文件
解析注释,实例化后依次加载到内存池5)[可选]jsp文件加载动态编译
当客户端访问.jsp文件路径时,如果相关的_jsp.class文件不存在,就动态编译jsp文件生成.class文件6)[可选]访问静态文件
所有文件原则上都可以被直接访问,
但是 不同的子程序(handler) 会对不同的目录和后缀名文件进行处理
普通的资源,按照default程序,会被放过
一般只会对 .class jsp等后缀文件被解析和处理
但也有对静态文件进行保护的情况,就要单独写过滤程序注意:web服务程序是独立的程序 .可以加载servlet和 web目录
-
多线程 socket工作的意义
- 多线程监听 指定ip和端口,连接
- 解析请求数据
- 应答
- 断开连接
-
web程序编译执行过程的 虚拟路径、源文件绝对路径和编译路径
1)以jsp为例
虚拟路径: http://xxxx.xx.com:8080/jsp/kk.jsp
源文件绝对路径: d:/web/webapp/jsp/kk1.jsp
动态编译路径:d:/web/webapp/web-inf/classes/jsp/kk1_jsp.class
访问上述的虚拟路径实际指向编译路径2)不仅仅是jsp文件,java文件也是这样玩
虚拟路径: http://xxxx.xx.com:8080/jsp/kk
源文件绝对路径: e:/某某项目/src/main/java/org/control/kkcc.java
编译后放置路径: d:/web/webapp/web-inf/classes/cc/kkcc.class
上述两种情况都是: 虚拟路径 被web程序 路由到了编译路径
,访问的不是绝对路径的文件 而是编译路径的文件.3)还有资源文件也可以这样玩
虚拟路径: http://xxxx.xx.com:8080/jsp/pp.css?tm=219850320030
源文件绝对路径: d:/web/webapp/jsp/pp.css
编译路径: 无这里不访问编译路径了
但是可以通过程序在访问前进行拦截, 允许或禁止访问,或者跳转到登录页面.
所以在浏览器访问的虚拟路径,实际被web程序路由到了各个地方进行处理.
如何看懂jetty
- 关键字 : servletContext 加载web服务程序核心配置有关
- 关键字 : handler 监听后的处理子程序后缀
- 关键字: ClassLoader|Resource| path 与路径设置有关
- 关键字: xml 与配置有关
- 关键字: Scanner 与注解有关
- 关键字: connector 与socket网络服务有关
- 关键字: jsp|Servlet 与servlet 有关
- 关键字: InitParameter 与servlet参数有关
总结
通过netty 明白了 网络监听程序和 连通后的分布处理程序 handler
一般 分布处理子程序,在主程序预先配置好,
等待连接成功后,分别调用.
通过tomcat 认识到了servlet 的生命周期, jsp工作原理和生命周期
通过jetty 认识到 分布程序如何调用 jsp解析程序 和servlet组件