HTTP请求、响应、缓存

1. HTTP请求格式      

       做过Socket编程的人都知道,当我们设计一个通信协议时,“消息头/消息体”的分割方式是很常用的,消息头告诉对方这个消息是干什么的,消息体告诉对方怎么干。HTTP协议传输的消息也是这样规定的,每一个HTTP包都分为HTTP头和HTTP体两部分,消息体是可选的,而消息头是必须的。每当我们打开一个网页,在上面点击右键,选择“查看源文件”,这时看到的HTML代码就是HTTP的消息体,那么消息头可以通过浏览器的开发工具或者插件可以看到,如果火狐的Firebug,IE的Httpwatch。

      客户端通过发送 HTTP 请求向服务器请求对资源的访问。 它向服务器传递了一个数据块,也就是请求信息,HTTP 请求由三部分组成:请求行、  请求头和请求正文。

 请求行:请求方法 URI 协议/版本

  请求头(Request Header)

 

 请求正文

下面是一个HTTP请求的数据:

POST /index.php HTTP/1.1
Host: localhost
User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:10.0.2) Gecko/20100101 Firefox/10.0.2
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-cn,zh;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive
Referer: http://localhost/
Content-Length:25
Content-Type:application/x-www-form-urlencoded
 
username=aa&password=1234
 

1、请求行:请求方法URI协议/版本

 请求的第一行是“方法 URL  协议/版本”,并以 回车换行作为结尾。请求行以空格分隔。格式如下:
POST /index.php HTTP/1.1
以上代码中“GET”代表请求方法,“//ndex.php”表示URI,“HTTP/1.1代表协议和协议的版本。
        根据HTTP标准,HTTP请求可以使用多种请求方法。例如:HTTP1.1支持7种请求方法:GET、POST、HEAD、OPTIONS、PUT、DELETE和TARCE。在Internet应用中,最常用的方法是GET和POST。
         URL完整地指定了要访问的网络资源,通常只要给出相对于服务器的根目录的相对目录即可,因此总是以“/”开头,最后,协议版本声明了通信过程中使用HTTP的版本。   

请求方法

在 HTTP 协议中,HTTP 请求可以使用多种请求方法,这些方法指明了要以何种方式来访问 Request-URI 所标识的资源。HTTP1.1 支持的请求方法如下表所示:

HTTP1.1 中的请求方式:
方法 作用
GET 请求获取由 Request-URI 所标识的资源
POST 请求服务器接收在请求中封装的实体,并将其作为由 Request-Line 中的 Request-URI 所标识的资源的一部分
HEAD 请求获取由 Request-URI 所标识的资源的响应消息报头
PUT

请求服务器存储一个资源,并用 Request-URI 作为其标识符

DELETE 请求服务器删除由 Request-URI 所标识的资源
TRACE 请求服务器回送到的请求信息,主要用于测试或诊断
CONNECT 保留将来使用
OPTIONS 请求查询服务器的性能,或者查询与资源相关的选项和需求
 

重点介绍 GET、POST 和 HEAD 三个方法:

(1)GET

        GET 方法用于获取由 Request-URI 所标识的资源的信息,常见的形式是:

        GET Request-URI HTTP/1.1
        GET方法是默认的HTTP请求方法,例如当我们通过在浏览器的地址栏中直接输入网址的方式去访问网页的时候,浏览器采用的就是 GET 方法向服务器获取资源。

        我们可以使用GET方法来提交表单数据,用GET方法提交的表单数据只经过了简单的编码,同时它将作为URL的一部分向服务器发送,因此,如果使用GET方法来提交表单数据就存在着安全隐患上。例如:
         Http://localhost/login.php?username=aa&password=1234

        从上面的URL请求中,很容易就可以辩认出表单提交的内容。(?之后的内容)另外由于GET方法提交的数据是作为URL请求的一部分所以提交的数据量不能太大。这是因为浏览器对url的长度有限制

       各种浏览器也会对url的长度有所限制,下面是几种常见浏览器的url长度限制:(单位:字符)

IE : 2803
Firefox:65536
Chrome:8182
Safari:80000
Opera:190000 

(2)POST

          POST方法是GET方法的一个替代方法,它主要是向Web服务器提交表单数据,尤其是大批量的数据。 在请求头信息结束之后的两个回车换行之后(实际是空一行),就是表单提交的数据。如上面提到的post表单数据:

        username=aa&password=1234

        POST方法克服了GET方法的一些缺点。通过POST方法提交表单数据时,数据不是作为URL请求的一部分而是作为标准数据传送给Web服务器,这就克服了GET方法中的信息无法保密和数据量太小的缺点。因此,出于安全的考虑以及对用户隐私的尊重,通常表单提交时采用POST方法。

  从编程的角度来讲,如果用户通过GET方法提交数据,则数据存放在QUERY_STRING环境变量中,而POST方法提交的数据则可以从标准输入流中获取。

 

 GET与POST方法有以下区别:

      1、  在客户端,Get方式在通过URL提交数据,数据在URL中可以看到;POST方式,数据放在HTTP包的body中。

      2、 GET方式提交的数据大小有限制(因为浏览器对URL的长度有限制),而POST则没有此限制。

      3、安全性问题。正如在(1)中提到,使用 Get 的时候,参数会显示在地址栏上,而 Post 不会。所以,如果这些数据是中文数据而且是非敏感数据,那么使用 get;如果用户输入的数据不是中文字符而且包含敏感数据,那么还是使用 post为好。

      4.、服务器取值方式不一样。GET方式取值,如php可以使用$_GET来取得变量的值,而POST方式通过$_POST来获取变量的值。

 

(3)HEAD

     HEAD 方法与 GET 方法几乎是相同的,它们的区别在于 HEAD 方法只是请求消息报头,而不是完整的内容。对于 HEAD 请求的回应部分来说,它的 HTTP 头部中包含的信息与通过 GET 请求所得到的信息是相同的。利用这个方法,不必传输整个资源内容,就可以得到 Request-URI 所标识的资源的信息。这个方法通常被用于测试超链接的有效性,是否可以访问,以及最近是否更新。

    要注意的是,在 HTML 文档中,书写 get 和 post,大小写都可以,但在 HTTP 协议中的 GET 和 POST 只能是大写形式。

2. 请求头

每个头域由一个域名,冒号(:)和域值三部分组成。域名是大小写无关的,域值前可以添加任何数量的空格符,头域可以被扩展为多行,在每行开始处,使用至少一个空格或制表符。

HTTP最常见的请求头如下:

Transport 头域

Connection:

作用:表示是否需要持久连接。

如果服务器看到这里的值为“Keep-Alive”,或者看到请求使用的是HTTP 1.1(HTTP 1.1默认进行持久连接),它就可以利用持久连接的优点,当页面包含多个元素时(例如Applet,图片),显著地减少下载所需要的时间。要实现这一点,服务器需要在应答中发送一个Content-Length头,最简单的实现方法是:先把内容写入 ByteArrayOutputStream,然后在正式写出内容之前计算它的大小;

例如: Connection: keep-alive   当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,如果客户端再次访问这个服务器上的  网页,会继续使用这一条已经建立的连接

例如:  Connection: close  代表一个Request完成后,客户端和服务器之间用于传输HTTP数据的TCP连接会关闭,  当客户端再次发送Request,需要重新建立TCP连接。

Host(发送请求时,该报头域是必需的)

Host请求报头域主要用于指定被请求资源的Internet主机和端口号,它通常从HTTP URL中提取出来的。

eg:http://;localhost/index.html
浏览器发送的请求消息中,就会包含Host请求报头域,如下:
Host:
localhost

此处使用缺省端口号80,若指定了端口号8080,则变成:Host:localhost:8080

Client 头域

Accept:

作用:浏览器可以接受的媒体类型(MIME类型),

例如:  Accept: text/html  代表浏览器可以接受服务器回发的类型为 text/html  也就是我们常说的html文档, 如果服务器无法返回text/html类型的数据,服务器应该返回一个406错误(non acceptable)。

