浏览器-Tomcat服务器-请求与响应
浏览器访问服务器,本质就是请求资源。
比如请求静态资源:index.html,我们在浏览器地址栏输入:www.a.com/index.html,浏览器为了支持HTTP协议,发送的数据必须符合HTTP协议数据的格式,也就是这样:
这些信息就成了请求信息,浏览器利用Socket,通过网络IO流发往服务器。如果做个比喻的话,浏览器比作男生,服务器比作女生,我想表达的意思是,浏览器是主动链接,并且主动请求数据,也就是想要的资源,而服务器存在资源,她只会等待浏览器主动请求她,她才会做出响应。
此时服务器必须已经开启,因为她要监听某一个端口才能知道有人给她发信息了,这里比如是 80 端口。服务器监听80端口,有点类似于事件驱动编程的感觉,服务器利用ServerSocket,得到请求信息。服务器解析请求信息,得到需要请求的资源。这里先简单一分为二:
1 请求静态资源:
服务器将会去服务器实现定义好的工作目录下,也是我们网站发布打包后的文件存放的地方,寻找a.html文件,若找到使用IO流,将文件加载到内存中,设置状态码为200,再输出到网络IO流,发送给浏览器,浏览器接收到响应信息,截取响应体,使用渲染引擎(所谓的内核)进行渲染。若找不到文件,则服务器设置响应头为404,我们可以自定义一句话来说明原因,大多数服务器返回404 File Not Found。这就是我们加载静态文件的流程。
2 请求动态资源servlet:
先说说动态语言,即运行时才能得知变量的类型。而动态资源,就是未执行的.class文件,得到浏览器的请求信息,服务器执行一系列的事先定义好的.class文件,得到一个动态的结果返回给浏览器。
做个比喻,好比静态资源就是你要买一辆普通的车,你就直接到车店,发送请求给车店,车店得到请求,解析它,知道你要买哪辆,然后返回给你汽车(有些痴人说梦哈)。动态资源呢,就是,你要私人定制一个豪华车,然后你就去汽车厂,发送请求给汽车厂,汽车厂得到请求之后,解析它,获得一些有用信息:车大小,里面配置,外表装饰等等,请注意,这里没有现成的车直接返回,而是得通过一系列的生产车间动态生成,等到生产完成,返回定制汽车,连接关闭。
比喻打完,开始说正常流程。服务器得到浏览器发来的请求信息之后,解析它,得到了要执行的类名。这里就用到了【反射】,个人感觉反射技术很伟大,虽然确实降低性能,但是降低了类与类之间的耦合,就好比动态资源,我不清楚如果没有反射,我们将如何获得动态资源。得到想要的类名,利用反射,得到该类的对象,执行想要的方法,然后返回结果。
3 Servlet继承体系

