Java Web 01
一、Web概念
web(World Wide Web)即全球广域网,也称为万维网,它是一种基于超文本和HTTP的、全球性的、动态交互的、跨平台的分布式图形信息系统。是建立在Internet上的一种网络服务,为浏览者在Internet上查找和浏览信息提供了图形化的、易于访问的直观界面,其中的文档及超级链接将Internet上的信息节点组织成一个互为关联的网状结构。
web应用程序:可以提供浏览器访问的程序。
URI、URL、URN
URI
:Uniform Resource Identifier,统一资源标志符 (相当于一个人身份)URL
:Uniform Resource Location,统一资源定位符 (要通过具体地址去找到这个身份的人)URN
: Uniform Resource Name,统一资源名称 (相当于这身份的人的名字)
举例说明:
URI:北京xxx公司的总经理
URN:北京xxx公司的总经理张三
URL:中国北京市海淀区长安街35号北京xxx公司的总经理张三
Web应用程序组成部分
- html/css/js
- jsp、servlet
- java程序
- jar包
- 配置文件 (properties、yaml)
Http / Https 区别
- HTTPS协议需要到CA申请证书,一般免费证书很少,需要交费。
- HTTP协议运行在TCP之上,所有传输的内容都是明文。HTTPS运行在SSL/TLS之上,SSL/TLS运行在TCP之上,所有传输的内容都经过加密的。
- HTTP和HTTPS使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
- HTTPS可以有效的防止运营商劫持,解决了防劫持的一个大问题。
二、Web服务器
服务器是一个被动的操作,用于处理客户的一些请求和给客户一些响应信息。
1、3个常见技术 ASP、PHP、JSP
ASP:
- 微软公司的,使用的是C#,国内最早流行
- 在HTML中嵌入了VB的脚本,ASP + COM
- 使用ASP开发,因在一个页面中基本上都是大量业务代码,造成页面混乱,后期难以维护,维护成本高
- 用的服务器是微软自带的服务器
IIS(Internet Information Services服务器)
在控制面版,程序于卸载,启用或关闭Windows功能可以开启或关闭
PHP:
- PHP开发动态页面,开发速度块,功能强大,简单
- 无法承载大访问量的情况,具有局限性
JSP/Servlet:
- sun公司(现已被Oracle公司收购)主推的B/S框架
- 基于Java语言,可承载三高(高并发,高性能,高可用)问题带来的影响
- 语言类似ASP,易于ASP程序员迁移到 JSP 开发
2、IIS、Tomcat
IIS(Internet Information Services服务器)微软的服务器,是处理Windows自带的服务请求。
Tomcat服务器,Tomcat 技术先进、性能稳定,而且免费,因而深受Java 爱好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的Web 应用服务器。Tomcat和IIS等Web服务器一样,具有处理HTML页面的功能,另外它还是一个Servlet和JSP容器,独立的Servlet容器是Tomcat的默认模式。
三、Tomcat 详解 (重要)
Tip:工作3~5年可以尝试写Tomcat服务器。
1、Tomcat目录介绍
2、conf 配置目录
1)server.xml 核心配置文件
配置文件中有默认的3个端口号
- 8005:监听关闭服务器的端口号
- 8080:负责建立HTTP连接。在通过浏览器访问Tomcat服务器的Web应用时,使用的就是这个连接器
- 8009:负责和其他的HTTP服务器建立连接,在把Tomcat与其他HTTP服务器集成时,就需要用到这个连接器
配置内容:
-
可配置端口号;
-
可配置存放项目的文件地址,默认wbapps;
-
可配置host,访问地址,默认localhost(127.0.0.1);
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true">
2)webapps 目录结构
将项目放如该文件目录下,开启服务器,就可以访问了。
如访问docs:localhost:8080/docs
意思是访问docs目录,如果不指定访问目录,则会自动访问ROOT目录
网站应有的目录结构:
webapps:
- ROOT
- heroC (网站的目录)
- WEB-INF
- calsses (java程序)
- lib (web应用依赖的jar包)
- web.xml (网站配置文件)
- index.html (主页)
- static (静态文件)
- css
- js
- img
3、项目部署tomcat
4、IDEA使用Tomcat部署web项目的过程
在idea中配置的tomcat,在运行时idea不会把项目放到原本tomcat的webapps目录下该路径下,而是复制一份足够的配置文件,到 ${user.home}/.IntelliJIdea/system/tomcat
目录下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-X9bLU36y-1592127958843)(.pictureideaTomcat.png)]
也就是说每个项目都有属于自己的一份tomcat配置,互不干扰。
每个项目的配置文件夹中有一个 /conf/Catalina/localhost/ROOT.xml
文件,内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<Context path="" docBase="xxx" />
path是指在访问此项目时,是否需要添加额外的路径,如果为空,则直接使用域名或者ip就可以访问到该项目:127.0.0.1;
docBase是指要运行的项目的部署位置,xxx
就是我的项目源代码的位置。
整个项目启动过程就是:
首先maven build项目,将构建结果写到项目的outartifacts目录下,然后idea复制一份tomcat的配置文件到${user.home}/.IntelliJIdea/system/tomcat
中,之后启动tomcat安装目录下的catalina.bat
文件,tomcat读取idea复制的配置文件,找到项目位置,然后就运行起来了。
关于服务器面试题
1、在tomcat中能否将localhost
域名改成www.heroc.com
或其他域名?
如果直接修改Tomcat的conf/server.xml配置文件
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true">
将localhost改成
www.heroc.com
去启动tomcat服务器是不可以访问的,访问会失败。要去更改window的底层配置文件,将本地地址
127.0.0.1
别名修改成www.heroc.com
才可以通过该域名访问。具体操作如下:1、conf/server.xml配置文件 (此操作改不改都无所谓,只要系统配置文件,可将地址映射到定义的字符串上)
<Host name="www.heroc.com" appBase="webapps" unpackWARs="true" autoDeploy="true">
2、C:WindowsSystem32driversetchosts 添加以下一句话 (重点,不区分带小写)
127.0.0.1 www.heroc.com
然后启动Tomcat,就可以通过
http://www.heroc.com:8080/
来访问Tomcat服务器上webapps
目录下的网页了(注意清除缓存,再访问)
2、请谈谈网站是如何进行访问的。
当用户从浏览器中输入一个域名,并点击回车时
1,会先检查本机
C:WindowsSystem32driversetchosts
文件中查找是否有该域名的映射,有则解析本机地址,并返回该地址内相关的信息;2,如果本机hosts配置文件中,没有该域名的映射,那么会去DNS(域名服务系统)中查找是否有该域名,如果有该域名,则会找到该域名的服务地址,进行信息的返回或访问;
3,如果DNS中也没有则直接报错,无该网页
四、Http协议
HTTP (超文本传输协议) 是一个简单的请求-响应协议,通常用于TCP之上。端口号:80
- 文本:html,js,css…
- 超文本:图片,音频,视频…
HTTPS (超文本传输安全协议) 端口号 443
1、Http1.0 、Http1.1主要区别
1)长连接
Http1.0 默认不支持长连接的,每一次请求就会重新连接服务器。如果需要长连接,需要在http头加入"Connection: Keep-Alive"来建立长连接。
Http1.1 通过默认是长连接的。只需要请求一次,就可长时间与服务器建立连接,请求该服务器其他信息,也不会重新建立连接,除非手动断开了于服务器的连接。可通过"Connection: close"来关闭长连接。
HTTP是基于TCP/IP协议的,创建一个TCP连接是需要经过三次握手的,有一定的开销,如果每次通讯都要重新建立连接的话,对性能有影响。因此最好能维持一个长连接,可以用个长连接来发多个请求。
2)节约宽带
HTTP 1.1支持只发送header信息(不带任何body信息),如果服务器认为客户端有权限请求服务器,则返回100,否则返回401。客户端如果接受到100,才开始把请求body发送到服务器。这样当服务器返回401的时候,客户端就可以不用发送请求body了,节约了带宽。
另外HTTP1.1还支持传送内容的一部分。这样当客户端已经有一部分的资源后,只需要跟服务器请求另外的部分资源即可。这是支持文件断点续传的基础。
3)Host域
现在可以web server例如tomat,设置虚拟站点是非常常见的,也即是说,web server上的多个虚拟站点可以共享同一个ip和端口。
HTTP1.0是没有host域的,HTTP1.1才支持这个参数。
2、Http1.1、Http2.0 主要区别
1)多路复用
HTTP2.0使用了多路复用的技术,做到同一个连接并发处理多个请求,而且并发请求的数量比HTTP1.1大了好几个数量级。
当然HTTP1.1也可以多建立几个TCP连接,来支持处理更多并发的请求,但是创建TCP连接本身也是有开销的。TCP连接有一个预热和保护的过程,先检查数据是否传送成功,一旦成功过,则慢慢加大传输速度。因此对应瞬时并发的连接,服务器的响应就会变慢。所以最好能使用一个建立好的连接,并且这个连接可以支持瞬时并发的请求。
2)数据压缩
HTTP1.1不支持header数据的压缩,HTTP2.0使用HPACK算法对header的数据进行压缩,这样数据体积小了,在网络上传输就会更快。
3)服务器推送
当我们对支持HTTP2.0的web server请求数据的时候,服务器会顺便把一些客户端需要的资源一起推送到客户端,免得客户端再次创建连接发送请求到服务器端获取。这种方式非常合适加载静态资源。
服务器端推送的这些资源其实存在客户端的某处地方,客户端直接从本地加载这些资源就可以了,不用走网络,速度自然是快很多的。
3、http请求
请求行
Request URL: https://www.baidu.com/
Request Method: GET
Status Code: 200 OK
Remote Address: 39.156.66.18:443
Referrer Policy: no-referrer-when-downgrade
请求行中有请求连接,请求方式,请求状态码等信息
请求方式:GET, POST等
GET:请求能够携带的参数长度有限制,会在浏览器URL地址栏显示请求参数的内容,不安全,但高效
POST:请求能够携带的参数长度无限制,不会再浏览器URL地址栏显示请求参数的内容,安全,但相对于 GET不高效
请求头
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
Cache-Control: max-age=0
Connection: keep-alive
...
4、http响应
响应头
Bdpagetype: 1
Bdqid: 0xae4e331d00306773
Cache-Control: private
Connection: keep-alive
Content-Encoding: gzip
Content-Type: text/html;charset=utf-8
Date: Fri, 20 Mar 2020 05:19:50 GMT
Expires: Fri, 20 Mar 2020 05:19:22 GMT
Server: BWS/1.1
Set-Cookie: BDSVRTM=0; path=/
Set-Cookie: BD_HOME=1; path=/
Set-Cookie: H_PS_PSSID=30969_1428_21117_30823_30717; path=/; domain=.baidu.com
Strict-Transport-Security: max-age=172800
Traceid: 1584681590277118234612560032610433132403
Transfer-Encoding: chunked
X-Ua-Compatible: IE=Edge,chrome=1
响应状态码(重点)
1xx:信息,请求收到,继续处理;
2xx:成功;200
3xx:重定向;
4xx:客户端错误;404
5xx:服务端错误;500内部服务器错误,502网关错误
关于http协议问题
1,http1.0,http1.1的区别;http1.1,http2.0的区别
见第四大点的1,2小节
2,当在浏览器输入url地址回车之后,到页面加载完成,经历了什么?
五、Maven
1、配置环境变量
在环境变量中添加:
在Path中添加:
此时在,cmd中输入:mvn -version
有版本信息,环境变量就配置好了
2、setting.xml
- 设置下载的jar包,存储本地的位置:
<localRepository>E:RepMaven</localRepository>
- 设置镜像地址(由于maven是国外的,如果直接从maven官网去下载,下载速度极慢):
<mirrors>
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
</mirrors>
3、Idea设置maven
4、解决Maven导出资源配置问题 (重点)
标准的Maven项目都会有一个resources目录来存放我们所有的资源配置文件,但是我们往往在项目中不仅仅会把所有的资源配置文件都放在resources中,同时我们也有可能放在项目中的其他位置,那么默认的maven项目构建编译时就不会把我们其他目录下的资源配置文件导出到target目录中,就会导致我们的资源配置文件读取失败,从而导致我们的项目报错出现异常,比如说尤其我们在使用MyBatis框架时,往往Mapper.xml配置文件都会放在dao包中和dao接口类放在一起的,那么执行程序的时候,其中的xml配置文件就一定会读取失败,不会生成到maven的target目录中,所以我们要在项目的pom.xml文件中进行设置,并且我建议大家,每新建一个maven项目,就把该设置导入pom.xml文件中,以防不测!!!
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
</build>