HTTP-Request笔记
1.HTTP协议
- HTTP:超文本传输协议
- HTTP协议:是客户端和服务端交互时,数据的格式规范
- HTTP请求:客户端发送给服务端的数据
- HTTP响应:服务端发送给客户端的数据
- 响应行
- 响应头
- 响应体
- 先有请求,再有响应;没有请求就没有响应
- 请求行
- 请求头
- 请求体
2.HTTP请求
2.1请求行
- 本次请求的基本信息
- 格式:请求方式 请求资源 协议版本
- 例如:
POST /web/web01 HTTP/1.1
2.2 请求头
- 本次请求的附加信息
- 格式:一行一个键值对,一个键值对是一个请求头,一次请求可以有多个请求头
- 例如:
Referer:http://localhost:8080/web/http.html
2.3 请求体
- 本次请求的正文数据,是提交的表单参数
- 格式:表单数据的提交格式 name=value&name=value&…
- 注意:
- 只有是POST提交,必须有带name属性的表单项,这时候请求体里才有数据;否则没有请求体
二、request
- request:
- 什么是request对象:代表HTTP请求的对象。ServletRequest、HttpServletRequest
- request对象有什么用处:用来接收客户端提交的所有数据(接收HTTP请求里的所有数据)
- request对象的原理:
- 服务器软件 帮我们初始化request对象,把HTTP请求数据封装进去了
- 我们Servlet里得到的request,就是服务器封装好的对象
1. 接收请求数据
1.1 获取请求行数据
获取请求方式
- API:
request.getMethod()
- 什么样的请求是GET?什么样的请求是POST?默认是GET;除非特定指定了是POST,才是POST
获取项目路径
- API:
request.getContextPath()
- 在实际开发中,不能有写死的项目路径硬编码,必须要动态获取
- 如果是在Servlet里:直接使用request.getContextPath方法
- 如果是在HTML里:
- 使用JSP代替HTML,JSP里可以嵌套Java代码。用Java代码动态获取
- 使用相对路径代替绝对路径。相对路径的写法技巧:
- 写出来当前资源的完整url路径
- 写出来目标资源的完整url路径
- 可以根据目标资源和当前资源的相对位置,写相对路径
其它了解的API
- 获取url:
request.getRequestURL()
- 获取uri:
request.getRequestURI()
- 获取客户端的ip:
request.getRemoteAddr()
1.2 获取请求头数据
获取请求头
- API:
request.getHeader(headerName)
1.3 获取请求参数
获取参数的API
- 获取单值参数:
String value = request.getParameter(String name)
- 获取多值参数:
String[] values = request.getParametreValues(String name)
- 获取所有参数:
Map<String, String[]> map = request.getParameterMap()
解决中文乱码的问题
- GET方式:Tomcat8(或更高版本)已经帮我们解决了
- POST方式:
- 在第一次接收参数之前,增加一行代码:
request.setCharacterEncoding("utf-8")
- 在第一次接收参数之前,增加一行代码:
2. 其它作用
2.1 是一个域对象
什么是域对象
- 由Servlet规范提供的,能够存取数据的对象,在其作用范围里可以共享数据。
- 不同域对象的区别:作用范围不同
- 域对象存取数据的方法:
- 存数据:
setAttribute(String name, Object value)
- 取数据:
getAttribute(String name)
- 删数据:
removeAttribute(String name)
- 存数据:
- request域对象的作用范围:
- 何时创建:一次请求开始
- 何时销毁:一次请求结束
- 作用范围:一次请求期间
2.2 实现请求转发跳转
请求转发和重定向的区别(面试题)
- 重定向跳转:有2次请求;请求转发:1次请求
- 重定向跳转:浏览器地址栏会变;请求转发:地址栏不变
- 重定向跳转:是客户端(浏览器)跳转;请求转发:是服务端跳转
什么时候使用请求转发?什么时候使用重定向?
- 跳转时,如果有数据要传递给下一个资源,要使用请求转发跳转:
- 把数据放到request对象里
- 请求转到下一个资源,把request对象传递过去
- 跳转时,如果没有数据要传递给下一个资源,可以使用重定向跳转
请求转发的API
request.getRequestDispatcher(String path).forward(request, response);
注意:
- 重定向跳转时,跳转的路径前要加:项目路径。因为重定向是浏览器跳转,是应用外跳转
- 请求转发跳转时,跳转的路径前不要加项目路径。因为请求转发是服务器跳转,是应用内跳转