4 Servlet生命周期
生命周期方法:
init():当它第一次被创建的时候,执行该方法(只执行一次).
service():对客户端响应方法。
destroy():当它被销毁时,执行该方法。
一个Servlet服务对应的只有一个Servlet对象,达到了“一个对象,多处服务”的效果,节约内存。用白话来解释就是,我们所有人访问的这个Servlet服务,使用的都是同一个Servlet对象。接下来给出Servlet对象从出生到死亡的步骤:
1 实例化对象(使用构造方法)
2 初始化(使用init()函数)
3 服务(使用service()函数)
4 销毁(调用destroy()函数)
网站的过程是第一个人访问,然后很多人访问,最后服务器关闭。
| 第一个人访问网站 | 更多人访问网站 | 服务器关闭 | |
| 调用的方法 | 调用上述1,2,3方法 | 调用上述3方法 | 调用上述4方法 |
Servlet路径
长路径优先,这里指,<url-pattern>内容</url-pattern>
绝对路径精确匹配,优先级高。例:/A/B
路径匹配,通配符匹配 例:/*
扩展名匹配,优先级最低 例:*.html
注意:匹配不能混用。
多线程问题:因为我们操作的是同一个Servlet对象。
如果定义全局变量,可能会出现线程安全问题。
ServletConfig:只属于这个Servlet的私有配置信息
Servlet通过ServletConfig获取配置信息,如下:
<servlet>
<servlet-name>名字</servlet-name>
<servlet-class>类的完全限定名</servlet-class>
<init-param>
<param-name>fruit</param-name>
<param-value>apple</param-value>
</init-param>
</servlet>
这里我们通过ServletConfig来获得里面的配置信息,注意,这里的配置信息是私有的,只属于这个Servlet对象。
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out=response.getWriter();
out.println("fruit:"+getInitParameter("fruit"));
out.flush();
out.close();
}
ServletContext:属于这个Web应用程序的所有Servlet对象的共有配置信息
一个ServletContext对应一个应用。
一个ServletConfig对应一个Servlet。
目的:
1 实现数据的共享。比如登陆时的名字,用户的权限,和Session很类似。
在一个Servlet类中,添加了一个全局数据,getServletContext().setAttribute("role", "manager");
在另一个Servlet类中,就能得到此数据,getServletContext().getAttribute("role");
2016-09-08 15:56:22 ???这里的疑问,难道ServletContext底层和Session有关???抛出疑问。。。
2 共享web.xml信息。(必须是全局配置信息)
配置全局<context-param></context-param>
<context-param>
<param-name>名字</param-name>
<param-value>值</param-value>
</context-param>
3 获取应用下任意资源的绝对路径(硬盘。。)
getServletContext().getRealPath("路径");
注:此文章针对Java应用服务器Tomcat,至于其它服务器的请求和响应原理,我没做考证,所以我没将猜测说出来。
浏览器-Tomcat服务器-请求与响应的更多相关文章
- HTTP基础(一):如何使用浏览器network查看请求和响应的信息
一. 问题描述 HTTP作为前端开发与后开发链接的载体,其重要性不言而喻,今天我不复习关于HTTP自身的一些知识,只复习如何解读浏览器自带的的抓包工具(查看请求信息与响应信息)network. 二. ...
- 【JAVA网络流之浏览器与服务器模拟】
一.模拟服务器获取浏览器请求http信息 代码: package p06.TCPTransferImitateServer.p01.ImitateServer; import java.io.IOEx ...
- HTTP协议简介详解 HTTP协议发展 原理 请求方法 响应状态码 请求头 请求首部 java模拟浏览器客户端服务端
协议简介 协议,自然语言里面就是契约,也是双方或者多方经过协商达成的一致意见; 契约也即类似于合同,自然有甲方123...,乙方123...,哪些能做,哪些不能做; 通信协议,也即是双方通过网络通信必 ...
- 浏览器和服务器 对http请求(post get) url长度限制
1. GET URL长度限制 在Http1.1协议中并没有提出针对URL的长度进行限制,RFC协议里面是这样描述的,HTTP协议并不对URI的长度做任何的限制,服务器端 必须能够处理任何它们所提供服 ...
- 浏览器和服务器 对post get请求 url长度限制
1. URL长度限制 2. Post数据的长度限制 3. Cookie的长度限制 1. GET URL长度限制 在Http1.1协议中并没有提出针对URL的长度进行限制,RFC协议里面是这样描述的, ...
- 关于Tomcat服务器中的协议及请求过程
关于Tomcat服务器中采用的协议:在Tomcat的server.xml文件中可以找到如下几个Connector <!-- 1. HTTP --> <Connector port=& ...
- Web容器(tomcat服务器)处理JSP文件请求的三个阶段
Web容器(tomcat服务器)处理JSP文件请求的三个阶段 翻译:编写好的jsp文件被web容器中的jsp引擎转换成java源码. 编译:翻译成java源码的jsp文件会被编译成可被计算机执行的字节 ...
- Java开发微信公众号(三)---微信服务器请求消息,响应消息,事件消息以及工具处理类的封装
在前面几篇文章我们讲了微信公众号环境的配置 和微信公众号服务的接入,接下来我们来说一下微信服务器请求消息,响应消息以及事件消息的相关内容,首先我们来分析一下消息类型和返回xml格式及实体类的封装. ( ...
- HTTP要点概述:三,客户端和服务器,请求和响应
一,客户端和服务器: HTTP协议主要用于客户端和服务器之间的通信. 1,客户端(client):请求访问资源的一端.(知道为啥用C表示客户端了吧) 2,服务器(server):提供资源响应的一端. ...
随机推荐
- iOS开发——高级技术精选&底层开发之越狱开发第二篇
底层开发之越狱开发第二篇 今天项目中要用到检查iPhone是否越狱的方法. Umeng统计的Mobclick.h里面已经包含了越狱检测的代码,可以直接使用 /*方法名: * isJailbroken ...
- 让Extjs EditorGridPanel 编辑时支持方向键
在用 extjs editorgridpanel 进行输入编辑的时候, 默认情况下只支持使用 tab 键可以实现焦点切换, 如果想让editorgridpanel 在编辑时通过方向键来实现焦点跳转切换 ...
- Gamma校正与线性工作流
1 Gamma校正是什么?8位亮度值x(0-1)经过x^0.45的一个提亮过程. 2 为什么需要Gamma校正 人的眼睛是以非线性方式感知亮度,在自然界中,人感觉到的一半亮度其实只有全部能量的0.2, ...
- 正向代理VS反向代理 总结
1.访问方向 正向代理:通常是从内部访问外部的网站或服务器,但又无法直接访问到外部的网站,而这个代理是可以访问到外部网站的.如果在中国境内通过代理访问Facebook.Twitter等网站 反向代理: ...
- [转]Android dex分包方案
转载自:https://m.oschina.net/blog/308583 当一个app的功能越来越复杂,代码量越来越多,也许有一天便会突然遇到下列现象: 1. 生成的apk在2.3以前的机器无法安装 ...
- Android样式的开发:layer-list篇
上图Tab的背景效果,和带阴影的圆角矩形,是怎么实现的呢?大部分的人会让美工切图,用点九图做背景.但是,如果只提供一张图,会怎么样呢?比如,中间的Tab背景红色底线的像素高度为4px,那么,在mdpi ...
- 【转】ORATOP工具使用说明
文章转自:http://lintzyuan.blogspot.jp/2014/07/oratop.html ORATOP 前言:隨著PC Server的規格及速度愈來愈快,大多數的公司摒棄大型主機 ...
- vs2010 C#链接 ACCESS数据库
ACCESS数据库,有2003.2007版本,不同的版本,链接字符也不同,现把代码黏贴如下: 1.ACCESS2003(.mdb): private void Form1_Load(object se ...
- MMM和MHA的对比和应用(PPT分享)
分享主题:MySQL高可用架构 --- MMM&MHA在大众点评应用和改进 内容简介:本次演讲,主要讲述以下几个方面 1. MMM在点评网是如何使用的 2. 细数MMM上踩过的坑以及如何填坑 ...
- 斐波那契堆(三)之 Java的实现
概要 前面分别通过C和C++实现了斐波那契堆,本章给出斐波那契堆的Java版本.还是那句老话,三种实现的原理一样,择其一了解即可. 目录1. 斐波那契堆的介绍2. 斐波那契堆的基本操作3. 斐波那契堆 ...