Http协议(Hyper Text Transfer Protocol)超文本传输协议
一、特点
1、基于TCP/IP的高级协议
2、默认端口号:80
3、基于“请求/响应”模型:1次请求对应1次响应
4、无状态的:每次请求之间相互独立,不能交互数据
二、历史版本
1.0:每次请求响应都会建立新得到连接
1.1:复用连接
三、请求消息数据格式
1、请求行(包含:请求方式 请求URL 请求协议/版本)
* GET /login.html HTTP/1.1
* 请求方式详细:
*HTTP协议有7种请求方式,常用的2种get和post:
* GET:请求参数在请求行中,URL后面;请求的URL长度有限制
* POST:请求参数在请求体中;请求的URL长度没有限制
2、请求头(请求头名称:请求头值【类似于key : value】)
* 常见的请求头
* User-Agent : 告诉服务器 浏览器版本信息
* 例如可以在服务器端获取该头信息,根据浏览器名称进行不同处理,解决浏览器兼容性问题
* Referer : 告诉服务器,我从哪里来
* 作用:
* 防盗链
* 便于统计
3、请求空行
空行(分隔请求头和请求体)
4、请求体(正文)——get没有请求体,Post有
封装POST请求消息的参数
四、响应消息数据格式
ServletRequest – 接口
| 继承
HttpServletRequest --接口
| 实现
org.apache.catalina.connector.RequestFacade 类(Tomcat)
=request功能=
1、获取请求消息数据
(1)获取请求行数据
* GET / day14 / demo1? name=maixiaodou&age=12 HTTP/1.1
* 方法:
(1.1)获取请求方式
String getMethod( ) // 返回 GET
(1.2)获取虚拟目录
String getContextPath( ) // 返回 /day14
(1.3)获取Servlet路径
String getServletPath( ) // 返回 /demo1
(1.4)获取get方式请求参数
String getQueryString( ) // 返回 name=maixiaodou&age=12
(1.5)获取请求URI
String getRequestURI( ) // 返回 /day14/demo1
String getRequestURL( ) // 返回 http://localhost/day14/demo1
(1.6)获取协议及版本
String getProtocol() // 返回 HTTP/1.1
(1.7)获取客户机的IP地址
String getRemoteAddr( )
(2)获取请求头数据
(2.1)通过请求头名称获取请求头的值
String getHeader(String name)
(2.2)获取所有请求头名称
Enumeration getHeaderNames( )
(3)获取请求体数据——POST才有
(3.1)获取流对象
* 获取字符输入流,只能操作字符数据
* BufferReader getReader( )
* 获取字节输入流,可以操作所有类型数据
* ServletInputStream getInputStream( )
(3.2)再从流对象中拿数据
(4)重要功能(不管post还是get)
(4.1)获取请求参数通用方式
* String getParameter(String name):根据参数名称获取参数值
* String[ ] getParamterValues(String name):根据参数名称获取参数值的数组
* Enumeration<String> getParameterNames( ):获取所有请求的参数名称
* Map<String, String[ ]>getParameterMap( ):获取所有参数的map集合
2、乱码问题:
Tomcat8已经处理get方式乱码问题,post请求需要在数据参数之前先request.setCharacterEncoding(“utf-8”)
3、请求转发:
用法:
HTTPServletRequest的对象request可以通过request。getRequestDispatcher("/someSource").forward(request, response)
转发请求,访问项目内部资源/someSource。
特点:
* 浏览器地址路径不变化
* 只能转发到当前服务器内部资源,无法访问外部资源如www.baidu.com
* 只使用同一次请求
4、请求转发可以传递数据:
* 域对象:一个有作用范围的对象,可以在范围内共享数据
* request域:代表一次请求的范围,一般用于请求转发的多个资源共享数据
* 方法:
(4.1)void setAttribute(String name, Object obj):初始化数据的key-value
(4.2)Object getAttribute(String name):受请求的资源可以通过key获取value
(4.3)void removeAtrribute(String name):移除键值对
=response功能=
1、响应消息:服务端发送给客户端的数据
* 数据格式(类似请求消息的数据格式)
响应行、响应头、响应空行、响应体
(1.1)响应行
* 组成:协议 / 版本 响应状态码 状态码描述
* 响应状态码(服务器告诉浏览器,本次请求和响应的状态)
* 分类
& 100多:服务器接收客户端消息,没有接收完成,等待一段时间后,发送该类状态码
& 200多:成功。代表:200
& 300多:重定向。代表:302(重定向),304(访问缓存)
& 400多:客户端错误。代表:404(请求不到路径对应的资源)405(请求方式没有对应的方法,如缺post或get)
& 500多:服务端错误。代表:500(连接成功,但服务器内部异常)
* 重定向:浏览器向服务器发送请求,服务器说你去访问哪个资源,响应状态码就会携带302,然后浏览器就会去访问那个资源
* 访问缓存:浏览器向服务器第1次发送请求如图片(浏览器获得图片后会在本地缓存);
浏览器第2次发送相同请求,服务器说你要访问的资源在服务器没有修改,你去找你浏览器的缓存吧,
响应状态码就会携带304,然后浏览器就会去访问自己的缓存。
(1.2)响应头
* Content-Type:服务器告诉浏览器本次响应体数据格式和编码格式
* Content-disposition:服务器告诉浏览器以什么格式打开响应体数据
值:
& in-line:默认值,在当前页面内打开
& attachment、filename==xxx:以附件形式打开响应体、文件下载
(1.3)响应体:服务器响应给浏览器的数据
2、response对象
* 功能:设置响应消息
(2.1)设置响应行:
* 格式 HTTP/1.1 200 ok
* 设置状态码:setStatus(int sc)
(2.2)设置响应头:
* setHeader(String name, String value)
(2.3)设置响应体:
* 使用步骤
(2.3.1)获取输出流
& 字符输出流:PrintWriter getWriter( )——只能输出字符串
& 字节输出流:ServletOutputStream getOutPutStream( )——能输出任意格式
(2.3.2)使用输出流,将数据输出到浏览器
* 案例:
& 完成重定向:代码实现
response.setStatus(302);
response.setHeader("location", "/someSources/haha");
或者更简洁:
response.sendRedirect("/someSources/haha");
& redirect重定向特点
1、地址栏发生变化
2、重定向可以访问其他站点(可以是非本项目)
3、重定向是两次请求。不能使用request转发数据
& forward转发的特点
1、转发地址栏不变
2、转发只能访问当前服务器下的资源
3、转发是一次请求,可以用request对象来转发数据
& 路径写法:
1、相对路径(需要知道当前资源与目标资源的相对关系)
2、绝对路径