Java对http的封装个人理解
一、向后台发送请求的方式:
当浏览器发现一个图片标记时,会生成另一个HTTP请求,得到标记所描述的资源。在这里,浏览器会做第二个HTTP请求来得到<img>标记中引用的图片
所以可以通过<img src="codeMaker"/> codeMaker指向一个servlet:
(<servlet>
<servlet-name>ValidateCode</servlet-name>
<servlet-class>org.yicj.frameWork.service.login.ValidateCode</servlet-class>
</servlet> <servlet-mapping>
<servlet-name>ValidateCode</servlet-name>
<url-pattern>/codeMaker</url-pattern>
</servlet-mapping>
)来向后台发出请求得到返回的内容。
总结:以前一直以为向后台发出请求的方式只有通过表单提交,超连接或通过ajax 的XMLHttpRequest对象向后台发送请求(异步加载数据)。其实通过下面的方式也可以不段的向后台发送请求不过大多数是用来改变图片的内容。
function change(){
var img = document.getElementById("img1");
img.src="codeMaker";
}
<img name ="chaimg" id = "img1"src="codeMaker"/>
<input type="button" value="修改图片" onclick="change();">
二、请求发送和接收的过程
1、http get请求剖析
资源的路径以及增加到URL的所有参数都会包括在“请求行”中
【请求】
(Request-Line) GET /HelloWorld/cookiebase.do HTTP/1.1
Host localhost:8080
User-Agent Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.0.5) Gecko/2008120122 Firefox/3.0.5
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
Accept-Charset gb2312,utf-8;q=0.7,*;q=0.7
Keep-Alive 300
Connection keep-alive
请求行:http方法(get,post…);web服务器上资源的路径。在GET请求中,参数(如果有)会追加到请求URL第一部分的后面,以“?”开头。各参数之间用“&”分隔。; Web浏览器所使用的协议的版本。
请求首部:{主机地址:(www.wickedlysmart.com);
用户代理:用户所使用的浏览器(计算机型号,使用的操作系统,语言(英文),浏览器所使用的网页排版引擎(哪个公司什么版本))
接受类型(浏览器所能识别并解析的类型):text/xml,application/xml,application/xhtml+xml等等
接受语言():英文或中文等等
接受编码:gzip
接受字符集:utf-8,ISO-8859-1
(说明:Charset 和 Encoding 的区别;在绝大多数情况下,包括某些专业文章中,字符集和编码都统称为编码,这是因为一个字符集往往对应一种编码。但是在程序中,我们来不得半点马虎,我们 应该清楚地知道字符集和编码有什么区别。
Charset 是字符集,Encoding 是编码。
字符集即字符的集合,规定了在这些集合里面有哪些字符,每一个字符都有一个编号(一个整数),但这只是编号不是编码。
编码就规定了一个编号如何与二进制交互。
我们大多数人最先接触到的字符集是 1963 年的 ASCII,其中的每一个字符只需要用一个字节来表示就可以了。但世界上有许多种语言,像亚洲文字,比如中文,常用汉字就几千个,仅用一个字节来表示显然是不够的,假如我们使用两个字节。
那么问题就来了,为什么我们要把两个字节看成是一个汉字的编号呢?为什么我们不把两个字节看成 ASCII 字符集的两个编号呢?为了解决此问题,就得使用编码来标识了。
还有一个问题,编号(整数)1234 在字符集 A 中代表“千”,1234 在字符集 B 中代表“一”,那么 1234 究竟代表什么字呢?这就得明确字符集了。
浏览器可以自动识别使用哪个字符集,一般说来它们使用 HTTP 头部的 Content-Type 标明的字符集,如果没有向 HTTP 头部发送该信息,一般参考使用 HTML 的 head 标签中的 <meta http-equiv="Content-Type" content="text/html; charset=gb2312" />,为什么是参考使用呢?因为现在浏览器都比较聪明,如果发现这里用错了,一般会给予纠正。
我们做网页时,如果指定的 Charset 是 GB2312,那么就不应该在网页中出现繁体字,因为 GB2312 标准只有几千个简体的中文字。如果我们的网页编码是 UTF-8,我们就不要指定字符集是 GB2312,因为虽然 UTF-8 编码对应的 UTF-8 字符集包含了 GB2312 的字符,但同一个字符在两个字符集中的编号不一样。
对于我们中文简体网页,一般来说有两种搭配:
一种是字符集是 GB2312,编码使用 ANSI。占用磁盘空间最少,网络传输效率最高。
一种是字符集是 UTF-8,编码使用 UTF-8。虽然占用磁盘空间大,传输效率略低,但因为兼容面广,在应用 Ajax 以及包含多种语言文字时使用方便。鉴于此原因,现在许多网页开发工具都默认使用 UTF-8 来保存网页,比如 Visual Web Developer。
)
保持连接:300(没有理解)
连接方式:保持连接(没有理解)
}
2、HTTP POST请求剖析
和GET差不多只不过,,参数(如果有)会追加到请求URL第一部分的后面,以“?”开头。各参数之间用“&”分隔。将放到一个消息体中,长度不像使用GET那样受限制
二、HTTP响应剖析
HTTP响应包括一个首部和一个体。首部信息告诉浏览器使用了什么协议,请求是否成功,以及体中包括的内容是什么类型。
http响应首都:web服务器正在使用的协议版本 响应的http状态码 状态码的文本版本
内容类型:告诉浏览器要接收的数据是什么类型,这样浏览器才知道如何显示这些数据。(注意:MIME类型值与http请求的”Accept”首都中所列的相关)
内容长度:返回信息的长度
日期:返回日期
服务器:响应所使用的服务器
连接:关闭