HTTP协议
概念 : Hyper Text Transfer Protocol 超文本传输协议
传输协议 : 定义了, 客户端和服务器端通信时, 发送的格式
特点 :
1.基于TCP/IP的高级协议
2.默认端口号 : 80
3.基于请求/响应模型的 : 一次请求对应一次响应
4.无状态的 : 每次请求之间相互独立, 不能交互数据
请求消息:客户端发送给服务器端的数据
* 数据格式:
1. 请求行
格式:
请求方式 请求url 请求协议/版本
GET /login.html HTTP/1.1
请求方式 :
HTTP协议有7中请求方式, 常用的有两种
GET :
1. 请求参数在请求行中,在url后面
2. 请求的url长度有限制的
3. 不太安全
POST :
1. 请求参数在请求体中
2. 请求的url长度没有限制的
3. 相对安全
2. 请求头: 客户端浏览器告诉服务器一些信息
请求头名称: 请求头值1;请求头值2....
常见的请求头 :
1. User-Agent : 浏览器告诉服务器, 我访问你使用的浏览器版本
可以在服务器端获取该头的信息, 解决浏览器的兼容性问题
2. Referer http://localhost:8080/login.html
告诉服务器, 我(当前请求)从哪里来?
作用 :
1. 防盗链 :
2. 统计工作 :
3. 请求空行
空行 : 就是用于分隔POST请求的请求头和请求体的.
4.请求体(正文) : 只有post请求才有请求体 get请求没有请求体
封装POST请求消息的请求参数的
响应消息:服务器端发送给客户端的数据
* 数据格式:
1. 响应行
1. 组成:协议/版本 响应状态码 状态码描述
2. 响应状态码:服务器告诉客户端浏览器本次请求和响应的一个状态。
1. 状态码都是3位数字
2. 分类:
1. 1xx:服务器就收客户端消息,但没有接受完成,等待一段时间后,发送1xx多状态码
2. 2xx:成功。代表:200
3. 3xx:重定向。代表:302(重定向),304(访问缓存)
4. 4xx:客户端错误。
* 代表:
* 404(请求路径没有对应的资源)
* 405:请求方式没有对应的doXxx方法
5. 5xx:服务器端错误。代表:500(服务器内部出现异常)
2. 响应头:一般是一个key对应一个value,也有一个key对应多个value
1. 格式:头名称: 值
2. 常见的响应头:
1. Content-Type:服务器告诉客户端本次响应体数据格式以及编码格式
2. Content-disposition:服务器告诉客户端以什么格式打开响应体数据
* 值:
* in-line:默认值,在当前页面内打开
* attachment;filename=xxx:以附件形式打开响应体。文件下载
3. 响应空行: 分隔响应头和响应体
4. 响应体:传输的数据
Request对象与Response对象
Request对象与Response对象的原理
- request和response对象是由服务器创建的. 我们来使用他们
- request对象是来获取请求线下, response对象是来设置响应消息的
Request对象(请求消息)
继承体系结构:
ServletRequest -- 接口
| 继承
HttpServletRequest -- 接口
| 实现
org.apache.catalina.connector.RequestFacade
request的功能: 获取请求消息
1.获取请求行数据
- GET /day14/demo1?name=zhangsan HTTP/1.1
- 方法
1. 获取请求方式 : GET
- String getMethod()
2. 获取虚拟目录 : /day14 (重点)
- String getContextPath()
3. 获取Servlet路径 : /demo1
- String getServletPath()
4. 获取get方式请求参数 : name=zhangsan
- String getQueryString()
5. 获取请求的URI : /day14/demo1 (重点)
- String getRequestURI() : day14/demo1
- StringBuffer getRequestURI() :http://localhost/day14/demo1
- URL : 统一资源定位符
- URI : 统一资源标识符
6. 获取协议及版本 : HTTP/1.1
- String getProtocol()
7. 获取客户机的IP地址 :
- String getRemoteAddr()
2.获取请求头数据
方法 :
- String getHeader(String name) : 通过请求头的名称获取请求头的值 (重点)
- Enumeration<String> getHeaderNames() : 获取所有的请求头名称
3.获取请求体数据
只有POST请求方式, 才有请求体, 在请求体中封装了POST请求的请求参数
步骤 :
1. 获取流对象
* BufferedReader getReader():获取字符输入流,只能操作字符数据
* ServletInputStream getInputStream():获取字节输入流,可以操作所有类型数据
2. 再从流对象中拿数据
其他功能
1.获取请求参数通用方式和中文乱码问题(重点)
String getParameter(String name) :根据一个name获取一个value值 很常用
String[] getParameterValues(String name) :根据一个name获取多个value值
Map<String,String[]> getParameterMap() :获取所有请求参数 很常用
请求参数中文乱码问题(重点)
原因:request缓冲区默认字符集是iso-8859-1不支持中文
解决办法:在获取请求参数之前设置request缓冲区字符集为utf-8
request.setCharacterEncoding("utf-8");
2.Request对象请求转发(重点)
1.请求转发
request.getRequestDispatcher("/转发的路径,不带虚拟路径").forward(request,response);
2.转发特点:
1 请求转发是一次请求一次响应;
2 请求转发浏览器地址栏不会发生变化
3 请求转发api中路径不需要携带虚拟路径,默认是访问项目内部资源;
3.Request对象作为域对象(重点)
数据共享(存值、取值、移除值)
作用范围: 一次请求范围,浏览器发送请求到服务器做成响应结束,请求转发在一次请求范围内;
创建和销毁时间:浏览器发送请求之后服务器创建request对象,服务器做成相应之后销毁;
存值:request.setAttribute(String name,Object value);
取值:Object value=request.getAttribute(String name);
移除值:request.removeAttribute(String name);
Response对象(响应消息)
1.response对象重定向实现页面跳转(重点)
1.重定向
response.sendRedirect("/带虚拟路径的访问路径");
2.重定向特点
1. 地址栏发生变化
2. 重定向可以访问其他站点(服务器)的资源
3. 重定向是两次请求, 不能使用request对象来共享数据
请求转发(forward)和重定向(redirest)的区别?
请求转发和重定向的区别?
1.请求转发是一次请求一次响应,重定向是两个请求和两次响应;
2.请求转发浏览器地址栏不会发生改变,重定向浏览器地址栏会发生改变
3.请求转发路径不带虚拟目录,重定向路径要带虚拟目录;
4.如果跳转前后使用request数据传递,那么只能使用请求转发,否则使用重定向;
注意:如果跳转前后使用request数据传递,那么只能使用请求转发,否则使用重定向;
2.web中页面访问路径问题(重点)
1.相对路径:以./或者../开头 ./表示当前路径可以省略不写,../表示上一级目录
规则: 找到当前资源和目标资源之间的相对位置关系
2.绝对路径: 通过绝对路径可以确定唯一资源
客户端路径:客户端浏览器访问服务器的路径就叫客户端路径,例如:form表单的action、a标签、img的
src、重定向,需要使用虚拟目录
服务端路径:服务器内部跳转的路径,请求转发 不需要使用虚拟目录
总结:除了请求转发不需要使用虚拟目录,其他路径都要使用虚拟目录。
3.response响应内容以及中文乱码问题(重点)
1.响应数据:
response.getWriter().write("数据");
response.getWriter().print("数据");
区别例如:网页上的显示不同
response.getWriter().write(97); //a
response.getWriter().print(97); //97
2.响应中文乱码问题
原因:1.response缓冲区字符集是iso-8859-1不支持中文;缓冲区字符集和浏览器采用的字符集不一致;
解决办法:在获取到流对象之前response.setContentType("text/html;charset=utf-8");
1.设置了response缓冲区字符集为utf-8;2.告诉浏览器采用utf-8字符集
ServletContext对象
ServletContext作为域对象存值、取值、移除值
作用范围:整个web项目
创建和销毁时间:在服务器启动的时候会为每个web项目创建一个ServletContext对象,代表这个web项目;服务器
关闭了。
存值、取值、移除值api:
存值:request.setAttribute(String name,Object value);
取值:Object value=request.getAttribute(String name);
移除值:request.removeAttribute(String name);
获取文件在服务器中的绝对路径(重点)
获取路径:servletContext.getRealPath("/xx");默认是获取到web目录在服务器中的绝对路径;
String b = context.getRealPath("/b.txt");//web目录下资源访问
String c = context.getRealPath("/WEB-INF/c.txt");//WEB-INF目录下的资源访问
String a = context.getRealPath("/WEB-INF/classes/a.txt");//src目录下的资源访问
获取文件输入流:servletContext.getResourceAsStream("/xx");路径和getRealPath路径写法一样
InputStream is1 = servletContext.getResourceAsStream("/a.txt");
InputStream is2 = servletContext.getResourceAsStream("/WEB-INF/b.txt");
InputStream is3 = servletContext.getResourceAsStream("/WEB-INF/classes/c.txt");