Http协议(Hyper Text Transfer Protocol)
这是一种超文本传输协议,规定了浏览器与服务器中间数据传输的规则
特点:
- 基于TCP协议:面向连接,安全
- 基于请求-响应模型:一次请求对应一次响应
- http协议是无状态的协议,对于事物处理没有记忆能力。每次请求响应都是独立的
- 缺点:多次请求间不能共享数据
- 优点:速度快
历史版本:
1.0(无状态连接)
1.1(复用连接)
请求:
数据格式
Request:
request对象和response对象原理:
request和response对象是由服务器创建的,我们来使用
request对象是获取请求消息,response对象是设置响应消息
- request对象继承的体系结构:
servletRequest ----接口
|继承|
httpSetvletRequest---接口
|实现|
org.apache.catalina.connector.RequestFacade 类(tomcat编写)
-
request功能:
获取请求消息数据
获取请求行
GET /day10/demo?name=zhaojing HTTP/1.1
方法:
获取请求方式:GET String getMethod() **获取虚拟目录 /day014 String getContextPath() 获取Servlet路径: /demo String getSetvletPath() 获取get方式的请求参数:name=zhaojing String getQueryString() **获取请求的URI: /day10/demo String getRequestURI 获取请求的URL:http://localhost/day10/demo String getRequsetURL 获取协议及版本号:HTTP 1.1 String getProtocol() 获取客户机的ip地址 String getRemoteAddr()
获取请求头
方法:
String getHeader(String name) :通过请求头的名称获得请求头的值
Enumeration<E> getHeadNames()
获取请求体
请求体:只有post请求才有请求体,在请求体中封装了POST请求的参数
步骤:
- 获取流对象
- BufferedReader getReader() :只能操作字符数据
- ServletInputStream getInputStream() :获取字节输入流,可以操作所有类型的数据
- 再从流对象拿数据
其他功能
1.获取请求参数通用方法:
String getParameter(String name):根据参数名称获取参数值
String[] getParameterValues(String name):根据参数名称获取参数值
Enumeration<String> getParameterNames():获取所有请求的参数
Map<String,String> getParameterMap() :获取所有参数map集合
2.请求转发:一种在服务器内部的资源跳转方式
- 步骤:
- 通过request对象获取请求转发对象:RequestDispatcher getRequestDispatcher(String path)
- 使用RequestDispatcher对象进行转发,forward(ServletRequest request,ServletResponse response)
- 特点
- 浏览器路径栏不发生变化
- 只能转发到当前服务器内部资源
- 转发是一次请求
- 共享数据
- 域对象:一个有作用范围的对象,可以在范围内共享数据
- request域:代表一次请求的范围。一般用于请求转发的多个资源共享数据
- 方法:
- void setAttribute(String name,Object obj):存储数据
- Object getAttribute(String name): 通过键获取值
- void removeAttribute(String name): 通过键移除键值对
- 获取ServletContext
- ServletContext getServletContext()
- 共享数据
注意:
- ***getParameter()取值为null,可能只设置了id属性,而取值用的是name属性
- 因为流是不能往回读的,如果我在之前先用request.getInputStream()读取完了请求体,这时候我再来用request.getParameter("name");获取name的值,得到的是个空。或者我先调用了request.getParameter();再来request.getInputStream();尝试获取请求体内容还是空。
- 中文乱码问题
*get方式:Tomcat8已经解决乱码问题。
*post方式:会乱码,
解决: 设置流的编码:req.setCharacterEncoding("UTF-8");