通配符 * 代表任意类型。例如  Accept: */*  代表浏览器可以处理所有类型,(一般浏览器发给服务器都是发这个)

Accept-Encoding:

作用: 浏览器申明自己接收的编码方法,通常指定压缩方法,是否支持压缩,支持什么压缩方法(gzip,deflate),(注意:这不是只字符编码);

例如: Accept-Encoding: gzip, deflate。Server能够向支持gzip/deflate的浏览器返回经gzip或者deflate编码的HTML页面。 许多情形下这可以减少5到10倍的下载时间,也节省带宽。

Accept-Language:

作用: 浏览器申明自己接收的语言。 

语言跟字符集的区别:中文是语言,中文有多种字符集,比如big5,gb2312,gbk等等;

例如: Accept-Language:zh-cn 。如果请求消息中没有设置这个报头域,服务器假定客户端对各种语言都可以接受。

User-Agent:

作用:告诉HTTP服务器, 客户端使用的操作系统和浏览器的名称和版本.

我们上网登陆论坛的时候,往往会看到一些欢迎信息,其中列出了你的操作系统的名称和版本,你所使用的浏览器的名称和版本,这往往让很多人感到很神奇,实际上, 服务器应用程序就是从User-Agent这个请求报头域中获取到这些信息User-Agent请求报头域允许客户端将它的操作系统、浏览器和其它属性告诉服务器。

例如: User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; CIBA; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET4.0C; InfoPath.2; .NET4.0E)

Accept-Charset:

作用:浏览器申明自己接收的字符集,这就是本文前面介绍的各种字符集和字符编码,如gb2312,utf-8(通常我们说Charset包括了相应的字符编码方案);

例如:Accept-Charset:iso-8859-1,gb2312.如果在请求消息中没有设置这个域,缺省是任何字符集都可以接受。

Authorization:授权信息,通常出现在对服务器发送的WWW-Authenticate头的应答中;

Authorization请求报头域主要用于证明客户端有权查看某个资源。当浏览器访问一个页面时,如果收到服务器的响应代码为401(未授权),可以发送一个包含Authorization请求报头域的请求,要求服务器对其进行验证。

Cookie/Login 头域

Cookie:

作用: 最重要的header, 将cookie的值发送给HTTP 服务器

Entity头域

Content-Length

作用:发送给HTTP服务器数据的长度。即请求消息正文的长度;

例如: Content-Length: 38

Content-Type:

作用:

例如:Content-Type: application/x-www-form-urlencoded

Miscellaneous 头域

Referer:

作用: 提供了Request的上下文信息的服务器,告诉服务器我是从哪个链接过来的,比如从我主页上链接到一个朋友那里, 他的服务器就能够从HTTP Referer中统计出每天有多少用户点击我主页上的链接访问    他的网站。

例如: Referer:http://translate.google.cn/?hl=zh-cn&tab=wT

Cache 头域

If-Modified-Since:

作用: 把浏览器端缓存页面的最后修改时间发送到服务器去,服务器会把这个时间与服务器上实际文件的最后修改时间进行对比。如果时间一致,那么返回304,客户端就直接使用本地缓存文件。如果时间不一致,就会返回200和新的文件内容。客户端接到之后,会丢弃旧文件,把新文件缓存起来,并显示在浏览器中。

例如:If-Modified-Since: Thu, 09 Feb 2012 09:07:57 GMT。

If-None-Match:

作用: If-None-Match和ETag一起工作,工作原理是在HTTP Response中添加ETag信息。 当用户再次请求该资源时,将在HTTP Request 中加入If-None-Match信息(ETag的值)。如果服务器验证资源的ETag没有改变(该资源没有更新),将返回一个304状态告诉客户端使用本地缓存文件。否则将返回200状态和新的资源和Etag.  使用这样的机制将提高网站的性能

例如: If-None-Match: "03f2b33c0bfcc1:0"

Pragma:

作用: 防止页面被缓存, 在HTTP/1.1版本中,它和Cache-Control:no-cache作用一模一样

Pargma只有一个用法, 例如: Pragma: no-cache

注意: 在HTTP/1.0版本中,只实现了Pragema:no-cache, 没有实现Cache-Control

Cache-Control:

作用: 这个是非常重要的规则。 这个用来指定Response-Request遵循的缓存机制。各个指令含义如下

Cache-Control:Public   可以被任何缓存所缓存()

Cache-Control:Private     内容只缓存到私有缓存中

Cache-Control:no-cache  所有内容都不会被缓存

2. HTTP响应格式      

      在接收和解释请求消息后,服务器会返回一个 HTTP 响应消息。与 HTTP 请求类似,HTTP 响应也是由三个部分组成,分别是:状态行、消息报头和响应正文。如:

 
  

HTTP/1.1 200 OK Date: Sun, 17 Mar 2013 08:12:54 GMT Server: Apache/2.2.8 (Win32) PHP/5.2.5 X-Powered-By: PHP/5.2.5 Set-Cookie: PHPSESSID=c0huq7pdkmm5gg6osoe3mgjmm3; path=/ Expires: Thu, 19 Nov 1981 08:52:00 GMT Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0 Pragma: no-cache Content-Length: 4393 Keep-Alive: timeout=5, max=100 Connection: Keep-Alive Content-Type: text/html; charset=utf-8

HTTP响应示例<title> </head> <body> Hello HTTP! </body> </html></p> <p> </p> <h3 style="color:rgb(51,51,51);font-family:Arial;line-height:26px;"> <span style="color:rgb(51,51,255);">1、状态行</span></h3> <p style="color:rgb(51,51,51);font-family:Arial;font-size:14px;line-height:26px;"> <span></span>       状态行由协议版本、数字形式的状态代码,及相应的状态描述组成,各元素之间以空格分隔,结尾时回车换行符,格式如下:</p> <p style="color:rgb(51,51,51);font-family:Arial;font-size:14px;line-height:26px;"> <span></span>HTTP-Version Status-Code Reason-Phrase CRLF</p> <p style="color:rgb(51,51,51);font-family:Arial;font-size:14px;line-height:26px;"> <span></span>HTTP-Version 表示服务器 HTTP 协议的版本,Status-Code 表示服务器发回的响应代码,Reason-Phrase 表示状态代码的文本描述,CRLF 表示回车换行。例如:</p> <p style="color:rgb(51,51,51);font-family:Arial;font-size:14px;line-height:26px;"> <span></span>HTTP/1.1 200 OK (CRLF)</p> <p style="color:rgb(51,51,51);font-family:Arial;font-size:14px;line-height:26px;"> <strong>      状态代码与状态描述</strong></p> <p style="color:rgb(51,51,51);font-family:Arial;font-size:14px;line-height:26px;"> <span></span>      状态代码由 3 位数字组成, 表示请求是否被理解或被满足,状态描述给出了关于状态码的简短的文字描述。状态码的第一个数字定义了响应类别,后面两位数字没有具体分类。第一个数字有 5 种取值,如下所示。</p> <ul style="color:rgb(51,51,51);font-family:Arial;font-size:14px;line-height:26px;"> <li>1xx:指示信息——表示请求已经接受,继续处理</li> <li>2xx:成功——表示请求已经被成功接收、理解、接受。</li> <li>3xx:重定向——要完成请求必须进行更进一步的操作</li> <li>4xx:客户端错误——请求有语法错误或请求无法实现</li> <li>5xx:服务器端错误——服务器未能实现合法的请求。</li> </ul> <p style="color:rgb(51,51,51);font-family:Arial;font-size:14px;line-height:26px;"> 常见状态代码、状态描述、说明:<br> 200 OK      //客户端请求成功<br> 400 Bad Request  //客户端请求有语法错误,不能被服务器所理解<br> 401 Unauthorized //请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用 <br> 403 Forbidden  //服务器收到请求,但是拒绝提供服务<br> 404 Not Found  //请求资源不存在,eg:输入了错误的URL<br> 500 Internal Server Error //服务器发生不可预期的错误<br> 503 Server Unavailable  //服务器当前不能处理客户端的请求,一段时间后可能恢复正常</p> <h3 style="color:rgb(51,51,51);font-family:Arial;line-height:26px;"> <span style="color:rgb(51,51,255);">2、响应正文</span></h3> <p style="color:rgb(51,51,51);font-family:Arial;font-size:14px;line-height:26px;"> 响应正文就是服务器返回的资源的内容,响应头和正文之间也必须用空行分隔<span style="font-size:12pt;">。如:</span></p> <p style="color:rgb(51,51,51);font-family:Arial;font-size:14px;line-height:26px;"> <span style="font-size:12pt;"></span></p> <div class="dp-highlighter bg_html" style="font-family:Consolas, 'Courier New', Courier, mono, serif;border:1px dashed rgb(153,153,153);width:687.046875px;overflow:auto;color:rgb(51,51,51);line-height:26px;"> <ol start="1" class="dp-xml" style="border:none;color:rgb(92,92,92);"> <li class="alt" style="border:none;list-style:outside;color:inherit;line-height:13px;"> <span style="border:none;color:#000000;"><span class="tag" style="border:none;color:rgb(153,51,0);font-weight:bold;"><</span><span class="tag-name" style="border:none;color:rgb(153,51,0);font-weight:bold;">html</span><span class="tag" style="border:none;color:rgb(153,51,0);font-weight:bold;">></span><span style="border:none;">  </span></span></li> <li style="border:none;list-style:outside;line-height:13px;"> <span style="border:none;color:#000000;"><span class="tag" style="border:none;color:rgb(153,51,0);font-weight:bold;"><</span><span class="tag-name" style="border:none;color:rgb(153,51,0);font-weight:bold;">head</span><span class="tag" style="border:none;color:rgb(153,51,0);font-weight:bold;">></span><span style="border:none;">  </span></span></li> <li class="alt" style="border:none;list-style:outside;color:inherit;line-height:13px;"> <span style="border:none;color:#000000;"><span class="tag" style="border:none;color:rgb(153,51,0);font-weight:bold;"><</span><span class="tag-name" style="border:none;color:rgb(153,51,0);font-weight:bold;">title</span><span class="tag" style="border:none;color:rgb(153,51,0);font-weight:bold;">></span><span style="border:none;">HTTP响应示例</span><span class="tag" style="border:none;color:rgb(153,51,0);font-weight:bold;"><</span><span class="tag-name" style="border:none;color:rgb(153,51,0);font-weight:bold;">title</span><span class="tag" style="border:none;color:rgb(153,51,0);font-weight:bold;">></span><span style="border:none;">  </span></span></li> <li style="border:none;list-style:outside;line-height:13px;"> <span style="border:none;color:#000000;"><span class="tag" style="border:none;color:rgb(153,51,0);font-weight:bold;"></</span><span class="tag-name" style="border:none;color:rgb(153,51,0);font-weight:bold;">head</span><span class="tag" style="border:none;color:rgb(153,51,0);font-weight:bold;">></span><span style="border:none;">  </span></span></li> <li class="alt" style="border:none;list-style:outside;color:inherit;line-height:13px;"> <span style="border:none;color:#000000;"><span class="tag" style="border:none;color:rgb(153,51,0);font-weight:bold;"><</span><span class="tag-name" style="border:none;color:rgb(153,51,0);font-weight:bold;">body</span><span class="tag" style="border:none;color:rgb(153,51,0);font-weight:bold;">></span><span style="border:none;">  </span></span></li> <li style="border:none;list-style:outside;line-height:13px;"> <span style="border:none;color:#000000;">Hello HTTP!  </span></li> <li class="alt" style="border:none;list-style:outside;color:inherit;line-height:13px;"> <span style="border:none;color:#000000;"><span class="tag" style="border:none;color:rgb(153,51,0);font-weight:bold;"></</span><span class="tag-name" style="border:none;color:rgb(153,51,0);font-weight:bold;">body</span><span class="tag" style="border:none;color:rgb(153,51,0);font-weight:bold;">></span><span style="border:none;">  </span></span></li> <li style="border:none;list-style:outside;line-height:13px;"> <span style="border:none;color:#000000;"><span class="tag" style="border:none;color:rgb(153,51,0);font-weight:bold;"></</span><span class="tag-name" style="border:none;color:rgb(153,51,0);font-weight:bold;">html</span><span class="tag" style="border:none;color:rgb(153,51,0);font-weight:bold;">></span><span style="border:none;">  </span></span></li> </ol> </div> <h3 style="color:rgb(51,51,51);font-family:Arial;line-height:26px;"> <span style="color:rgb(51,51,255);">3 、响应头信息</span></h3> <p style="color:rgb(51,51,51);font-family:Arial;font-size:14px;line-height:26px;"> <span style="font-size:16px;"><span style="font-size:12px;">HTTP最常见的响应头如下所示:</span></span></p> <h4 style="color:rgb(51,51,51);font-family:Arial;font-size:14px;line-height:26px;"> Cache头域</h4> <blockquote style="color:rgb(51,51,51);font-family:Arial;font-size:14px;line-height:26px;"> <p><strong>Date:</strong></p> <p>作用:生成消息的具体时间和日期,即当前的GMT时间。</p> <p>例如: Date: Sun, 17 Mar 2013 08:12:54 GMT</p> <p><strong>Expires:</strong></p> <p>作用: 浏览器会在指定过期时间内使用本地缓存,指明应该在什么时候认为文档已经过期,从而不再缓存它。</p> <p>例如: Expires: Thu, 19 Nov 1981 08:52:00 GMT  </p> <p><strong>Vary</strong></p> <p>作用:</p> <p>例如: Vary: Accept-Encoding</p> </blockquote> <h4 style="color:rgb(51,51,51);font-family:Arial;font-size:14px;line-height:26px;"> Cookie/Login 头域</h4> <blockquote style="color:rgb(51,51,51);font-family:Arial;font-size:14px;line-height:26px;"> <p><strong>P3P</strong></p> <p>作用: 用于跨域设置Cookie, 这样可以解决iframe跨域访问cookie的问题</p> <p>例如: P3P: CP=CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR</p> <p><strong>Set-Cookie</strong></p> <p>作用: 非常重要的header, 用于把cookie 发送到客户端浏览器, 每一个写入cookie都会生成一个Set-Cookie.</p> <p>例如: Set-Cookie: PHPSESSID=c0huq7pdkmm5gg6osoe3mgjmm3; path=/</p> </blockquote> <h4 style="color:rgb(51,51,51);font-family:Arial;font-size:14px;line-height:26px;"> Entity实体头域:</h4> <p style="color:rgb(51,51,51);font-family:Arial;font-size:14px;line-height:26px;"> <strong>            实体内容的属性,包括实体信息类型,长度,压缩方法,最后一次修改时间,数据有效性等。</strong></p> <blockquote style="color:rgb(51,51,51);font-family:Arial;font-size:14px;line-height:26px;"> <p><strong>ETag:</strong></p> <p>作用:  和If-None-Match 配合使用。 (实例请看上节中If-None-Match的实例)</p> <p>例如: ETag: "03f2b33c0bfcc1:0"</p> <p><strong>Last-Modified:</strong></p> <p>作用: 用于指示资源的最后修改日期和时间。(实例请看上节的If-Modified-Since的实例)</p> <p>例如: Last-Modified: Wed, 21 Dec 2011 09:09:10 GMT</p> <p><strong>Content-Type:</strong></p> <p>作用:WEB服务器告诉浏览器自己响应的对象的类型和字符集,</p> <p>例如:</p> <p>        Content-Type: text/html; charset=utf-8</p> <p>  Content-Type:text/html;charset=GB2312</p> <p>  Content-Type: image/jpeg</p> <p><strong>Content-Length:</strong></p> <p>指明实体正文的长度,以字节方式存储的十进制数字来表示。在数据下行的过程中,Content-Length的方式要预先在服务器中缓存所有数据,然后所有数据再一股脑儿地发给客户端。</p> <p>  例如: Content-Length: 19847</p> <p><strong>Content-Encoding:</strong></p> <p>作用:文档的编码(Encode)方法。一般是压缩方式。</p> <p>WEB服务器表明自己使用了什么压缩方法(gzip,deflate)压缩响应中的对象。利用gzip压缩文档能够显著地减少HTML文档的下载时间。</p> <p>例如:Content-Encoding:gzip</p> <p><strong>Content-Language:</strong></p> <p>作用: WEB服务器告诉浏览器自己响应的对象的语言者</p> <p>例如: Content-Language:da</p> </blockquote> <h4 style="color:rgb(51,51,51);font-family:Arial;font-size:14px;line-height:26px;"> Miscellaneous 头域</h4> <blockquote style="color:rgb(51,51,51);font-family:Arial;font-size:14px;line-height:26px;"> <p><strong>Server:</strong></p> <p>作用:指明HTTP服务器的软件信息</p> <p>例如:Apache/2.2.8 (Win32) PHP/5.2.5</p> <p><strong>X-Powered-By:</strong></p> <p>作用:表示网站是用什么技术开发的</p> <p>例如: X-Powered-By: PHP/5.2.5</p> </blockquote> <h4 style="color:rgb(51,51,51);font-family:Arial;font-size:14px;line-height:26px;"> Transport头域</h4> <blockquote style="color:rgb(51,51,51);font-family:Arial;font-size:14px;line-height:26px;"> <p><strong>Connection:</strong></p> <p>例如: Connection: keep-alive   当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立的连接</p> <p>例如:  Connection: close  代表一个Request完成后,客户端和服务器之间用于传输HTTP数据的TCP连接会关闭, 当客户端再次发送Request,需要重新建立TCP连接。</p> </blockquote> <h4 style="color:rgb(51,51,51);font-family:Arial;font-size:14px;line-height:26px;"> Location头域</h4> <blockquote style="color:rgb(51,51,51);font-family:Arial;font-size:14px;line-height:26px;"> <p><strong>Location:</strong></p> <p>作用: 用于重定向一个新的位置, 包含新的URL地址</p> <p>实例请看304状态实例</p> </blockquote> <h3 style="color:rgb(51,51,51);font-family:Arial;line-height:26px;"> <span>HTTP协议是无状态的和Connection: keep-alive的区别</span></h3> <p style="color:rgb(51,51,51);font-family:Arial;font-size:14px;line-height:26px;">   无状态是指协议对于事务处理没有记忆能力,服务器不知道客户端是什么状态。从另一方面讲,打开一个服务器上的网页和你之前打开这个服务器上的网页之间没有任何联系。</p> <p style="color:rgb(51,51,51);font-family:Arial;font-size:14px;line-height:26px;">   HTTP是一个无状态的面向连接的协议,无状态不代表HTTP不能保持TCP连接,更不能代表HTTP使用的是UDP协议(无连接)。</p> <p style="color:rgb(51,51,51);font-family:Arial;font-size:14px;line-height:26px;">   从HTTP/1.1起,默认都开启了Keep-Alive,保持连接特性,简单地说,当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立的连接。</p> <p style="color:rgb(51,51,51);font-family:Arial;font-size:14px;line-height:26px;">   Keep-Alive不会永久保持连接,它有一个保持时间,可以在不同的服务器软件(如Apache)中设定这个时间。</p> <p style="color:rgb(51,51,51);font-family:Arial;font-size:14px;line-height:26px;">  </p> <h2 class="headline-1 bk-sidecatalog-title" style="color:rgb(51,51,51);font-family:Arial;line-height:26px;border-bottom-color:rgb(222,223,225);border-bottom-width:1px;border-bottom-style:solid;clear:both;"> <span style="color:rgb(51,51,255);"><span style="line-height:36px;font-size:22px;">3. 浏览器缓存</span>      </span></h2> <p style="color:rgb(51,51,51);font-family:Arial;font-size:14px;line-height:26px;">           </p> <p style="color:rgb(51,51,51);font-family:Arial;font-size:14px;line-height:26px;">        浏览器缓存:包括页面html缓存和图片js,css等资源的缓存。如下图,浏览器缓存是基于把页面信息保存到用户本地电脑硬盘里。</p> <p style="color:rgb(51,51,51);font-family:Arial;font-size:14px;line-height:26px;">         </p> <p style="color:rgb(51,51,51);font-family:Arial;font-size:14px;line-height:26px;"> <br></p> <p style="color:rgb(51,51,51);font-family:Arial;font-size:14px;line-height:26px;"> </p> <h3 style="line-height:26px;font-size:17px;color:rgb(57,57,57);font-family:verdana, 'ms song', Arial, Helvetica, sans-serif;"> <span style="font-size:16px;">1、缓存的优点:</span></h3> <p style="color:rgb(51,51,51);font-family:Arial;font-size:14px;line-height:26px;"> </p> <p style="font-size:14px;color:rgb(57,57,57);font-family:verdana, 'ms song', Arial, Helvetica, sans-serif;line-height:21px;"> <span style="font-size:16px;">   </span><span><span style="font-size:12px;">  1)服务器<span>响应更快</span>:因为请求从缓存服务器(离客户端更近)而不是源服务器被相应,这个过程耗时更少,让服务器看上去响应更快。</span></span></p> <p style="font-size:14px;color:rgb(57,57,57);font-family:verdana, 'ms song', Arial, Helvetica, sans-serif;line-height:21px;"> <span><span style="font-size:12px;">     2)<span>减少网络带宽消耗</span>:当副本被重用时会减低客户端的带宽消耗;客户可以节省带宽费用,控制带宽的需求的增长并更易于管理。</span></span></p> <h3 style="color:rgb(51,51,51);font-family:Arial;line-height:26px;"> 1、缓存工作原理</h3> <p style="color:rgb(51,51,51);font-family:Arial;font-size:14px;line-height:26px;">        页面缓存状态是由http header决定的,一个浏览器请求信息,一个是服务器响应信息。主要包括Pragma: no-cache、Cache-Control、 Expires、 Last-Modified、If-Modified-Since。其中Pragma: no-cache由HTTP/1.0规定,Cache-Control由HTTP/1.1规定。</p> <p style="color:rgb(51,51,51);font-family:Arial;font-size:14px;line-height:26px;">        工作原理图:</p> <p style="color:rgb(51,51,51);font-family:Arial;font-size:14px;line-height:26px;"> </p> <p style="color:rgb(51,51,51);font-family:Arial;font-size:14px;line-height:26px;">  </p> <p style="color:rgb(51,51,51);font-family:Arial;font-size:14px;line-height:26px;"> 从图中我们可以看到原理主要分三步:</p> <ol style="color:rgb(51,51,51);font-family:Arial;font-size:14px;line-height:26px;"> <li>第一次请求:浏览器通过http的header报头,附带Expires,Cache-Control,Last-Modified/Etag向服务器请求,此时服务器记录第一次请求的Last-Modified/Etag                  </li> <li>再次请求:当浏览器再次请求的时候,请求头附带Expires,Cache-Control,If-Modified-Since/Etag向服务器请求</li> <li>服务器根据第一次记录的Last-Modified/Etag和再次请求的If-Modified-Since/Etag做对比,判断是否需要更新<span style="font-size:12px;">,<span style="color:rgb(57,57,57);font-family:verdana, 'ms song', Arial, Helvetica, sans-serif;line-height:24px;">服务器通过这两个头判断本地资源未发生变化,客 户端不需要重新下载,返回304响应。常见流程如下图所示:</span></span></li> </ol> <div style="color:rgb(51,51,51);font-family:Arial;font-size:14px;line-height:26px;"> <span style="font-family:verdana, 'ms song', Arial, Helvetica, sans-serif;font-size:12px;color:rgb(57,57,57);"><span style="line-height:24px;"><br></span></span> </div> <div style="color:rgb(51,51,51);font-family:Arial;font-size:14px;line-height:26px;"> <span style="font-family:verdana, 'ms song', Arial, Helvetica, sans-serif;font-size:12px;color:rgb(57,57,57);"><span style="line-height:24px;"><br></span></span> </div> <p style="color:rgb(51,51,51);font-family:Arial;font-size:14px;line-height:26px;"> <br></p> <h3 style="line-height:26px;font-size:17px;color:rgb(57,57,57);font-family:verdana, 'ms song', Arial, Helvetica, sans-serif;"> <span style="font-size:16px;">与缓存相关的HTTP扩展消息头</span></h3> <p style="color:rgb(51,51,51);font-family:Arial;font-size:14px;line-height:26px;"> </p> <p style="font-size:14px;color:rgb(57,57,57);font-family:verdana, 'ms song', Arial, Helvetica, sans-serif;line-height:21px;"> <span style="font-size:16px;">  </span><span><span style="font-size:12px;">  <span>Expires</span>:设置页面过期时间,格林威治时间GMT</span></span></p> <p style="font-size:14px;color:rgb(57,57,57);font-family:verdana, 'ms song', Arial, Helvetica, sans-serif;line-height:21px;"> <span style="font-size:12px;">    <span>Cache-Control</span>:更细致的控制缓存的内容</span></p> <p style="font-size:14px;color:rgb(57,57,57);font-family:verdana, 'ms song', Arial, Helvetica, sans-serif;line-height:21px;"> <span style="font-size:12px;">    <span>Last-Modified</span>:请求对象最后一次的修改时间 用来判断缓存是否过期 通常由文件的时间信息产生 </span></p> <p style="font-size:14px;color:rgb(57,57,57);font-family:verdana, 'ms song', Arial, Helvetica, sans-serif;line-height:21px;"> <span><span style="font-size:12px;">    <span>ETag</span>:响应中资源的校验值,在服务器上某个时段是唯一标识的。ETag是一个可以 与Web资源关联的记号(token),和Last-Modified功能才不多,也是一个标识符,一般和Last-Modified一起使用,加强服务器判断的准确度。</span></span></p> <p style="font-size:14px;color:rgb(57,57,57);font-family:verdana, 'ms song', Arial, Helvetica, sans-serif;line-height:21px;"> <span><span style="font-size:12px;">    <span>Date</span>:服务器的时间</span></span></p> <p style="font-size:14px;color:rgb(57,57,57);font-family:verdana, 'ms song', Arial, Helvetica, sans-serif;line-height:21px;"> <span><span style="font-size:12px;">    <span>If-Modified-Since</span>:客户端存取的该资源最后一次修改的时间,用来和服务器端的Last-Modified做比较</span></span></p> <p style="font-size:14px;color:rgb(57,57,57);font-family:verdana, 'ms song', Arial, Helvetica, sans-serif;line-height:21px;"> <span><span style="font-size:12px;">    <span>If-None-Match</span>:客户端存取的该资源的检验值,同ETag。</span></span></p> <p style="color:rgb(51,51,51);font-family:Arial;font-size:14px;line-height:26px;"> Cache-Control的主要参数 <br>       Cache-Control: private/public Public 响应会被缓存,并且在多用户间共享。 Private 响应只能够作为私有的缓存,不能再用户间共享。<br>       Cache-Control: no-cache:不进行缓存 <br>       Cache-Control: max-age=x:缓存时间 以秒为单位 <br>       Cache-Control: must-revalidate:如果页面是过期的 则去服务器进行获取。</p> <p style="color:rgb(51,51,51);font-family:Arial;font-size:14px;line-height:26px;">  </p> <h3 style="color:rgb(51,51,51);font-family:Arial;line-height:26px;"> 2、关于图片,css,js,flash的缓存</h3> <p style="color:rgb(51,51,51);font-family:Arial;font-size:14px;line-height:26px;"> 这个主要通过服务器的配置来实现这个技术,如果使用apache服务器的话,可以使用<strong>mod_expires</strong>模块来实现:</p> <p style="color:rgb(51,51,51);font-family:Arial;font-size:14px;line-height:26px;"> <strong>编译mod_expires模块:</strong></p> <p style="color:rgb(51,51,51);font-family:Arial;font-size:14px;line-height:26px;"> Cd  /root/httpd-2.2.3/modules/metadata</p> <p style="color:rgb(51,51,51);font-family:Arial;font-size:14px;line-height:26px;"> /usr/local/apache/bin/apxs -i -a -c mod_expires.c //编译</p> <p style="color:rgb(51,51,51);font-family:Arial;font-size:14px;line-height:26px;"> 编辑httpd.conf配置:添加下面内容</p> <p style="color:rgb(51,51,51);font-family:Arial;font-size:14px;line-height:26px;"> <IfModule mod_expires.c></p> <p style="color:rgb(51,51,51);font-family:Arial;font-size:14px;line-height:26px;"> ExpiresActive on</p> <p style="color:rgb(51,51,51);font-family:Arial;font-size:14px;line-height:26px;"> ExpiresDefault "access plus 1 month"</p> <p style="color:rgb(51,51,51);font-family:Arial;font-size:14px;line-height:26px;"> ExpiresByType text/html "access plus 1 months"</p> <p style="color:rgb(51,51,51);font-family:Arial;font-size:14px;line-height:26px;"> ExpiresByType text/css "access plus 1 months"</p> <p style="color:rgb(51,51,51);font-family:Arial;font-size:14px;line-height:26px;"> ExpiresByType image/gif "access plus 1 months"</p> <p style="color:rgb(51,51,51);font-family:Arial;font-size:14px;line-height:26px;"> ExpiresByType image/jpeg "access plus 1 months"</p> <p style="color:rgb(51,51,51);font-family:Arial;font-size:14px;line-height:26px;"> ExpiresByType image/jpg "access plus 1 months"</p> <p style="color:rgb(51,51,51);font-family:Arial;font-size:14px;line-height:26px;"> ExpiresByType image/png "access plus 1 months"</p> <p style="color:rgb(51,51,51);font-family:Arial;font-size:14px;line-height:26px;"> EXpiresByType application/x-shockwave-flash "access plus 1 months"</p> <p style="color:rgb(51,51,51);font-family:Arial;font-size:14px;line-height:26px;"> EXpiresByType application/x-javascript      "access plus 1 months"</p> <p style="color:rgb(51,51,51);font-family:Arial;font-size:14px;line-height:26px;"> #ExpiresByType video/x-flv "access plus 1 months"</p> <p style="color:rgb(51,51,51);font-family:Arial;font-size:14px;line-height:26px;"> </IfModule></p> <p style="color:rgb(51,51,51);font-family:Arial;font-size:14px;line-height:26px;"> 解释:第一句--开启服务</p> <p style="color:rgb(51,51,51);font-family:Arial;font-size:14px;line-height:26px;"> 第二句--默认时间是一个月</p> <p style="color:rgb(51,51,51);font-family:Arial;font-size:14px;line-height:26px;"> 在下面是关于各种类型的资源的缓存时间设置</p> </div> </div> </div> </div> </div> <!--PC和WAP自适应版--> <div id="SOHUCS" sid="1287638000238374912"></div> <script type="text/javascript" src="/views/front/js/chanyan.js"></script> <!-- 文章页-底部 动态广告位 --> <div class="youdao-fixed-ad" id="detail_ad_bottom"></div> </div> <div class="col-md-3"> <div class="row" id="ad"> <!-- 文章页-右侧1 动态广告位 --> <div id="right-1" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad"> <div class="youdao-fixed-ad" id="detail_ad_1"> </div> </div> <!-- 文章页-右侧2 动态广告位 --> <div id="right-2" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad"> <div class="youdao-fixed-ad" id="detail_ad_2"></div> </div> <!-- 文章页-右侧3 动态广告位 --> <div id="right-3" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad"> <div class="youdao-fixed-ad" id="detail_ad_3"></div> </div> </div> </div> </div> </div> </div> <div class="container"> <h4 class="pt20 mb15 mt0 border-top">你可能感兴趣的:(JAVA)</h4> <div id="paradigm-article-related"> <div class="recommend-post mb30"> <ul class="widget-links"> <li><a href="/article/1950232820773351424.htm" title="移动端城市区县二级联动选择功能实现包" target="_blank">移动端城市区县二级联动选择功能实现包</a> <span class="text-muted">good2know</span> <div>本文还有配套的精品资源,点击获取简介:本项目是一套为移动端设计的jQuery实现方案,用于简化用户在选择城市和区县时的流程。它包括所有必需文件:HTML、JavaScript、CSS及图片资源。通过动态更新下拉菜单选项,实现城市到区县的联动效果,支持数据异步加载。开发者可以轻松集成此功能到移动网站或应用,并可基于需求进行扩展和优化。1.jQuery移动端解决方案概述jQuery技术简介jQuery</div> </li> <li><a href="/article/1950228031117258752.htm" title="深入解析JVM工作原理:从字节码到机器指令的全过程" target="_blank">深入解析JVM工作原理:从字节码到机器指令的全过程</a> <span class="text-muted"></span> <div>一、JVM概述Java虚拟机(JVM)是Java平台的核心组件,它实现了Java"一次编写,到处运行"的理念。JVM是一个抽象的计算机器,它有自己的指令集和运行时内存管理机制。JVM的主要职责:加载:读取.class文件并验证其正确性存储:管理内存分配和垃圾回收执行:解释或编译字节码为机器指令安全:提供沙箱环境限制恶意代码二、JVM架构详解JVM由三个主要子系统组成:1.类加载子系统类加载过程分为</div> </li> <li><a href="/article/1950226517397139456.htm" title="JVM 内存模型深度解析:原子性、可见性与有序性的实现" target="_blank">JVM 内存模型深度解析:原子性、可见性与有序性的实现</a> <span class="text-muted">练习时长两年半的程序员小胡</span> <a class="tag" taget="_blank" href="/search/JVM/1.htm">JVM</a><a class="tag" taget="_blank" href="/search/%E6%B7%B1%E5%BA%A6%E5%89%96%E6%9E%90%EF%BC%9A%E4%BB%8E%E9%9D%A2%E8%AF%95%E8%80%83%E7%82%B9%E5%88%B0%E7%94%9F%E4%BA%A7%E5%AE%9E%E8%B7%B5/1.htm">深度剖析:从面试考点到生产实践</a><a class="tag" taget="_blank" href="/search/jvm/1.htm">jvm</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E5%86%85%E5%AD%98%E6%A8%A1%E5%9E%8B/1.htm">内存模型</a> <div>在了解了JVM的基础架构和类加载机制后,我们需要进一步探索Java程序在多线程环境下的内存交互规则。JVM内存模型(JavaMemoryModel,JMM)定义了线程和主内存之间的抽象关系,它通过规范共享变量的访问方式,解决了多线程并发时的数据一致性问题。本文将从内存模型的核心目标出发,详解原子性、可见性、有序性的实现机制,以及volatile、synchronized等关键字在其中的作用。一、J</div> </li> <li><a href="/article/1950225785054883840.htm" title="Java | 多线程经典问题 - 售票" target="_blank">Java | 多线程经典问题 - 售票</a> <span class="text-muted">Ada54</span> <div>一、售票需求1)同一个票池2)多个窗口卖票,不能出售同一张票二、售票问题代码实现(线程与进程小总结,请戳:Java|线程和进程,创建线程)step1:定义SaleWindow类实现Runnable接口,覆盖run方法step2:实例化SaleWindow对象,创建Thread对象,将SaleWindow作为参数传给Thread类的构造函数,然后通过Thread.start()方法启动线程step3</div> </li> <li><a href="/article/1950225381961297920.htm" title="SpringMVC的执行流程" target="_blank">SpringMVC的执行流程</a> <span class="text-muted"></span> <div>1、什么是MVCMVC是一种设计模式。MVC的原理图如下所示M-Model模型(完成业务逻辑:有javaBean构成,service+dao+entity)V-View视图(做界面的展示jsp,html……)C-Controller控制器(接收请求—>调用模型—>根据结果派发页面2、SpringMVC是什么SpringMVC是一个MVC的开源框架,SpringMVC=Struts2+Spring,</div> </li> <li><a href="/article/1950224616647618560.htm" title="JAVA接口机结构解析" target="_blank">JAVA接口机结构解析</a> <span class="text-muted">秃狼</span> <a class="tag" taget="_blank" href="/search/SpringBoot/1.htm">SpringBoot</a><a class="tag" taget="_blank" href="/search/%E5%85%AB%E8%82%A1%E6%96%87/1.htm">八股文</a><a class="tag" taget="_blank" href="/search/Java/1.htm">Java</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0/1.htm">学习</a> <div>什么是接口机在Java项目中,接口机通常指用于与外部系统进行数据交互的中间层,负责处理请求和响应的转换、协议适配、数据格式转换等任务。接口机的结构我们的接口机的结构分为两个大部分,外部接口机和内部接口机,在业务的调度上也是通过mq来实现的,只要的目的就是为了解耦合和做差异化。在接口机中主要的方法就是定时任务,消息的发送和消费,其他平台调用接口机只能提供外部接口机的方法进行调用,外部接口机可以提供消</div> </li> <li><a href="/article/1950223497875746816.htm" title="最新阿里四面面试真题46道:面试技巧+核心问题+面试心得" target="_blank">最新阿里四面面试真题46道:面试技巧+核心问题+面试心得</a> <span class="text-muted">风平浪静如码</span> <div>前言做技术的有一种资历,叫做通过了阿里的面试。这些阿里Java相关问题,都是之前通过不断优秀人才的铺垫总结的,先自己弄懂了再去阿里面试,不然就是去丢脸,被虐。希望对大家帮助,祝面试成功,有个更好的职业规划。一,阿里常见技术面1、微信红包怎么实现。2、海量数据分析。3、测试职位问的线程安全和非线程安全。4、HTTP2.0、thrift。5、面试电话沟通可能先让自我介绍。6、分布式事务一致性。7、ni</div> </li> <li><a href="/article/1950218946015719424.htm" title="图论算法经典题目解析:DFS、BFS与拓扑排序实战" target="_blank">图论算法经典题目解析:DFS、BFS与拓扑排序实战</a> <span class="text-muted">周童學</span> <a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E4%B8%8E%E7%AE%97%E6%B3%95/1.htm">数据结构与算法</a><a class="tag" taget="_blank" href="/search/%E6%B7%B1%E5%BA%A6%E4%BC%98%E5%85%88/1.htm">深度优先</a><a class="tag" taget="_blank" href="/search/%E7%AE%97%E6%B3%95/1.htm">算法</a><a class="tag" taget="_blank" href="/search/%E5%9B%BE%E8%AE%BA/1.htm">图论</a> <div>图论算法经典题目解析:DFS、BFS与拓扑排序实战图论问题是算法面试中的高频考点,本博客将通过四道LeetCode经典题目(均来自"Top100Liked"题库),深入讲解图论的核心算法思想和实现技巧。涵盖DFS、BFS、拓扑排序和前缀树等知识点,每道题配有Java实现和易错点分析。1.岛屿数量(DFS遍历)问题描述给定一个由'1'(陆地)和'0'(水)组成的二维网格,计算岛屿的数量。岛屿由水平或</div> </li> <li><a href="/article/1950218818781507584.htm" title="【异常】使用 LiteFlow 框架时,提示错误ChainDuplicateException: [chain name duplicate] chainName=categoryChallenge" target="_blank">【异常】使用 LiteFlow 框架时,提示错误ChainDuplicateException: [chain name duplicate] chainName=categoryChallenge</a> <span class="text-muted">本本本添哥</span> <a class="tag" taget="_blank" href="/search/002/1.htm">002</a><a class="tag" taget="_blank" href="/search/-/1.htm">-</a><a class="tag" taget="_blank" href="/search/%E8%BF%9B%E9%98%B6%E5%BC%80%E5%8F%91%E8%83%BD%E5%8A%9B/1.htm">进阶开发能力</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a> <div>一、报错内容Causedby:com.yomahub.liteflow.exception.ChainDuplicateException:[chainnameduplicate]chainName=categoryChallengeatcom.yomahub.liteflow.parser.helper.ParserHelper.lambda$null$0(ParserHelper.java:1</div> </li> <li><a href="/article/1950218314064130048.htm" title="Java并发核心:线程池使用技巧与最佳实践! | 多线程篇(五)" target="_blank">Java并发核心:线程池使用技巧与最佳实践! | 多线程篇(五)</a> <span class="text-muted">bug菌¹</span> <a class="tag" taget="_blank" href="/search/Java%E5%AE%9E%E6%88%98%28%E8%BF%9B%E9%98%B6%E7%89%88%29/1.htm">Java实战(进阶版)</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/Java%E9%9B%B6%E5%9F%BA%E7%A1%80%E5%85%A5%E9%97%A8/1.htm">Java零基础入门</a><a class="tag" taget="_blank" href="/search/Java%E5%B9%B6%E5%8F%91/1.htm">Java并发</a><a class="tag" taget="_blank" href="/search/%E7%BA%BF%E7%A8%8B%E6%B1%A0/1.htm">线程池</a><a class="tag" taget="_blank" href="/search/%E5%A4%9A%E7%BA%BF%E7%A8%8B%E7%AF%87/1.htm">多线程篇</a> <div>本文收录于「Java进阶实战」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!环境说明:Windows10+IntelliJIDEA2021.3.2+Jdk1.8本文目录前言摘要正文何为线程池?为什么需要线程池?线程池的好处线程池使用场景如何创建线程池?线程池的常见配置源码解析案例分享案例代码演示案例运行</div> </li> <li><a href="/article/1950217936077647872.htm" title="Java 队列" target="_blank">Java 队列</a> <span class="text-muted">tryxr</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a><a class="tag" taget="_blank" href="/search/%E9%98%9F%E5%88%97/1.htm">队列</a> <div>队列一般用什么哪种结构实现队列的特性数据入队列时一定是从尾部插入吗数据出队列时一定是从头部删除吗队列的基本运算有什么队列支持随机访问吗队列的英文表示什么是队列队列从哪进、从哪出队列的进出顺序队列是用哪种结构实现的Queue和Deque有什么区别Queue接口的方法Queue中的add与offer的区别offer、poll、peek的模拟实现如何利用链表实现队列如何利用顺序表实现队列什么叫做双端队列</div> </li> <li><a href="/article/1950215540215705600.htm" title="JVM 内存分配与回收策略:从对象创建到内存释放的全流程" target="_blank">JVM 内存分配与回收策略:从对象创建到内存释放的全流程</a> <span class="text-muted"></span> <div>在JVM的运行机制中,内存分配与回收策略是连接对象生命周期与垃圾收集器的桥梁。它决定了对象在堆内存中的创建位置、存活过程中的区域迁移,以及最终被回收的时机。合理的内存分配策略能减少GC频率、降低停顿时间,是优化Java应用性能的核心环节。本文将系统解析JVM的内存分配规则、对象晋升机制,以及实战中的内存优化技巧。一、对象优先在Eden区分配:新生代的“临时缓冲区”大多数情况下,Java对象在新生代</div> </li> <li><a href="/article/1950214657335685120.htm" title="代码随想录算法训练营第三十五天" target="_blank">代码随想录算法训练营第三十五天</a> <span class="text-muted"></span> <div>01背包问题二维题目链接01背包问题二维题解importjava.util.Scanner;publicclassMain{publicstaticvoidmain(String[]args){Scannersc=newScanner(System.in);intM=sc.nextInt();intN=sc.nextInt();int[]space=newint[M];int[]value=new</div> </li> <li><a href="/article/1950207097413103616.htm" title="微信公众号回调java_处理微信公众号消息回调" target="_blank">微信公众号回调java_处理微信公众号消息回调</a> <span class="text-muted">weixin_39607620</span> <a class="tag" taget="_blank" href="/search/%E5%BE%AE%E4%BF%A1%E5%85%AC%E4%BC%97%E5%8F%B7%E5%9B%9E%E8%B0%83java/1.htm">微信公众号回调java</a> <div>1、背景在上一节中,咱们知道如何接入微信公众号,可是以后公众号会与咱们进行交互,那么微信公众号如何通知到咱们本身的服务器呢?咱们知道咱们接入的时候提供的url是GET/mp/entry,那么公众号以后产生的事件将会以POST/mp/entry发送到咱们本身的服务器上。html2、代码实现,此处仍是使用weixin-java-mp这个框架实现一、引入weixin-java-mpcom.github.</div> </li> <li><a href="/article/1950200667587014656.htm" title="学C++的五大惊人好处" target="_blank">学C++的五大惊人好处</a> <span class="text-muted"></span> <div>为什么要学c++学c++有什么用学习c++的好处有1.中考可以加分2.高考可能直接录取3.就业广且工资高4.在未来30--50年c++一定是一个很受欢迎的职业5.c++成功的例子deepsick等AI智能C++语言兼备编程效率和编译运行效率的语言C++语言是C语言功能增强版,在c语言的基础上添加了面向对象编程和泛型编程的支持既继承了C语言高效,简洁,快速和可移植的传统,又具备类似Java、Go等其</div> </li> <li><a href="/article/1950198522972270592.htm" title="Java8 Stream流的sorted()的排序【正序、倒序、多字段排序】" target="_blank">Java8 Stream流的sorted()的排序【正序、倒序、多字段排序】</a> <span class="text-muted">Tony666688888</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/windows/1.htm">windows</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a> <div>针对集合排序,java8可以用Stream流的sorted()进行排序。示例Bean以下我们会使用这个Bean来做示例。publicclassOrder{privateStringweight;privateDoubleprice;privateStringdateStr;//忽略getter、setter、构造方法、toString}字段排序首先是比较器Comparator,形式如下:Compa</div> </li> <li><a href="/article/1950194742100815872.htm" title="用代码生成艺术字:设计个性化海报的秘密" target="_blank">用代码生成艺术字:设计个性化海报的秘密</a> <span class="text-muted"></span> <div>本文围绕“用代码生成艺术字:设计个性化海报的秘密”展开,先概述代码生成艺术字在海报设计中的独特价值,接着介绍常用的代码工具(如HTML、CSS、JavaScript等),详细阐述从构思到实现的完整流程,包括字体样式设计、动态效果添加等,还分享了提升艺术字质感的技巧及实际案例。最后总结代码生成艺术字的优势,为设计师提供打造个性化海报的实用指南,助力提升海报设计的独特性与吸引力,符合搜索引擎SEO标准</div> </li> <li><a href="/article/1950194728943284224.htm" title="java实习生40多天有感" target="_blank">java实习生40多天有感</a> <span class="text-muted">别拿爱情当饭吃</span> <div>从5月15日开始,我开始第一步步入社会,我今年大三,在一家上市互联网公司做一名实习生,主要做java后端开发。开始的时候,觉得公司的环境挺不错的,不过因为公司在CBD,所以隔壁的午饭和晚饭都要20+RMB,而且还吃不饱,这让我感觉挺郁闷的。一到下午,我就会犯困(因为饿)。因此,我又不得不买一些干粮在公司屯着。关于技术,有一个比较大的项目在需求调研当中,我们做实习生,就是辅助项目经理,测试功能,并且</div> </li> <li><a href="/article/1950183016382918656.htm" title="大学生入门:初识方法及其易踩坑的点" target="_blank">大学生入门:初识方法及其易踩坑的点</a> <span class="text-muted"></span> <div>在java学习过程中,我们不难发现有很多重复使用的功能代码块,每次使用如果都要重新写一遍,岂不是很麻烦,就算是“cv”大法,感觉也不是很方便,那么,有什么办法可以解决这个问题呢?方法!java中,一段可重用的,用于执行特定功能的代码块叫做方法,它可以接收参数、返回结果,并且可以被多次使用。一、方法的基本结构[修饰符]返回值类型方法名([参数列表])[throws异常类型]{//方法体}[throw</div> </li> <li><a href="/article/1950181126731526144.htm" title="[Ljava.lang.Object; cannot be cast to [Ljava.lang.String;" target="_blank">[Ljava.lang.Object; cannot be cast to [Ljava.lang.String;</a> <span class="text-muted">这些不会的</span> <div>解释:这个错误是很常见的错误,错误的提示已经很清楚了就是java的Object数组不能转换成为String[]数组,这就说明你要转换的数组它本身是Object类型的数组,但是你却非要把它转换为String类的数组,这当然是错误的。示例:[java]viewplaincopypackagecom.dada;importjava.util.ArrayList;importjava.util.List;</div> </li> <li><a href="/article/1950180118609588224.htm" title="HikariCP调试日志深度解析:生产环境故障排查完全指南" target="_blank">HikariCP调试日志深度解析:生产环境故障排查完全指南</a> <span class="text-muted"></span> <div>HikariCP调试日志深度解析:生产环境故障排查完全指南更新时间:2025年7月4日|作者:资深架构师|适用版本:HikariCP5.x+|难度等级:中高级前言在生产环境中,数据库连接池往往是系统性能的关键瓶颈。HikariCP作为当前最流行的Java连接池,其调试日志包含了丰富的运行时信息,能够帮助我们快速定位和解决各种连接池相关问题。本文将深入解析HikariCP的日志体系,提供一套完整的故</div> </li> <li><a href="/article/1950179866523529216.htm" title="大学社团管理系统(11831)" target="_blank">大学社团管理系统(11831)</a> <span class="text-muted">codercode2022</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/boot/1.htm">boot</a><a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/echarts/1.htm">echarts</a><a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/cloud/1.htm">cloud</a><a class="tag" taget="_blank" href="/search/sentinel/1.htm">sentinel</a><a class="tag" taget="_blank" href="/search/java-rocketmq/1.htm">java-rocketmq</a> <div>有需要的同学,源代码和配套文档领取,加文章最下方的名片哦一、项目演示项目演示视频二、资料介绍完整源代码(前后端源代码+SQL脚本)配套文档(LW+PPT+开题报告)远程调试控屏包运行三、技术介绍Java语言SSM框架SpringBoot框架Vue框架JSP页面Mysql数据库IDEA/Eclipse开发四、项目截图有需要的同学,源代码和配套文档领取,加文章最下方的名片哦!</div> </li> <li><a href="/article/1950178809030438912.htm" title="今年校招竞争真激烈" target="_blank">今年校招竞争真激烈</a> <span class="text-muted">12_05</span> <div>程序员满大街,都要找不到工作了。即使人工智能满大街,我也后悔当初没学机器学习,后悔当初没学Java。C++真难找工作。难道毕了业就失业吗?好担心!</div> </li> <li><a href="/article/1950177847956008960.htm" title="【免费下载】 Aspose for Java:解锁无水印、无限制的文档处理能力" target="_blank">【免费下载】 Aspose for Java:解锁无水印、无限制的文档处理能力</a> <span class="text-muted">房征劲Kendall</span> <div>AsposeforJava:解锁无水印、无限制的文档处理能力【下载地址】AsposeforJava-去除水印和数量限制AsposeforJava-去除水印和数量限制Aspose是一个著名的文档处理库,专为Java应用程序设计,支持多种文档格式的操作,如Word、Excel、PDF等项目地址:https://gitcode.com/open-source-toolkit/56c82项目介绍在现代企业</div> </li> <li><a href="/article/1950177721669709824.htm" title="微服务日志追踪,Skywalking接入TraceId功能" target="_blank">微服务日志追踪,Skywalking接入TraceId功能</a> <span class="text-muted">Victor刘</span> <a class="tag" taget="_blank" href="/search/%E5%BE%AE%E6%9C%8D%E5%8A%A1/1.htm">微服务</a><a class="tag" taget="_blank" href="/search/skywalking/1.htm">skywalking</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a> <div>文章目录一、借助skywalking追加traceIdlogbacklog4j2效果二、让skywalking显示日志内容版本差异logback配置文件log4j2配置文件一、借助skywalking追加traceId背景:在微服务或多副本中难以观察一个链路的日志,需要通过唯一traceId标识来查找,下面介绍Skywalking-traceId在Java中的配置方法。介绍两种java日志的配置方</div> </li> <li><a href="/article/1950169524384886784.htm" title="【Java Web实战】从零到一打造企业级网上购书网站系统 | 完整开发实录(三)" target="_blank">【Java Web实战】从零到一打造企业级网上购书网站系统 | 完整开发实录(三)</a> <span class="text-muted">笙囧同学</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/%E7%8A%B6%E6%80%81%E6%A8%A1%E5%BC%8F/1.htm">状态模式</a> <div>核心功能设计用户管理系统用户管理是整个系统的基础,我设计了完整的用户生命周期管理:用户注册流程验证失败验证通过验证失败验证通过用户名已存在用户名可用失败成功用户访问注册页面填写注册信息前端表单验证显示错误提示提交到后端后端数据验证返回错误信息用户名唯一性检查提示用户名重复密码加密处理保存用户信息保存成功?显示系统错误注册成功跳转登录页面登录认证机制深度解析我实现了一套企业级的多层次安全认证机制:认</div> </li> <li><a href="/article/1950160194403102720.htm" title="Java:数据结构-ArrayList和顺序表(2)" target="_blank">Java:数据结构-ArrayList和顺序表(2)</a> <span class="text-muted">blammmp</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/1.htm">数据结构</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a> <div>一ArrayList的使用1.ArrayList的构造方法第一种(指定容量的构造方法)创建一个空的ArrayList,指定容量为initialCapacity。publicArrayList(intinitialCapacity){if(initialCapacity>0){this.elementData=newObject[initialCapacity];}elseif(initialCap</div> </li> <li><a href="/article/1950155533302427648.htm" title="CMS垃圾回收器和G1垃圾回收器区别_g1cms垃圾回收器区别" target="_blank">CMS垃圾回收器和G1垃圾回收器区别_g1cms垃圾回收器区别</a> <span class="text-muted">2401_89191885</span> <a class="tag" taget="_blank" href="/search/jvm/1.htm">jvm</a> <div>该类所有的实例都已经被回收,也就是Java堆中不存在该类的任何实例;加载该类的ClassLoader已经被回收;该类对应的java.lang.Class对象没有在任何地方被引用,无法在任何地方通过反射访问该类的方法。3.常见的垃圾回收算法1、Mark-Sweep(标记-清除算法):(1)思想:标记清除算法分为两个阶段,标记阶段和清除阶段。标记阶段任务是标记出所有需要回收的对象,清除阶段就是清除被标</div> </li> <li><a href="/article/1950154524572315648.htm" title="每日面试题15:如何解决堆溢出?" target="_blank">每日面试题15:如何解决堆溢出?</a> <span class="text-muted">℡余晖^</span> <a class="tag" taget="_blank" href="/search/%E6%AF%8F%E6%97%A5%E9%9D%A2%E8%AF%95%E9%A2%98/1.htm">每日面试题</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a> <div>在Java应用运行过程中,"java.lang.OutOfMemoryError:Javaheapspace"是最常见的错误之一。无论是高并发的电商大促场景,还是持续运行的后台服务,堆内存溢出都可能导致服务不可用、数据丢失,甚至引发系统崩溃。本文将结合实际排查经验,系统讲解堆溢出的底层逻辑、应急处理流程及长效预防策略。一、堆溢出的本质:内存分配的"收支失衡"Java堆是JVM管理的内存区域,用于存</div> </li> <li><a href="/article/1950153513166237696.htm" title="记录自己第n次面试(n>3)" target="_blank">记录自己第n次面试(n>3)</a> <span class="text-muted">Warren98</span> <a class="tag" taget="_blank" href="/search/Java/1.htm">Java</a><a class="tag" taget="_blank" href="/search/%E9%9D%A2%E8%AF%95/1.htm">面试</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E8%81%8C%E5%9C%BA%E5%92%8C%E5%8F%91%E5%B1%95/1.htm">职场和发展</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a><a class="tag" taget="_blank" href="/search/%E6%9C%8D%E5%8A%A1%E5%99%A8/1.htm">服务器</a><a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a> <div>1.Spring Boot可执行JAR的内存分配答:“在Spring Boot可执行JAR中,JVM的内存通常分为两大块:堆(Heap)和栈(Stack)。堆内存:存放对象实例和数组,通过-Xms(初始)和-Xmx(最大)控制。比如java-Xms512m-Xmx1024m-jarapp.jar,表示启动时给512 MB堆,最大可以到1 024 MB。栈内存:每个线程有独立的栈帧,用来保存方法调用</div> </li> <li><a href="/article/43.htm" title="集合框架" target="_blank">集合框架</a> <span class="text-muted">天子之骄</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/1.htm">数据结构</a><a class="tag" taget="_blank" href="/search/%E9%9B%86%E5%90%88%E6%A1%86%E6%9E%B6/1.htm">集合框架</a> <div>   集合框架 集合框架可以理解为一个容器,该容器主要指映射(map)、集合(set)、数组(array)和列表(list)等抽象数据结构。 从本质上来说,Java集合框架的主要组成是用来操作对象的接口。不同接口描述不同的数据类型。   简单介绍:   Collection接口是最基本的接口,它定义了List和Set,List又定义了LinkLi</div> </li> <li><a href="/article/170.htm" title="Table Driven(表驱动)方法实例" target="_blank">Table Driven(表驱动)方法实例</a> <span class="text-muted">bijian1013</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/enum/1.htm">enum</a><a class="tag" taget="_blank" href="/search/Table+Driven/1.htm">Table Driven</a><a class="tag" taget="_blank" href="/search/%E8%A1%A8%E9%A9%B1%E5%8A%A8/1.htm">表驱动</a> <div>实例一: /** * 驾驶人年龄段 * 保险行业,会对驾驶人的年龄做年龄段的区分判断 * 驾驶人年龄段:01-[18,25);02-[25,30);03-[30-35);04-[35,40);05-[40,45);06-[45,50);07-[50-55);08-[55,+∞) */ public class AgePeriodTest { //if...el</div> </li> <li><a href="/article/297.htm" title="Jquery 总结" target="_blank">Jquery 总结</a> <span class="text-muted">cuishikuan</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/jquery/1.htm">jquery</a><a class="tag" taget="_blank" href="/search/Ajax/1.htm">Ajax</a><a class="tag" taget="_blank" href="/search/Web/1.htm">Web</a><a class="tag" taget="_blank" href="/search/jquery%E6%96%B9%E6%B3%95/1.htm">jquery方法</a> <div>1.$.trim方法用于移除字符串头部和尾部多余的空格。如:$.trim('   Hello   ') // Hello2.$.contains方法返回一个布尔值,表示某个DOM元素(第二个参数)是否为另一个DOM元素(第一个参数)的下级元素。如:$.contains(document.documentElement, document.body); 3.$</div> </li> <li><a href="/article/424.htm" title="面向对象概念的提出" target="_blank">面向对象概念的提出</a> <span class="text-muted">麦田的设计者</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1/1.htm">面向对象</a><a class="tag" taget="_blank" href="/search/%E9%9D%A2%E5%90%91%E8%BF%87%E7%A8%8B/1.htm">面向过程</a> <div>        面向对象中,一切都是由对象展开的,组织代码,封装数据。   在台湾面向对象被翻译为了面向物件编程,这充分说明了,这种编程强调实体。       下面就结合编程语言的发展史,聊一聊面向过程和面向对象。      c语言由贝尔实</div> </li> <li><a href="/article/551.htm" title="linux网口绑定" target="_blank">linux网口绑定</a> <span class="text-muted">被触发</span> <a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a> <div>刚在一台IBM Xserver服务器上装了RedHat Linux Enterprise AS 4,为了提高网络的可靠性配置双网卡绑定。 一、环境描述 我的RedHat Linux Enterprise AS 4安装双口的Intel千兆网卡,通过ifconfig -a命令看到eth0和eth1两张网卡。 二、双网卡绑定步骤: 2.1 修改/etc/sysconfig/network</div> </li> <li><a href="/article/678.htm" title="XML基础语法" target="_blank">XML基础语法</a> <span class="text-muted">肆无忌惮_</span> <a class="tag" taget="_blank" href="/search/xml/1.htm">xml</a> <div>一、什么是XML? XML全称是Extensible Markup Language,可扩展标记语言。很类似HTML。XML的目的是传输数据而非显示数据。XML的标签没有被预定义,你需要自行定义标签。XML被设计为具有自我描述性。是W3C的推荐标准。   二、为什么学习XML? 用来解决程序间数据传输的格式问题 做配置文件 充当小型数据库   三、XML与HTM</div> </li> <li><a href="/article/805.htm" title="为网页添加自己喜欢的字体" target="_blank">为网页添加自己喜欢的字体</a> <span class="text-muted">知了ing</span> <a class="tag" taget="_blank" href="/search/%E5%AD%97%E4%BD%93+%E7%A7%92%E8%A1%A8+css/1.htm">字体 秒表 css</a> <div>@font-face { font-family: miaobiao;//定义字体名字 font-style: normal; font-weight: 400; src: url('font/DS-DIGI-e.eot');//字体文件 } 使用: <label style="font-size:18px;font-famil</div> </li> <li><a href="/article/932.htm" title="redis范围查询应用-查找IP所在城市" target="_blank">redis范围查询应用-查找IP所在城市</a> <span class="text-muted">矮蛋蛋</span> <a class="tag" taget="_blank" href="/search/redis/1.htm">redis</a> <div>原文地址: http://www.tuicool.com/articles/BrURbqV 需求 根据IP找到对应的城市 原来的解决方案 oracle表(ip_country): 查询IP对应的城市: 1.把a.b.c.d这样格式的IP转为一个数字,例如为把210.21.224.34转为3524648994 2. select city from ip_</div> </li> <li><a href="/article/1059.htm" title="输入两个整数, 计算百分比" target="_blank">输入两个整数, 计算百分比</a> <span class="text-muted">alleni123</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a> <div> public static String getPercent(int x, int total){ double result=(x*1.0)/(total*1.0); System.out.println(result); DecimalFormat df1=new DecimalFormat("0.0000%"); </div> </li> <li><a href="/article/1186.htm" title="百合——————>怎么学习计算机语言" target="_blank">百合——————>怎么学习计算机语言</a> <span class="text-muted">百合不是茶</span> <a class="tag" taget="_blank" href="/search/java+%E7%A7%BB%E5%8A%A8%E5%BC%80%E5%8F%91/1.htm">java 移动开发</a> <div>    对于一个从没有接触过计算机语言的人来说,一上来就学面向对象,就算是心里上面接受的了,灵魂我觉得也应该是跟不上的,学不好是很正常的现象,计算机语言老师讲的再多,你在课堂上面跟着老师听的再多,我觉得你应该还是学不会的,最主要的原因是你根本没有想过该怎么来学习计算机编程语言,记得大一的时候金山网络公司在湖大招聘我们学校一个才来大学几天的被金山网络录取,一个刚到大学的就能够去和</div> </li> <li><a href="/article/1313.htm" title="linux下tomcat开机自启动" target="_blank">linux下tomcat开机自启动</a> <span class="text-muted">bijian1013</span> <a class="tag" taget="_blank" href="/search/tomcat/1.htm">tomcat</a> <div>方法一: 修改Tomcat/bin/startup.sh 为: export JAVA_HOME=/home/java1.6.0_27 export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar:. export PATH=$JAVA_HOME/bin:$PATH export CATALINA_H</div> </li> <li><a href="/article/1440.htm" title="spring aop实例" target="_blank">spring aop实例</a> <span class="text-muted">bijian1013</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/AOP/1.htm">AOP</a> <div>1.AdviceMethods.java package com.bijian.study.spring.aop.schema; public class AdviceMethods { public void preGreeting() { System.out.println("--how are you!--"); } } 2.beans.x</div> </li> <li><a href="/article/1567.htm" title="[Gson八]GsonBuilder序列化和反序列化选项enableComplexMapKeySerialization" target="_blank">[Gson八]GsonBuilder序列化和反序列化选项enableComplexMapKeySerialization</a> <span class="text-muted">bit1129</span> <a class="tag" taget="_blank" href="/search/serialization/1.htm">serialization</a> <div>enableComplexMapKeySerialization配置项的含义  Gson在序列化Map时,默认情况下,是调用Key的toString方法得到它的JSON字符串的Key,对于简单类型和字符串类型,这没有问题,但是对于复杂数据对象,如果对象没有覆写toString方法,那么默认的toString方法将得到这个对象的Hash地址。   GsonBuilder用于</div> </li> <li><a href="/article/1694.htm" title="【Spark九十一】Spark Streaming整合Kafka一些值得关注的问题" target="_blank">【Spark九十一】Spark Streaming整合Kafka一些值得关注的问题</a> <span class="text-muted">bit1129</span> <a class="tag" taget="_blank" href="/search/Stream/1.htm">Stream</a> <div>包括Spark Streaming在内的实时计算数据可靠性指的是三种级别: 1. At most once,数据最多只能接受一次,有可能接收不到 2. At least once, 数据至少接受一次,有可能重复接收 3. Exactly once  数据保证被处理并且只被处理一次,   具体的多读几遍http://spark.apache.org/docs/lates</div> </li> <li><a href="/article/1821.htm" title="shell脚本批量检测端口是否被占用脚本" target="_blank">shell脚本批量检测端口是否被占用脚本</a> <span class="text-muted">ronin47</span> <div>#!/bin/bash cat ports |while read line do#nc -z -w 10 $line nc -z -w 2 $line 58422>/dev/null2>&1if[ $?-eq 0]then echo $line:ok else echo $line:fail fi done 这里的ports 既可以是文件</div> </li> <li><a href="/article/1948.htm" title="java-2.设计包含min函数的栈" target="_blank">java-2.设计包含min函数的栈</a> <span class="text-muted">bylijinnan</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a> <div>具体思路参见:http://zhedahht.blog.163.com/blog/static/25411174200712895228171/ import java.util.ArrayList; import java.util.List; public class MinStack { //maybe we can use origin array rathe</div> </li> <li><a href="/article/2075.htm" title="Netty源码学习-ChannelHandler" target="_blank">Netty源码学习-ChannelHandler</a> <span class="text-muted">bylijinnan</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/netty/1.htm">netty</a> <div> 一般来说,“有状态”的ChannelHandler不应该是“共享”的,“无状态”的ChannelHandler则可“共享” 例如ObjectEncoder是“共享”的, 但 ObjectDecoder 不是 因为每一次调用decode方法时,可能数据未接收完全(incomplete), 它与上一次decode时接收到的数据“累计”起来才有可能是完整的数据,是“有状态”的 p</div> </li> <li><a href="/article/2202.htm" title="java生成随机数" target="_blank">java生成随机数</a> <span class="text-muted">cngolon</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a> <div>方法一: /** * 生成随机数 * @author cngolon@126.com * @return */ public synchronized static String getChargeSequenceNum(String pre){ StringBuffer sequenceNum = new StringBuffer(); Date dateTime = new D</div> </li> <li><a href="/article/2329.htm" title="POI读写海量数据" target="_blank">POI读写海量数据</a> <span class="text-muted">ctrain</span> <a class="tag" taget="_blank" href="/search/%E6%B5%B7%E9%87%8F%E6%95%B0%E6%8D%AE/1.htm">海量数据</a> <div>import java.io.FileOutputStream; import java.io.OutputStream; import org.apache.poi.xssf.streaming.SXSSFRow; import org.apache.poi.xssf.streaming.SXSSFSheet; import org.apache.poi.xssf.streaming</div> </li> <li><a href="/article/2456.htm" title="mysql 日期格式化date_format详细使用" target="_blank">mysql 日期格式化date_format详细使用</a> <span class="text-muted">daizj</span> <a class="tag" taget="_blank" href="/search/mysql/1.htm">mysql</a><a class="tag" taget="_blank" href="/search/date_format/1.htm">date_format</a><a class="tag" taget="_blank" href="/search/%E6%97%A5%E6%9C%9F%E6%A0%BC%E5%BC%8F%E8%BD%AC%E6%8D%A2/1.htm">日期格式转换</a><a class="tag" taget="_blank" href="/search/%E6%97%A5%E6%9C%9F%E6%A0%BC%E5%BC%8F%E5%8C%96/1.htm">日期格式化</a> <div> 日期转换函数的详细使用说明  DATE_FORMAT(date,format) Formats the date value according to the format string. The following specifiers may be used in the format string. The&n</div> </li> <li><a href="/article/2583.htm" title="一个程序员分享8年的开发经验" target="_blank">一个程序员分享8年的开发经验</a> <span class="text-muted">dcj3sjt126com</span> <a class="tag" taget="_blank" href="/search/%E7%A8%8B%E5%BA%8F%E5%91%98/1.htm">程序员</a> <div>  在中国有很多人都认为IT行为是吃青春饭的,如果过了30岁就很难有机会再发展下去!其实现实并不是这样子的,在下从事.NET及JAVA方面的开发的也有8年的时间了,在这里在下想凭借自己的亲身经历,与大家一起探讨一下。 明确入行的目的 很多人干IT这一行都冲着“收入高”这一点的,因为只要学会一点HTML, DIV+CSS,要做一个页面开发人员并不是一件难事,而且做一个页面开发人员更容</div> </li> <li><a href="/article/2710.htm" title="android欢迎界面淡入淡出效果" target="_blank">android欢迎界面淡入淡出效果</a> <span class="text-muted">dcj3sjt126com</span> <a class="tag" taget="_blank" href="/search/android/1.htm">android</a> <div>很多Android应用一开始都会有一个欢迎界面,淡入淡出效果也是用得非常多的,下面来实现一下。 主要代码如下: package com.myaibang.activity; import android.app.Activity;import android.content.Intent;import android.os.Bundle;import android.os.CountDown</div> </li> <li><a href="/article/2837.htm" title="linux 复习笔记之常见压缩命令" target="_blank">linux 复习笔记之常见压缩命令</a> <span class="text-muted">eksliang</span> <a class="tag" taget="_blank" href="/search/tar%E8%A7%A3%E5%8E%8B/1.htm">tar解压</a><a class="tag" taget="_blank" href="/search/linux%E7%B3%BB%E7%BB%9F%E5%B8%B8%E8%A7%81%E5%8E%8B%E7%BC%A9%E5%91%BD%E4%BB%A4/1.htm">linux系统常见压缩命令</a><a class="tag" taget="_blank" href="/search/linux%E5%8E%8B%E7%BC%A9%E5%91%BD%E4%BB%A4/1.htm">linux压缩命令</a><a class="tag" taget="_blank" href="/search/tar%E5%8E%8B%E7%BC%A9/1.htm">tar压缩</a> <div>转载请出自出处:http://eksliang.iteye.com/blog/2109693 linux中常见压缩文件的拓展名 *.gz gzip程序压缩的文件 *.bz2 bzip程序压缩的文件 *.tar tar程序打包的数据,没有经过压缩 *.tar.gz tar程序打包后,并经过gzip程序压缩 *.tar.bz2 tar程序打包后,并经过bzip程序压缩 *.zi</div> </li> <li><a href="/article/2964.htm" title="Android 应用程序发送shell命令" target="_blank">Android 应用程序发送shell命令</a> <span class="text-muted">gqdy365</span> <a class="tag" taget="_blank" href="/search/android/1.htm">android</a> <div>项目中需要直接在APP中通过发送shell指令来控制lcd灯,其实按理说应该是方案公司在调好lcd灯驱动之后直接通过service送接口上来给APP,APP调用就可以控制了,这是正规流程,但我们项目的方案商用的mtk方案,方案公司又没人会改,只调好了驱动,让应用程序自己实现灯的控制,这不蛋疼嘛!!!! 发就发吧! 一、关于shell指令: 我们知道,shell指令是Linux里面带的</div> </li> <li><a href="/article/3091.htm" title="java 无损读取文本文件" target="_blank">java 无损读取文本文件</a> <span class="text-muted">hw1287789687</span> <a class="tag" taget="_blank" href="/search/%E8%AF%BB%E5%8F%96%E6%96%87%E4%BB%B6/1.htm">读取文件</a><a class="tag" taget="_blank" href="/search/%E6%97%A0%E6%8D%9F%E8%AF%BB%E5%8F%96/1.htm">无损读取</a><a class="tag" taget="_blank" href="/search/%E8%AF%BB%E5%8F%96%E6%96%87%E6%9C%AC%E6%96%87%E4%BB%B6/1.htm">读取文本文件</a><a class="tag" taget="_blank" href="/search/charset/1.htm">charset</a> <div>java 如何无损读取文本文件呢? 以下是有损的 @Deprecated public static String getFullContent(File file, String charset) { BufferedReader reader = null; if (!file.exists()) { System.out.println("getFull</div> </li> <li><a href="/article/3218.htm" title="Firebase 相关文章索引" target="_blank">Firebase 相关文章索引</a> <span class="text-muted">justjavac</span> <a class="tag" taget="_blank" href="/search/firebase/1.htm">firebase</a> <div>Awesome Firebase 最近谷歌收购Firebase的新闻又将Firebase拉入了人们的视野,于是我做了这个 github 项目。 Firebase 是一个数据同步的云服务,不同于 Dropbox 的「文件」,Firebase 同步的是「数据」,服务对象是网站开发者,帮助他们开发具有「实时」(Real-Time)特性的应用。 开发者只需引用一个 API 库文件就可以使用标准 RE</div> </li> <li><a href="/article/3345.htm" title="C++学习重点" target="_blank">C++学习重点</a> <span class="text-muted">lx.asymmetric</span> <a class="tag" taget="_blank" href="/search/C%2B%2B/1.htm">C++</a><a class="tag" taget="_blank" href="/search/%E7%AC%94%E8%AE%B0/1.htm">笔记</a> <div>1.c++面向对象的三个特性:封装性,继承性以及多态性。   2.标识符的命名规则:由字母和下划线开头,同时由字母、数字或下划线组成;不能与系统关键字重名。   3.c++语言常量包括整型常量、浮点型常量、布尔常量、字符型常量和字符串性常量。   4.运算符按其功能开以分为六类:算术运算符、位运算符、关系运算符、逻辑运算符、赋值运算符和条件运算符。 &n</div> </li> <li><a href="/article/3472.htm" title="java bean和xml相互转换" target="_blank">java bean和xml相互转换</a> <span class="text-muted">q821424508</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/bean/1.htm">bean</a><a class="tag" taget="_blank" href="/search/xml/1.htm">xml</a><a class="tag" taget="_blank" href="/search/xml%E5%92%8Cbean%E8%BD%AC%E6%8D%A2/1.htm">xml和bean转换</a><a class="tag" taget="_blank" href="/search/java+bean%E5%92%8Cxml%E8%BD%AC%E6%8D%A2/1.htm">java bean和xml转换</a> <div>这几天在做微信公众号 做的过程中想找个java bean转xml的工具,找了几个用着不知道是配置不好还是怎么回事,都会有一些问题, 然后脑子一热谢了一个javabean和xml的转换的工具里,自己用着还行,虽然有一些约束吧 , 还是贴出来记录一下      顺便你提一下下,这个转换工具支持属性为集合、数组和非基本属性的对象。   packag</div> </li> <li><a href="/article/3599.htm" title="C 语言初级 位运算" target="_blank">C 语言初级 位运算</a> <span class="text-muted">1140566087</span> <a class="tag" taget="_blank" href="/search/%E4%BD%8D%E8%BF%90%E7%AE%97/1.htm">位运算</a><a class="tag" taget="_blank" href="/search/c/1.htm">c</a> <div> 第十章 位运算   1、位运算对象只能是整形或字符型数据,在VC6.0中int型数据占4个字节   2、位运算符: 运算符 作用 ~ 按位求反 << 左移 >> 右移 & 按位与 ^ 按位异或 | 按位或 他们的优先级从高到低;   3、位运算符的运算功能: a、按位取反: ~01001101 = 101</div> </li> <li><a href="/article/3726.htm" title="14点睛Spring4.1-脚本编程" target="_blank">14点睛Spring4.1-脚本编程</a> <span class="text-muted">wiselyman</span> <a class="tag" taget="_blank" href="/search/spring4/1.htm">spring4</a> <div>14.1 Scripting脚本编程 脚本语言和java这类静态的语言的主要区别是:脚本语言无需编译,源码直接可运行; 如果我们经常需要修改的某些代码,每一次我们至少要进行编译,打包,重新部署的操作,步骤相当麻烦; 如果我们的应用不允许重启,这在现实的情况中也是很常见的; 在spring中使用脚本编程给上述的应用场景提供了解决方案,即动态加载bean; spring支持脚本</div> </li> </ul> </div> </div> </div> <div> <div class="container"> <div class="indexes"> <strong>按字母分类:</strong> <a href="/tags/A/1.htm" target="_blank">A</a><a href="/tags/B/1.htm" target="_blank">B</a><a href="/tags/C/1.htm" target="_blank">C</a><a href="/tags/D/1.htm" target="_blank">D</a><a href="/tags/E/1.htm" target="_blank">E</a><a href="/tags/F/1.htm" target="_blank">F</a><a href="/tags/G/1.htm" target="_blank">G</a><a href="/tags/H/1.htm" target="_blank">H</a><a href="/tags/I/1.htm" target="_blank">I</a><a href="/tags/J/1.htm" target="_blank">J</a><a href="/tags/K/1.htm" target="_blank">K</a><a href="/tags/L/1.htm" target="_blank">L</a><a href="/tags/M/1.htm" target="_blank">M</a><a href="/tags/N/1.htm" target="_blank">N</a><a href="/tags/O/1.htm" target="_blank">O</a><a href="/tags/P/1.htm" target="_blank">P</a><a href="/tags/Q/1.htm" target="_blank">Q</a><a href="/tags/R/1.htm" target="_blank">R</a><a href="/tags/S/1.htm" target="_blank">S</a><a href="/tags/T/1.htm" target="_blank">T</a><a href="/tags/U/1.htm" target="_blank">U</a><a href="/tags/V/1.htm" target="_blank">V</a><a href="/tags/W/1.htm" target="_blank">W</a><a href="/tags/X/1.htm" target="_blank">X</a><a href="/tags/Y/1.htm" target="_blank">Y</a><a href="/tags/Z/1.htm" target="_blank">Z</a><a href="/tags/0/1.htm" target="_blank">其他</a> </div> </div> </div> <footer id="footer" class="mb30 mt30"> <div class="container"> <div class="footBglm"> <a target="_blank" href="/">首页</a> - <a target="_blank" href="/custom/about.htm">关于我们</a> - <a target="_blank" href="/search/Java/1.htm">站内搜索</a> - <a target="_blank" href="/sitemap.txt">Sitemap</a> - <a target="_blank" href="/custom/delete.htm">侵权投诉</a> </div> <div class="copyright">版权所有 IT知识库 CopyRight © 2000-2050 E-COM-NET.COM , All Rights Reserved. <!-- <a href="https://beian.miit.gov.cn/" rel="nofollow" target="_blank">京ICP备09083238号</a><br>--> </div> </div> </footer> <!-- 代码高亮 --> <script type="text/javascript" src="/static/syntaxhighlighter/scripts/shCore.js"></script> <script type="text/javascript" src="/static/syntaxhighlighter/scripts/shLegacy.js"></script> <script type="text/javascript" src="/static/syntaxhighlighter/scripts/shAutoloader.js"></script> <link type="text/css" rel="stylesheet" href="/static/syntaxhighlighter/styles/shCoreDefault.css"/> <script type="text/javascript" src="/static/syntaxhighlighter/src/my_start_1.js"></script> </body> </html>