1 http协议
1.1 概念
是对浏览器和服务器端数据传输格式的规范!
2 Http请求
GET /day08/first HTTP/1.1 --请求行 Host: localhost:8080 --请求头(以键值对形式出现) User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:37.0) Gecko/20100101 Firefox/37.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: en-GB,en-US;q=0.8,zh-CN;q=0.6,zh;q=0.4,en;q=0.2 Accept-Encoding: gzip, deflate Connection: keep-alive --一个空行 name=eric&password=123456 --- 实体内容 |
2.1 请求行
GET /program/first HTTP/1.1
http协议版本:
http1.0: 当浏览器和服务器连接之后,在一次连接中只能发出一个请求
http1.1:当浏览器和服务器连接之后,在一次连接中可以发出多次请求。(效率比1.0更高)
请求方式(提交方式):
http协议中的请求方式:GET、POST、HEAD、PUT、CONNECT。。。。
最常用的的请求方式: GET 和 POST
<form action="提交的地址" method="get/post">
</form>
GET与POST对比
2.2 请求头
Accept: --浏览器接受的数据类型 Accept-Charset: --浏览器接受数据编码格式 Accept-Encoding: --浏览器接受的数据压缩格式 Accept-Language: ---浏览器接受的语言 Host: --请求发出的主机和端口(必须) If-Modified-Since: --浏览器缓存的最后修改时间 Referer: -- 当前请求来自于哪里 (防止非法链接) User-Agent: --浏览器的类型 Cookie: ---浏览器保存的cookie数据 Connection: ---浏览器和服务器的连接状态。close:关闭。keep-alive:保持连接 Date: --请求发出的时间 |
使用HttpServletRequest获取请求信息
HttpServletRequest对象:获取请求数据
请求行:
请求方式: request.getMethod()
请求资源: request.getRequestURI() / request.getRequestURL()
http协议版本: request.getProtocol();
请求头
request.getHeader("name")
request.getHeaderNames()
实体内容:
request.getInputStream();
1)tomcat服务器接收到浏览器发送的请求数据
2)tomcat服务器把请求数据封装成HttpServletRequest对象
3)tomcat服务器调用doGet方法,把request对象传入servlet
4)通过request对象获取请求数据
结论: service方法和doXXX方法的关系?
1)service方法是程序的入口。我们的代码逻辑就在这个方法被调用到。
2)在HttpServlet的service方法源码中,根据不同请求方式调用了不同的doXX方法,
所以我们在开发servlet的时候,就不需要去覆盖service方法,而是去doXX方法。
因为get和post是最常用的的两种请求方式,所以只需要覆盖doGet和doPost方法即可!
2.3 案例- user-agent头 -- 获取浏览器类型
request.getHeader("user-agent");
Firefox Chrome Trident
2.4 案例- referer头 --- 防止非法链接
2.5 获取参数数据
get: 放在请求行的URI后面
post: 放在请求的实体内容
reuqest.getParameter("name") 获取一个值的参数
request.getParameterValue("name") 获取多个值的参数
request.getParameterNames() 获取所有参数名称
request.getParameterMap() 获取所有参数对象
解决get乱码问题:
手动解码
if("GET".equals(request.getMethod())){
name = new String(name.getBytes("iso-8859-1"),"utf-8");
}
解决post乱码问题:
request.setCharacterEncoding("utf-8");
上述这句话要放在doPost方法的开始才能生效;1)在使用getParameter方法后在使用上述这代码解决乱码就失效;2)获取实体内容的流后在使用getParameter方法获取不到对象
3 Http响应
HTTP/1.1 200 OK --响应行 Server: Apache-Coyote/1.1 --响应头 Content-Length: 24 Date: Mon, 08 Jun 2015 01:51:04 GMT --一个空行 -实体内容 |
3.1 响应行
http协议版本
状态码:当前服务器处理请求的状态(结果)
常见的状态码:
200: 请求处理完成,成功返回!
302: 需要浏览器进一步请求,才能完成。
404: 浏览器端的错误。没有找到资源。
500: 服务器端的错误。
状态描述:对状态码的文字补充
3.2 响应头
Location: --重定向的地址。结合302状态使用完成重定向的效果 Server: --服务器的类型 Content-Encoding: --服务器发送给浏览器的数据压缩格式 Content-Length: --服务器发送给浏览器的数据长度 Content-Language: --服务器支持语言 Content-Type: --服务器发送给浏览器的数据类型和数据编码格式 Last-Modified: --服务器资源的最后修改时间 Refresh: ---定时刷新或每隔n秒跳转资源 Content-Disposition: -- 以下载方式打开资源 Transfer-Encoding: Set-Cookie: -- 服务器发送给浏览器的cookie数据 Expires: -1 --通知浏览器不使用缓存 Cache-Control: no-cache Pragma: no-cache Connection: 连接状态 Date: 响应发出的时间 |
使用HttpServletResponse修改响应数据
response.setStatus(404) 设置状态码
response.setHeader("name","value") 修改响应头
response.getWriter().append() 以字符形式发送实体内容
response.getWriter().write() 以字符形式发送实体内容
response.getOutputStream().write() 以字节形式发送实体内容
请求重定向
1) SetStatus(302)
setHeader(“location”,”/day/1.html”);
2) sendRedirect(“day/1.html”);
定时刷新
1) setHeader(“refresh”,”3”);
2) setHeader("refresh", "3;/day/1.html");在IE11以下的浏览器版本中可能无法实现;