B/S架构是Brower/Server的缩写,即浏览器/服务器结构。在这种结构中,客户端不需要开发任何用户界面,而是通过浏览器(如IE,Firefox,Chrome,Safari等等)向服务器发送请求,由服务器进行处理后将响应结果返回浏览器,最后浏览器将结果内容展示出来。我们写的JavaWeb程序是在服务器端运行的。
Web应用程序分为两种,一个是静态站点,一个是动态站点。早期的Web应用程序都是静态站点。这些站点使用HTML语言来编写。这种方式下,用户访问的资源是固定不变的。动态站点则是可以根据用户的请求动态生成页面的信息。这种动态站点通常使用HTML语言和动态脚本语言(JSP,ASP,PHP等等)来编写。请注意,客户端浏览器只能识别HTML语言,因此动态脚本语言都是运行在服务器端的,这些动态语言可以控制输出HTML内容。HTML是标签语言,主要用来展示文本,图片等信息,不像我们学习的Java语言那样具有强大的逻辑处理能力。在我们日常开发中,HTML语言通常称之为前端技术,而Java语言称之为后端技术。HTML语言主要展示网页页面,而Java语言主要处理用户提交的数据,它经常和数据库打交道。
B/S架构的核心就是HTTP协议。HTTP 协议一般指的是超文本传输协议,它是基于 TCP/IP 通信协议来传递数据的。也就是浏览器与服务器之间的数据通信。HTTP协议默认端口号为80,HTTPS协议默认端口是443。两者协议的区别在于HTTPS是采用加密方式来传输通信数据的。
客户端浏览器与服务器之间的HTTP连接是一种一次性连接,它限制每次连接只处理一个请求,当服务器返回本次请求的响应后便立即关闭连接,下次请求再重新建立连接。这种一次性连接主要考虑到服务器面向的是网络中成千上万个用户,因此服务器不会让一个连接长时间占有服务器的资源,及时地释放连接可以大大提高服务器的执行效率。服务器端能同时处理大量的请求连接,称之为高并发处理,它是服务器的最重要的性能指标之一。
HTTP是一种无状态协议,即服务器不保留与客户交互时的任何状态信息。这就大大减轻了服务器记忆负担,从而保持较快的响应速度。如何让服务器能够识别不同的客户端,就需要使用Cookie和Session技术来解决。它的原理就是第一次访问服务器的时候,返回客户端一个唯一的字符串标示sessionid,并要求客户端再随后的访问中始终携带这个唯一标示。请注意,这个唯一标示是有时间限制的,它并不是始终有效。如果失效后再次访问,标示会改变。Session是服务器端的存储,Cookie则是客户端浏览器的存储。字符串标示sessionid就像一把钥匙,所有用户的数据被锁在Session里面,客户端浏览器凭借本地存储的钥匙就能被服务器端正确识别,服务器端可以根据这把钥匙,找到属于该客户端的session存储空间,里面存储了只属于该客户端自己的信息。举个例子,我们使用自己的账号登录服务器的时候,服务器上面的页面能够正确显示我们每一个人的信息,就是使用了session技术。
要理解HTTP协议就必须简单了解一下 HTTP Header头信息,它分为请求头和响应头。
以下是请求头 Request Headers 的信息:
请求头中的内容很多,例如下
Accept 表示客户端的文档类型
Accept-Encoding 表示客户端的压缩编码
Accept-Language 表示客户端的语言
Cache-Control 表示客户端的缓存设置
Connection 表示当前连接是否保持
Cookie 表示客户端的Cookie存储信息
Host 表示请求服务器主机
User-Agent 表示客户端信息:操作系统,浏览器等等
......
以下是响应头 Response Headers 的信息:
Server 表示服务器端的WebServer(例如:Tomcat)
Context-Type 表示服务器端返回的文档类型(例如:text/html)
Context-Encoding 表示服务器端返回的内容是否压缩编码
Context-Language 表示服务器端返回的内容的语言
Context-Length 表示服务器端返回的内容的长度(字节)
Keep-Alive 表示服务器端连接时间
......
当浏览器访问服务器时候,浏览器接收一个HTTP 状态码( Status Code)
常见的 HTTP 状态码
200 客户端请求成功
302 页面跳转
400 客户端错误
403 服务器端拒绝服务
404 请求服务器端资源不存在
500 服务器端发生的错误
这里介绍一下浏览器缓存机制。浏览器会对服务器静态资源(html, css, img, js等等)进行本地缓存,这样是为了减少对重复服务器资源的请求,也就是减少服务器端的请求压力。但是,如果服务器端更新之后,可能会造成与本地浏览器不一致的情况发生,解决缓存的办法就是按 Ctrl + F5 强制刷新浏览器。当我们使用 Ctrl + F5 重新请求服务器资源的时候,会在请求头中增加一些信息,告诉服务器我们要获取最新的数据而不是缓存。这些信息如下:Cache-Control:no-cache 。另外,服务器端也可以设置资源的有效时间来解决两端数据不一致的问题,通过 Expires 字段来实现,它的值是一个时间,超过这个时间后,缓存的内容将失效,需要重新向服务器发起请求。这种方式会有一个时间差的问题,能不能在服务器端更新内容之后马上通知客户端浏览器更新呢?答案是不能。因为B/S架构的本质是客户端主动请求服务器,这种请求连接不会持久性的保存,因此服务器没有办法通过这个连接主动通知客户端更新本地数据。有一种解决方式,就是客户端按照固定时间(例如5秒钟)轮询请求服务器,来模拟持久性的连接,这样服务器就会在“最短时间”内及时通知客户端更新数据。但是,这样做无形之中会增加服务器端的访问压力。 从HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议WebSocket 。WebSocket 使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在 WebSocket API 中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。
接下来,我们介绍Java Web运行环境。我们之前写的 Java 程序直接运行在本地的 JVM 上,那么Web程序也是运行在JVM上面吗?在解释这个问题之前,我们还需要再回到 B/S 架构中的两个角色,一个是客户端浏览器,一个是服务器端。实际的客户端浏览器应该是很多个,而服务器端只有一个,属于一对多的关系。客户端浏览器运行的是HTML内容,该内容里面可以包含文字,图片,视频等等。这些内容是由服务器端Web程序发送给客户端浏览器的,这个过程首先是由客户端浏览器发起请求,服务器端接受对应的请求后就会发送相应的HTML内容,这个过程的数据传输就是通过HTTP协议来完成的。如何处理请求并返回HTML内容是我们开发人员要做的事情,不同的请求通过不同的URL来区别。
请求URL就是一个字符串网址,例如 “http://www.xxx.com/” 就是一个请求URL,"http://www.xxx/com/login" 则是另一个请求。大家可能注意到了,这个请求URL其实就是由服务器的域名+不同的路径参数组成的。域名就不用解释了,它代表了服务器的IP地址,而后面的路径参数则是有特殊意义的,它代表了我们要访问不同的服务器端业务资源。当然,这个请求URL中还可以附带一些用户数据等等。
客户端浏览器与服务器端数据通信涉及到两个问题?第一,谁来接受请求并返回响应(实现HTTP协议)?第二,我们使用Java代码如何来获取请求数据并返回HTML内容?很显然,JVM不能解决我们这两个问题,所以我们需要借助其他软件来实现。现在很多服务器端都会使用Apache或者Nginx来提供Web服务,它们都可以实现HTTP协议。但是,这两款软件本身只能处理静态HTML内容,不能运行Java Web程序。如果想要运行Java Web程序的话,我们需要使用 Tomcat 这款软件。注意,我们除了在服务器端安装 Tomcat 之外,仍然需要安装 JDK,因为Tomcat仍然是将运行java程序的工作交给JVM来执行的。好的,第一个问题解决了,需要使用 Tomcat 来实现。第二个问题,我们如何使用Java代码来获取请求数据并返回HTML内容,我们之前的Java基础课程中并没有介绍相关的API。那是因为,标准JDK中没有提供Web方面的API。在已安装的Tomcat中提供了 ”servlet-api.jar 和 jsp-api.jar“ 两个库文件,它可以帮助我们来处理请求和返回响应。由此可见,我们上面遇到的两个问题都可以由Tomcat来帮我们解决。因此,我们要想开发JavaWeb程序的话,就需要安装 JDK 和 Tomcat。如何安装JDK和Tomcat请参考第15章 Tomcat安装。
Tomcat是由Apache软件基金会下属的一个开源项目,它不仅仅是一个HTTP服务器,还是一个Servlet服务器(通常称之为Servlet容器)。安装完毕后,我们可以通过浏览器访问:http://localhost:8080/ 来查看Tomcat给我们准备的一个默认的JavaWeb项目,该项目位于“webapps\ROOT”下。
在这个目录下存放了我们之前放置的几个“jsp”文件,还有其他一些图片之类的文件。普通的java程序是执行包含main方法的编译后的class文件,而这里的jsp文件并不是class文件,但是它却可以在tomcat下运行。Jsp文件可以理解成java代码和html标签混合的网页文件,它由tomcat解析并运行。由于javaweb程序是根据请求来触发服务器端的java代码(比如jsp文件),因此它不必包含main方法。我们注意到有一个“WEB-INF”,
这个是javaweb项目特有的目录,里面存着一个“web.xml”文件,内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1"
metadata-complete="true">
<display-name>Welcome to Tomcat</display-name>
<description>Welcome to Tomcat</description>
</web-app>
这是一个xml配置文件,根节点为<web-app>代表当前的web应用,子节点<display-name>代表当前项目名称,而<description>节点代表当前项目描述。这个文件非常重要。当我们访问“http://127.0.0.1:8080/”的时候,实际上访问的是“http://127.0.0.1:8080/index.jsp”,也就是“index.jsp”文件,本身“index”就是索引,目录的含义,也就是默认首页。如果我们打开这个“index.jsp”文件的话,就能看到里面包含了html标签和java代码。
标签:01,浏览器,JavaWeb,Tomcat,服务器端,基础,请求,服务器,客户端 From: https://blog.csdn.net/richieandndsc/article/details/137245186