如何直接请求服务器资源
A. 服务器如何处理http请求
1.需求
了解服务端如何处理http请求,了解基本的处理流程
2.实战
处理http请求分为7个步骤
2.1 Tcp连接
建立一条tcp链接,(若之前不存在持久链接keep-alive),把客户端的ip和port,服务端的ip和port数据放到web服务器连接表中。服务器随时监听链接表中的链接,看有没有数据变化
2.2 接收http请求
一旦我们发送http请求了,这条tcp链接就开始工作了。因为web服务器链接表中有许多链接需要被处理,处理的方式有单线程,多线程这些(这些涉及操作系统的知识)。
2.3 处理http请求
处理的过程大致是把请求的信息解析出来,如下图
2.5 构建响应
要是找到资源,则构建响应信息,包括响应的对象类型,长度,状态码。
另一个情况是重定向响应,就是直接返回一个重定向,客户端看到之后,立刻再向重定向的地址发起请求。重定向的响应的状态码一般是3xx。
2.6 发送响应
把构建的响应发送给客户端
2.7 记录日志
服务端对这个请求响应过程进行记录。(另外专门再讲)
3.总结
以上是服务端处理http请求的大致过程。能让大家有个大致轮廓,当然里面有很多细节的知识没讲到,要另外查询资料并学习
B. 手机客户端如何跨域请求服务器的资源(要求能post请求的)
浏览器内置的安全沙箱,决定了没有任何直接的方式,不过可以巧用其他方法解决,比如FLASH的HTTP请求,或隐藏的FRAME.
最简单的就是就是隐藏框架,比如
你在A的主页上放一个 FRAME 将其地址设定为B的某一页,然后 在B中放一个专门用来POST提交信息的页
比如 B.com/post.htm
然后 将要提交的信息用URL传过去 B.com/post.htm?name=aaa&password=5555
在B上 的post.htm上 用JS动态读取URL值来的值,然后AJAX 动态提交或直接提交..
C. 怎么访问nginx代理的服务器
1.1
反向代理初印象
反向代理(Reverse
Proxy)方式是指以代理服务器来接受Internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给Internet上请求连接的客户端,此时代理服务器对外就表现为一个服务器。
从上图可以看出:反向代理服务器位于网站机房,代理网站Web服务器接收Http请求,对请求进行转发。
1.2
反向代理的作用
①保护网站安全:任何来自Internet的请求都必须先经过代理服务器;
②通过配置缓存功能加速Web请求:可以缓存真实Web服务器上的某些静态资源,减轻真实Web服务器的负载压力;
③实现负载均衡:充当负载均衡服务器均衡地分发请求,平衡集群中各个服务器的负载压力;
D. HTTP请求方法
HTTP请求方法是HTTP请求中必不可少的一部分,需要我们熟悉并掌握。最开始的 HTTP1.0 中定义了 三种 请求方法:GET、POST 和 HEAD。后来的 HTTP1.1 中又新增了 五种 :PUT、DELETE、OPTIONS、TRACE 和 CONNECT。当然除了这八种请求方法,特定的HTTP服务器还能够 扩展自定义的方法 。例如实现局部更新的 PATCH 等方法。接下来就简单介绍一下八种基本的请求方法。
首先是八种请求应该实现的功能,HEAD 只用来获取响应的报头;POST、DELETE、PUT、GET 应该分别对应对数据的增、删、改、查;OPTIONS 用来测试服务器;TRACE 用来测试或诊断;CONNECT 预留给能够将连接改为管道方式的代理服务器。
一般我们最经常使用的也就是 POST、DELETE、PUT、GET 这四种了,虽说应该与增删改查一一对应,但是经常在使用的过程中,请求方式只是起到了传递数据的作用,而更详细地对数据的处理则留给后端模块。
一般来说,我们会使用 GET 方法来完成单纯的数据获取,因为 GET 方法应该是 安全的、等幂的 (idempotent),应该不涉及数据的修改,新增,删除等操作。等幂的意思可以简单理解 为对同一URL的多个请求应该返回同样的结果 。
涉及到提交数据方面的请求都使用 POST 来完成(你也可以使用 PUT、DELETE,其实没有太大的区别)。因为 POST 方法的安全性更高,POST 的数据是在请求体中发送的,而 GET 的数据是在 URL 中发送的(其实对稍微懂一点的人来说都没差)。且能够传输的数据大小没有限制,而 GET 方法最多只能传输 2KB的数据。
接来下是八种请求方式的描述:
1、HEAD
HEAD 方法是向服务器发出指定资源的请求,只不过 索要的只是响应头,响应体将不会被返回 。这一方法可以再不必传输整个响应内容的情况下,就可以获取包含在响应小消息头中的元信息。
2、GET
GET 方法与 HEAD 方法类似,是向指定的资源发出 显示 请求。使用 GET 方法应该只用在读取数据,而不应当被用于产生副作用的操作中,如修改数据等,因为 GET 可能会被网络爬虫等随意访问。GET 方法也能够向服务端发送数据,是直接加在 URL 中发送的,用 ? 分割URL和数据,用 & 连接多个数据。
例如:https:mu-mu.cn/index.html?name=mumu&age=20
3、POST
GET 和 POST 是我们使用最频繁的两种请求方法,都是向服务器发出指定资源的请求。但是与 GET 方法不同,POST 方法一般拿来新建或修改服务器资源,所以数据与 POST 方法往往是不可分割的,POST 方法的数据会被包含在请求体中发送至服务端。
4、PUT
PUT 方法和 POST 方法非常类似,都是用作数据的修改,他们的区别就是,PUT 方法是 等幂 的,也就是说,如果你对一段资源进行多次 PUT 请求提交,最后的结果应该都是一样的,所以用来进行数据的修改;而 POST 方法如果进行多次数据提交,最后的结果是不一样的,所以应该用作数据的新增。
5、DELETE
DELETE 方法用来请求服务器 删除 Request-URI所标识的资源。
6、OPTIONS
OPTIONS 方法可使服务器传回对于该资源的 支持情况 ,包括各种请求方法、头部的支持情况等。客户端可以对特定的 URL 使用 OPTIONS 方法,也可以对整站(通过将 URL 设置为“*”)使用该方法,用来测试服务器功能是否正常运作。常见的例子还有跨域的时候,当我们发送的请求为非简单请求时(非 HEAD 、GET、POST,请求头不只有 Accept、Accept-Language、Content-Language、Last-Event-ID、三种Content-Type:application/x-www-form-urlencoded、multipart/form-data、text/plain),浏览器就会先发 OPTIONS 来试探服务器是否允许跨域。相信用过 Vue 的小伙伴应该对 OPTIONS 不陌生。
7、CONNECT
CONNECT 方法在一般的开发中使用不到,这个方法的作用就是把服务器作为跳板,让服务器代替用户去访问其它网页,之后把数据原原本本的返回给用户。这样用户就可以访问到一些只有服务器上才能访问到的网站了,这就是HTTP代理。
8、TRACE
TRACE 请求会在目的服务器端发起一个环回诊断。行程最后一站的服务器会弹回一条 TRACE 响应,并在响应主体中携带它收到的原始请求报文。这样客户端就可以查看在所有中间 HTTP 应用程序组成的请求 / 响应链上,原始报文是否,以及如何被毁坏或修改过。TRACE 方法主要用于 测试或诊断 ,验证请求是否如愿穿过了请求 / 响应链。
以上就是八种 HTTP 请求方式的简单介绍了,除了这基本的八种,还有特定服务器的扩展自定义方法,比如开头提到的 PATCH。平时如果只是满足简单的开发需要,GET 和 POST 就足够了, 但是如果能够掌握和应用这些请求方式,自然能够更上一层楼!
另外,如果你有兴趣,或者是有问题想要与我探讨,欢迎来访问我的博客:https:mu-mu.cn/blog
E. 输入url到页面展示的过程
1、 域名解析
2、 根据IP建立TCP连接(三次握手)
3、 发送HTTP请求
4、 服务器处理请求并返回HTTP报文
5、 浏览器解析并渲染页面
6、 连接结束,关闭TCP连接(四次挥手)
当输入一个域名的时候,我们首先要做的就是 将域名转化成IP地址 。前端的静态资源等,都是存储在服务器上。在计算机网络中,我们不能通过域名直接访问,只能通过IP地址访问到具体的主机。
1、首先 浏览器会查询自身的缓存 中,有没有此条域名的解析,如果有的话,就返回这个解析后的地址。
2、如果浏览器自身的缓存中,没有找到与此条域名对应的IP地址,那么就会去 操作系统中的缓存 中查找是否有这条域名的解析。
3、如果在操作系统中也没有找到的话,那么就需要通过 DNS(域名系统) 帮助我们解析。
4、DNS域名解析过程(详细看参考链接)
浏览器与远程web服务器通过TCP三次握手协商来建立一个TCP/IP连接。该握手首先由客户端尝试建立起通信,而后服务器应答并接受客户端的请求,最后由客户端发出该请求已经被接受的报文。
一旦TCP/IP连接建立,浏览器会通过该连接向远程服务器发送HTTP请求。
当浏览器再次访问某个url时,会先获取资源的header信息, 判断是否命中强缓存 :
1、如命中,直接从缓存获取资源,包括响应的header信息( 请求不会和服务器通信 ),也就是强缓存
2、如未命中强缓存,浏览器发送请求到服务器,该请求会携带第一次请求返回的有关缓存的header信息,由服务器根据请求种的相关header信息来 对比结果是否协商缓存命中
1)若命中,服务器 返回新的响应header信息,更新缓存中对应的header信息,但并不返回资源内容 ,它会告诉浏览器可以直接从缓存获取
2)否则,返回最新的资源内容
Expires :Expires 的值是一个 绝对时间的GMT格式的时间字符串(如Thu, 02 Sep 2021 11:03:45 GMT) ,在浏览器发起请求的时候,会根据系统时间和 Expires 的值进行比较,如果发送请求的时间在expires之前,那么本地缓存始终有效,否则就会发送请求到服务端来获取资源。
注:这个字段会导致一个问题,要是系统时间与服务器时间不一致的时候,就可能出现假性失效,或者出现缓存已经失效了,但是并未去请求最新资源
Cache-control :HTTP/1.1 中新增的属性,属性值具有以下几个:
pragma :不使用强缓存,需要验证缓存是否新鲜。(HTTP/1.1 之前版本的历史遗留字段,仅作为与 HTTP/1.0 的向后兼容而定义)
协商缓存都是由浏览器和服务器协商,来确定是否缓存,主要通过两组header字段,两组字段都是 成对出现 的,即第一次请求的响应头上带某个字段(Last-Modified 或 Etag),则后续请求会带上对应的请求字段(if-modified-since或者if-none-match),若响应头没有,则请求头也不会有对应的字段
①、解析 HTML,生成 DOM 树(浏览器不能直接理解和使用HTML,需要将HTML转换为浏览器能够理解的结构)
②、解析 CSS,生成 CSS 规则树
③、合并 CSS 和 DOM 树,生成render树
④、计算渲染树的布局(Layout/reflow),即各元素尺寸、位置的计算
⑤、绘制 render 树(paint),绘制页面像素信息
⑥、浏览器将各层信息发送给GPU,GPU将各层合成,显示在屏幕
注 :
1 、render树的节点并不等同的dom树的节点,因为有些节点的display为none,那么在生成render树的时候,就不会将其加入到render树中
2 、 当我们浏览器获得HTML文件后,会自上而下的加载,并在加载过程中进行解析和渲染。
3 、 如果在加载过程中遇到外部CSS文件和图片,浏览器会另外发送一个请求,去获取CSS文件和相应的图片,这个请求是异步的,并不会影响HTML文件的加载。 不会阻塞DOM树的解析,会阻塞DOM树的渲染和后面js语句的执行 ,当计算样式的时候需要等待css文件的资源进行层叠样式,资源阻塞了,会进行等待,直到网络超时,network报出错误,渲染进程继续层叠样式计算。为了避免让用户看到长时间的白屏时间,应该提高css的加载速度:
4 、如果遇到javascript文件,HTML文件会挂起渲染的进程,等待JavaScript文件加载完毕后,再继续进行渲染。因为JavaScript可能会修改DOM,导致后续HTML资源白白加载,所以HTML必须等待JavaScript文件加载完毕后,再继续渲染,这也就是为什么JavaScript文件在写在底部body标签前的原因
5 、 每个页面至少需要一次回流,就是在页面第一次加载的时候。
1.第一次挥手:Client发送一个FIN,用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态。
2.第二次挥手:Server收到FIN后,发送一个ACK给Client,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),Server进入CLOSE_WAIT状态。
3.第三次挥手:Server发送一个FIN,用来关闭Server到Client的数据传送,Server进入LAST_ACK状态。
4.第四次挥手:Client收到FIN后,Client进入TIME_WAIT状态,接着发送一个ACK给Server,确认序号为收到序号+1, Server进入CLOSED状态,完成四次挥手。
参考: 前端进阶必看——详细版输入URL到界面展示的过程
简述浏览器渲染机制
F. 搭建http服务器时,向服务费发请求的方法有那两种
GET和POST。
GET用于从指定资源请求数据,GET是最常见的HTTP方法之一。POST用于将数据发送到服务器来创建/更新资源。
G. http权威指南第三章
重点:
http报文是在http应用程序之间发送的数据块。这些数据块以一些文本形式的元信息(meta-information)开头,这些信息报文描述了报文的内容及含义,后面跟着可选数据部分。这些报文在客户端、服务器和代理之间流动。术语 流入 流出 上游 下游 都是用来描述报文方向的。
http使用流入(inbound)和流出(outbound)来描述事务处理(transation)的方向。客户端发向服务器为流入,服务器发向客户端称为流出。
http会像河水一样流动。不管是请求报文还是响应报文,所有的报文都会向下游(downstream)流动。所有报文发送者都在接受者的上游(upstream)。
http报文是简单的格式化数据块。每条报文都包含三个部分:对报文描述的起始行(start line),包含属性的首部(header)块,以及可选的,包含数据主体(body)部分。
起始行和首部就是由行分隔的ascll文本。每行以回车换行符结束。主体是一个可选的数据块。与起始行不同的是,主体可以包含文本或二进制数据,也可以为空。
所有的http报文可以分为两类:请求报文(request message)和响应报文(response message)请求报文会向web服务器请求一个动作。响应报文会将请求的结果返回给客户端。
请求报文格式
<method><request-url><version>
<headers>
<entity-body>
响应报文格式
<version><status><reason-phrase>
<headers>
<entity-body>
所有的http报文都以一个起始行作为开始。请求报文的起始行说明了要做些什么,响应报文起始行说明发生了什么。
1.请求行
请求报文请求服务器对资源进行一些操作。请求报文的起始行,或者称为请求行,包含了一个方法和一个请求url,这个方法描述了服务器应该执行的操作,url描述了要对那个资源执行这个方法。请求行还包含http版本,在http1.0以前不要求请求行包含http版本号。
2.响应行
响应报文承载了状态信息和操作产生的所有结果数据,将其返回给客户端。响应报文的起始行,或者称为响应行,包含类响应报文的http版本。数字状态码,以及描述操作状态的文本形式的原因短语。
3.方法
请求的起始行以方法作为开始,方法用来告知服务器要做些什么。
4.状态码
状态码用来告诉客户端发生了什么,状态码位于起始行的行中。
5.原因短语
响应起始行的最后一个组件,为状态码提供了一个文本解释。http没有规定原因短语以何种方式出现。
6版本号
版本号说明了应用程序支持的最高版本,但http1.0在解释包含http1.1的响应时,会认为这个响应是个1.1响应。
版本号不会被当做分数处理,而是比较每个数字,http/2.22就比http/2.3高,因为22比3大。
1.首部分类
2.首部延续行
将长的首部分为多行可以提高可读性,多出来的每一行至少要有一个空格或制表符
http报文的第三部分是可选的实体主体部分。实体的主体部分是http报文的负荷,就是http要传输的内容。
http/0.9也由请求和响应组成,但请求中只包含方法和请求url,响应中只包含实体,它没有版本信息,没有状态码或原因短语,也没有首部。
不是每个服务器都实现了所有这些方法,如果一台服务器要与http1.1兼容,只要实现get、head方法就可以了。
http定义了一组被称为安全方法的方法。get和head都被认为是安全的方法,这就意味着使用get或head方法的http请求不会产生什么动作,安全方法不一定什么都不执行的(这将由web开发者决定)
get是最常用的方法。通常用于请求服务器发送某个资源。
head与get方法很相似,但服务器只返回首部。不会返回实体的主体部分。这就允许客户端在未获得实际资源的情况下对资源的首部进行检查。
与get从服务器读取文档相反,普通方法会向服务器写入文档。有些发布系统允许用户创建web页面,并用普通直接安装到服务器上
put方法的语义就是让服务器用请求的主体部分来创建一个由所请求的url命名的新文档,或者如果url已存在,就用主体来替代它
post起初是用来向服务器输入数据的。实际上用它来支持html的表单。
客户端发起一个请求这个请求可能要穿过防火墙、代理、网关或其它一些程序。每个中间结点都有可能修改原始http请求。trace方法允许客户端在最终请求发送给服务器时看看它变成什么样子。
trace请求会在目的服务器发起一个回环诊断。行程最后一站的服务器会弹回一条trace响应,并在响应主体中携带它收到的原始请求报文。
options方法请求web服务器告知其支持的功能。可以查询服务器通常支持那些方法。
delete就是请求服务器删除所请求的资源。但是客户端应用无法保证删除一定会被执行。用为http协议允许服务器在不通知客户端的情况下撤销请求。
http被设计成字段可扩展的,这样新特性就不会使老软件失效了。服务器会为他所管理的资源实现http服务,这些方法为开发者提供了扩展http服务能力的手段。
并不是所有的方法都是正式规范中定义的,如果你定义了一个扩展方法,很可能大部分http应用程序都无法理解。同样你的http应用程序也有可能遇到一些其它应用程序正在使用,而并不理解的方法。
多而杂,不抄了
有些首部提供了与报文相关的基本信息,被称为通用首部。
通用信息性首部
通用缓存首部
http1.0引入了第一个允许http应用缓存对象本地副本的首部,这样就不用总是从源服务器获取了。
请求首部是只在请求报文中有意义的首部。
请求的信息性首部
1.accept首部
accept将客户端的喜好和能力告知服务器的方式
2.条件请求首部
客户端为请求添加限制。
3.安全请求首部
http本身支持一种简单的机制,可以对请求进行质询/响应认证。这种机制要求,在获取资源之前,先对自身进行认证,这样使事务稍微安全一些。
安全请求首部
4.请求代理首部
响应报文有自己的响应首部集。响应首部为客户端提供了一些额外的信息。
1.协商首部
如果资源有多种便是方法,http1.1可以为客户端和服务器提供对资源进行协商的能力
2.安全响应首部
信息性首部
1.内容首部
2.实体缓存首部
通用的缓存首部说明了如何或什么时候进行缓存。实体的缓存提供了与被缓存实体有关的信息。
实体缓存
H. jmeter客户端调用服务器资源,但是服务器端有多网卡
2.1 测试环境
作者使用了Tomcat作为Web服务器进行测试,被测试的内容是一个jsp文件和一个servlet,jsp文件调用JavaBean、打印相关信息,servlet接受用户参数、调用javabean、输出相关信息。详细的内容请参考作者提供的JMeter.war的内容。
2.2 安装启动JMeter
大家可以到通过http://apache.linuxforum.net/dist/jakarta/jmeter/binaries/jakarta-jmeter-1.9.1.zip下载JMeter的release版本,然后将下载的.zip文件解压缩到C:/JMeter(后面的文章中将使用%JMeter%来引用这个目录)目录下。
现在,请使用%JMeter%/bin下面的jmeter.bat批处理文件来启动JMeter的可视化界面,下面的工作都将在这个可视化界面界面上进行操作。下面的图片是JMeter的可视化界面的屏幕截图。
图一: JMeter打开时的屏幕截图
图一: JMeter打开时的屏幕截图
2.3 建立测试计划(Test Plan)
测试计划描述了执行测试过程中JMeter的执行过程和步骤,一个完整的测试计划包括一个或者多个线程组(Thread Groups)、逻辑控制(Logic Controller)、实例产生控制器(Sample Generating Controllers)、侦听器(Listener)、定时器(Timer)、比较(Assertions)、配置元素(Config Elements)。打开JMeter时,它已经建立一个默认的测试计划,一个JMeter应用的实例只能建立或者打开一个测试计划。
现在我们开始填充一个测试计划的内容,这个测试计划向一个jsp文件和一个servlet发出请求,我们需要JMeter模拟五个请求者(也就是五个线程),每个请求者连续请求两次,下面的章节介绍了详细的操作步骤。
2.4 增加负载信息设置
这一步,我们将向测试计划中增加相关负载设置,是Jmeter知道我们需要模拟五个请求者,每个请求者在测试过程中连续请求两次。详细步骤如下:
1. 选中可视化界面中左边树的Test Plan节点,单击右键,选择Add'Thread Group,界面右边将会出现他的设置信息框。
2. Thread Group有三个和负载信息相关的参数:
Number of Threads: 设置发送请求的用户数目
Ramp-up period: 每个请求发生的总时间间隔,单位是秒。比如你的请求数目是5,而这个参数是10,那么每个请求之间的间隔就是10/5,也就是2秒
Loop Count: 请求发生的重复次数,如果选择后面的forever(默认),那么 请求将一直继续,如果不选择forever,而在输入框中输入数字,那么请求将重复 指定的次数,如果输入0,那么请求将执行一次。
根据我们演示例子的设计,我们应该将Number of Threads设置为5,Ramp-up period设置为0(也就是同时并发请求),不选中forever,在Loop Count后面的输入框中输入2,设置后的屏幕截图如下:
图二:设置好参数的Thread Group。
图二:设置好参数的Thread Group。
2.5 增加默认Http属性(可选)
实际的测试工作往往是针对同一个服务器上Web应用展开的,所以Jmeter提供了这样一种设置, 在默认Http属性设置需要被测试服务器的相关属性,以后的http请求设置中就可以忽略这些相同参数的设置,减少设置参数录入的时间。
我们这里将采用这种属性。你可以通过下面的步骤来设置默认http属性:
1. 选中可视化界面中左边树的Test Plan节点,单击右键,选择Add'config element'http request defaults,界面右边将会出现他的设置信息框。
2. 默认http属性的主要参数说明如下:
protocal:发送测试请求时使用的协议
server name or ip:被测试服务器的ip地址或者名字
path: 默认的起始位置。比如将path设置为/jmeter,那么所有的http请求的url中都将增加/jmeter路径。
port number: 服务器提供服务的端口号
我们的测试计划将针对本机的Web服务器上的Web应用进行测试,所以protocal应该是http,ip使用localhost,因为这个web应用发布的context路径是/jmeter,所以这里的path设置为/jmeter,因为使用Tomcat服务器,所以port number是8080。设置后的屏幕截图如下:
图三: 测试计划中使用的默认Http参数
图三: 测试计划中使用的默认Http参数
2.6 增加Http请求
现在我们需要增加http请求了,他也是我们测试的内容主体部分。你可以通过下面的步骤来增加性的http请求:
1. 选中可视化界面中左边树的Thread Group节点,单击右键,选择Add'sampler'http request,界面右边将会出现他的设置信息框。
2. 他的参数和2.5中介绍的http属性差不多,增加的属性中有发送http时方法的选择,你可以选择为get或者post。
我们现在增加两个http 请求,因为我们设置了默认的http属性,所以和默认http属性中相同的属性不再重复设置。设置后的屏幕截图如下:
图四:设置好的jsp测试请求
图四:设置好的jsp测试请求
图五:设置好的Servlet测试请求(带参数)
图五:设置好的Servlet测试请求(带参数)
2.7 增加Listener
增加listener是为了记录测试信息并且可以使用Jmeter提供的可视化界面查看测试结果,里面有好几种结果分析方式可供选择,你可以根据自己习惯的分析方式选择不同的结果显示方式,我们这里使用表格的形式来查看和分析测试结果。你可以通过下面的步骤来增加listener:
1. 选中可视化界面中左边树的Test Plan节点,单击右键,选择Add'listener'view result in table,界面右边将会出现他的设置信息和结果显示框。
2. 你可以设置界面上面的filename属性设置将测试结果保存到某个文件中 界面下面将使用表格显示测试结果,表格的第一列sampleno显示请求执行的顺序和编号,url显示请求发送的目标,sample-ms列显示这个请求完成耗费的时间,最后的success列显示改请求是否成功执行。
界面的最下面你还可以看到一些统计信息,最关心的应该是Average吧,也就是相应的平均时间。
2.8 开始执行测试计划
现在你可以通过单击菜单栏run -> Start开始执行测试计划了。下面这两个图是作者第一次、第二次执行该测试计划的结果图:
大家可以看到第一次执行时的几个大时间值均来自于jsp request,这可以通过下面的理由进行解释:jsp执行前都需要被编译成.class文件。所以第二次的结果才是正常的结果。
I. 请求web服务器数据时有多种方法,其中哪种方法功能最全
如果数据量很多,比如存取“很多人”的留言和其他相关信息。这样xml标签代码量自然会很多,逐个遍历所用的时间肯定较长,所以这个时候数据库就能快点,对于频繁操作数据源的,自然使用数据库的连接池功能。
J. 如何配置服务器安装客户端操作系统即通过网线连接服务器,客户端请求服务器的资源进行安装操作系统。
···我没猜错你不是XP系统就是win7吧?
你使用的不是服务器系统,你自己的电脑装一个服务器操作系统就好了
现在一般都是使用windows 2003 server\
linux\ unix