1.http协议入门
1.1 什么是Http协议?
Http协议: 对浏览器客户端 和 服务器端数据传输格式的规范!!!!
1.2 查看Http协议工具
1)火狐浏览器的firebug
2)谷歌浏览器的审查元素
3)telnet工具
a)cmd输入 telnet localhost 8080 回车
b)ctrl+] 回车
c)输入请求,回车GET /day09/first HTTP/1.1Host: localhost:8080
1.3 Http协议内容详情
浏览器->服务器(请求)
GET /day09/first HTTP/1.1
Host: localhost:8080
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:34.0) Gecko/20100101 Firefox/34.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-cn,en-us;q=0.8,zh;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Connection: keep-alive
服务器->浏览器(响应)
HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Content-Length: 51
Date: Sun, 28 Dec 2014 01:51:16 GMT
this is first servlet!!Sun Dec 28 09:51:16 CST 2014
2.Http请求
GET /day09/first HTTP/1.1 --请求行(必须有)
Host: localhost:8080 --多个请求头(必须有)
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:34.0) Gecko/20100101 Firefox/34.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-cn,en-us;q=0.8,zh;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Connection: keep-alive
--一个空行
name=eric&password=123456 --请求实体内容(可选)
2.1请求行
GET /day09/first HTTP/1.1
#http协议版本:
http1.0: 当浏览器客户端与服务器连接之后,只能向服务器发送一次请求。
http1.1: 当浏览器客户端与服务器连接之后,可以发送多次请求。(效率比1.0高)
问题:一个web页面中,使用img标签引用了三幅图片,当客户端访问服务器中的这个web页面时,客户端总共会访问几次服务器,即向服务器发送了几次HTTP请求。
答案:4次
#请求资源
URI: 统一资源标识符(可以定位本地文件,局域网文件,互联网文件)
URL:统一资源定位符(定位互联网文件),是URI的子集。
/day09/first : web应用名称+web资源名称
#请求方式
请求方式: GET / POST / HEAD / PUT / CONNECT/ TRACE / DELETE
常用的请求方式: GET 和 POST
表单提交:
2.2 多个请求头
Accept: text/html,image/* --浏览器接收的数据类型
Accept-Charset: ISO-8859-1 --浏览器接收的编码格式
Accept-Encoding: gzip,compress --浏览器接收的数据压缩格式
Accept-Language: en-us,zh- --浏览器接收的语言
Host: www.it315.org:80 --当前请求访问哪个主机和端口
If-Modified-Since: Tue, 11 Jul 2000 18:23:51 GMT --浏览器最后更新的缓存时间
Referer: http://www.it315.org/index.jsp --当前请求来自于哪里(从超链接过来的请求包含此头)
User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0) ---浏览器类型
Cookie: name=eric ---浏览器保存的cookie信息
Connection: close/Keep-Alive --浏览器和服务器连接状态。close:关闭连接。keep-alive:保持连接。
Date: Tue, 11 Jul 2000 18:23:51 GMT --请求发出时间
2.3HttpServletRequeset对象
1)tomcat服务器把http请求信息封装到HttpServletRequest对象中。
2)开发者通过HttpServletRequest对象得到http请求信息。
请求行:
request.getMethod(); 请求方式
request.getRequestURI() 请求资源
request.getRequestURL()
request.getProtocol() 协议版本
请求头:
request.getHeader("name"): 根据请求头获取请求值
request.getHeaderNames(): 获取所有请求头名称
实体内容:
request.getInputStream();
2.4请求参数的获取
Get方式的参数跟在URI的后面
Post方式的参数放在实体内容中
获取参数方式:
GET:request.getQueryString();
POST:request.getInputStream();
通用获取参数方式:(不分Post和Get)
request.getParameter(name) : 根据参数名获取参数值(获取一个参数值)
request.getParameterValues(name): 根据参数名获取参数值(获取多个参数值)
request.getParameterNames() 获取所有参数名称
request.getParameterMap(): 获取所有参数
2.5请求参数中文乱码问题
POST方式:
request.setCharacetEncoding(“utf-8”)
GET方式:
1)重新解码(推荐使用)
if("GET".equals(request.getMethod())){
//重新解码
hobit = new String(hobit.getBytes("iso-8859-1"),"utf-8");
}
2)修改tomcat的server.xml文件
3.Http响应
HTTP/1.1 200 OK --响应行
Server: Apache-Coyote/1.1 --多个响应头
Content-Length: 51
Date: Sun, 28 Dec 2014 01:51:16 GMT
--一个空行
this is first servlet!!Sun Dec 28 09:51:16 CST 2014 --实体内容(用户直接看到的内容)
3.1响应行
3.1响应行
HTTP/1.1 200 OK
#http协议版本
#状态码
状态码:服务器对于请求处理的结果
常见的状态码:
200: 表示请求处理完成。
302: 表示请求需要进一步细化。通常该状态码和location响应头结合使用。
404 : 表示客户端错误,找不到资源。
500: 表示服务器错误。
3.2 多个响应头
Location: http://www.it315.org/index.jsp --重定向地址。通常和302状态码配合使用,完成请求重定向效果
Server:apache tomcat --服务器类型
Content-Encoding: gzip --服务器发送给浏览器的数据压缩格式
Content-Length: 80 --服务器发送给浏览器数据长度
Content-Language: zh-cn --服务器发送给浏览器数据语言
Content-Type: text/html; charset=GB2312 --服务器发送给浏览器数据类型
Last-Modified: Tue, 11 Jul 2000 18:23:51 GMT --服务器资源最后修改时间
Refresh: 1;url=http://www.it315.org --定时刷新或每隔n秒跳转页面
Content-Disposition: attachment; filename=aaa.zip --告诉浏览器以下载方式打开资源
Transfer-Encoding: chunked
Set-Cookie:SS=Q0=5Lb_nQ; path=/search --服务器发送给浏览器的cookie信息
Expires: -1 --建议浏览器不使用缓存
Cache-Control: no-cache
Pragma: no-cache
Connection: close/Keep-Alive --服务器和浏览器连接状态。close:关闭连接。keep-alive:保持连接。
Date: Tue, 11 Jul 2000 18:23:51 GMT --响应发送的时间
#######3.2 HttpServletResponse对象
HttpServletResponse对象用于设置响应信息。
常用方法:
响应行:
response.setStatus(); 设置状态码
响应头:
response.setHeader(name,value); 设置响应头
实体内容
response.getWriter().writer() 以字符格式发送实体内容
response.getOutputStream().writer() 以字节格式发送实体内容