Java Web
Web相关概念回顾
- 1.软件架构:
- C/S:客户端/服务器端
- B/S:浏览器/服务器
- 2.资源分类:
- 静态资源:所有用户访问后,得到的结果都是一样的,称为静态资源,静态资源可以直接被浏览器解析,如:html、css、JavaScript
- 动态资源:每个用户访问相同的资源时,得到的结果可能是不一样的。称为动态资源,需要先转换为静态资源,再返回浏览器,如:servlet、jsp、php、asp
- 3.网络通信三要素:
- IP:计算在网络中的唯一标识
- 端口port:应用程序在计算机中的唯一标识。0~65536
- 传输协议:规定了数据传输的规则
- TCP:安全协议,三次握手、速度稍慢
- UDP:不安全协议。速度快
Web服务器软件
-
服务器:安装了服务器软件的计算机(比如:安装了mysql服务器)
-
服务器软件:接收用户的请求,处理请求,做出响应
-
web服务器软件:接收用户的请求,处理请求,做出响应
- 在web服务器软件中,可以部署web项目,让用户通过浏览器来访问这些项目
- 动态资源不能直接运行,要靠这些web服务器,也叫web容器
-
常见的java相关的web服务器软件:
- webLogic:Oracle公司,大型的JavaEE服务器,支持所有的JavaEE1规范,收费的
- webSphere:IBM公司,大型的JavaEE服务器,支持所有的JavaEE规范,收费的
- JBOSS:JBOSS公司,大型的JavaEE服务器,支持所有的JavaEE规范,收费的
- Tomcat:Apache基金组织,中小型JavaEE服务器,仅仅支持少量的JavaEE规范servlet/jsp。开源免费
Tomcat
下载
安装
启动时经常遇到的问题
关闭
部署
1.直接放在webapps文件里
- /hello:项目的访问路径–>虚拟目录
(hello文件就是项目访问路径的虚拟目录,hello.html就是资源路径)
- war包:打成war包,再将war包放置到webapps目录下
2.配置 conf/server.xml(修改后要重新启动Tomcat服务器才能生效)
将hello项目放在D盘下
docBase:项目存放的路径
path:虚拟目录
注意访问时的路径就是path配置的**/hehe**
缺点:但是不安全
3.热部署:在conf\Catalina\localhost配置xml
创建任意名称的xml文件,在文件中编写
<Context docBase="D:\hello">
虚拟路径就为你取的任意名称
热部署:指的是直接将xml文件重命名后缀**.bak**(临时文件的意思,也就是读取不到这个文件),不用重新启动tomcat服务器,就能生效
静态项目和动态项目的目录结构的区别
Java动态项目的目录结构
WEB-INF目录:
Tomcat集成IDEA
新建web项目
查看tomcat配置
因为选了JavaEE所以自动部署了该项目
果然报了8080端口被占用,我们就来暴力解决了
DOS查看占有端口号的进程PID
netstat -aon
记住端口号,去任务管理器查看被哪个进程占用,其实是Tomcat开始默认启动哈哈
stop后再启动就成功啦!!
因为选的是/,所以这里访问时直接localhost不用加**
tomcat7和tomcat8
tomcat7:在get请求时控制台会出现乱码
在tomcat8是已解决了get请求乱码的这个问题,但是tomcat8会出现控制台日志中文乱码
所以在这里把java.util.logging.ConsoleHandler.encoding = UTF-8注释掉就可以解决
Tomcat处理请求过程
过程解析:
一个用户请求过来,如果是windows操作系统,它首先进入一个队列,我们的selector会监听底层的事件通知,这个队列就是accept queue,代表TCP的3次握手成功后就会进入到我们的accept queue队列,selector就会收到通知;红线那一部分开始就是Tomcat的处理范畴。
- Tomcat通过Endpoint组件接收socket连接,接收到一个socket连接后,执行以下步骤:
- 第一次从socket中获取数据到InputBuffer中,BIO对应的是InternalInputBuffer,父类是AbstractInputBuffer
- 然后基于InputBuffer进行解析数据
- 先解析请求行,把请求方法,请求uri,请求协议等封装到org.apache.coyote.Request对象中
- org.apache.coyote.Request中的属性都是MessageBytes类型,直接可以理解为字节类型,因为从socket获取的数据都是字节,在解析过程中不用直接把字节转成字符串,而且MessageBytes虽然表示字节,但是它并不会真正地存储字节,还是使用ByteChunk基于InputBuffer中的字节数组来进行标记,标记字节数组中的哪个。。。
JavaEE:Java语言在企业级开发中使用的技术规范的总和,一共规定了13项大规范 ↩︎