HTTP(Hyper Text Transfer Protocol ,超文本传输协议),定义了客户端与服务器端通信时的数据格式
请求消息数据格式:
请求行——格式:
请求方式 请求url 请求协议/版本
,比如:GET /login.html HTTP/1.1
关于请求方式:HTTP协议有7种请求方式,常用的有两种:
▶ GET:请求参数在请求行中(url中);请求的url有长度限制;不太安全
▶ POST:请求参数在请求体中;请求的url没有长度限制;相对安全请求头——格式:
键值对
。是客户端浏览器告诉服务器的信息。
关于几个重要的请求头键/值:
▶ User-Agent:浏览器告诉服务器"我是哪个版本的浏览器"。这样服务器才能"对症下药",解决浏览器兼容性问题
▶ Referer:告诉服务器"我的请求的来源"。这被用于 防盗链 和 统计工作。请求空行——格式:
就是个空行
。分割了 请求头 和 请求体请求体——传递的信息。POST方式有请求体,GET方式没有。流的形式获取。
request
▶ request对象和response对象的原理
- 服务器根据url的资源路径(两次映射,或注解一步到位)对应到相应的Servlet实现类,通过反射机制做出Servlet对象;
- 服务器也会自动创建出Request和Response对象——它们被传递给Servlet对象的service方法,service方法自动调用;
- request对象用来获取请求消息;response对象用来设置响应消息。
▶ request对象继承体系结构
ServletRequest 接口
↑继承
HttpServletRequest 子接口
↑ 实现
org.apache.catalina.connector.RequestFacade 实现类
▶ request功能:
------------------------------------------ 获取请求行数据 --------------------------------------------------
demo请求行: GET /loli/demo?name=Alice HTTP/1.1
getMethod() 获取请求方式: GET
getContextPath() 获取虚拟目录(★): /loli
getServletPath() 获取资源路径(Servlet路径): /demo
getQueryString() 获取get方式的请求参数: name=Alice
getRequestURI() 获取请求URI (★): /loli/demo
getRequestURL() 获取请求URL: http://localhost:8080/loli/demo
getProtocol() 获取协议及版本: HTTP/1.1
getRemoteAddr() 获取客户机的IP地址 0:0:0:0:0:0:0:1
------------------------------------------ 获取请求头数据 --------------------------------------------------
getHeader(String name) 通过请求头的名称获取值(★)
getHeaderNames() 获取所有的请求头名称(返回值是Enumeration<String>枚举类型(用hasMoreElements()和nextElement()方法进行迭代))
------------------------------------------ 获取请求体数据 --------------------------------------------------
只有POST请求方式,才有请求体,在请求体中封装了POST请求的请求参数
步骤: 1.获取流对象(字符流/字节流) 2.再从流对象中拿数据
getReader() 返回类型BufferedReader,获取的当然是字符输入流
getInputStream() 返回类型ServletInputStream,获取字节输入流(可以操作所有类型的文件)
▶ request其他功能:
------------------------------------------ 获取请求参数 --------------------------------------------------
上面在获取请求参数时: GET用的是getQueryString()方法,POST用的是getReader()/getInputStream()
下面给出通用方法:
String getParameter(String name) 根据key获取value (★)
String[] getParameterValues(String name) 根据key获取value数组
Enumeration<String> getParameterNames() 获取所有key
Map<String,String[]> getParameterMap() 获取所有key-value对
小插曲: tomcat8版本以下,获取POST方式的请求参数会出现中文乱码问题
解决: request.setCharacterEncoding("utf-8"); 这个字符集和html页面使用的字符集相对应。
------------------------------------------ 请求转发 -------------------------------------------------------
1.通过request对象获取请求转发器对象:RequestDispatcher getRequestDispatcher(String path)
2.使用RequestDispatcher对象来进行转发:forward(ServletRequest request, ServletResponse response)
理解: "请求转发"一种在服务器内部的资源跳转方式;
特点: 资源路径不变; 只能转发到当前服务器内部资源中;
本质: 一次请求,访问到了多个资源(★)
链式写法(★): request.getRequestDispatcher("/另一个资源路径").forward(request, response);
------------------------------------------ 共享数据 -------------------------------------------------------
域对象: 一个有作用范围的对象,可以在范围内共享数据
request域: 一次请求的范围。一般用于在"请求转发"的多个资源中共享数据
setAttribute(String name,Object obj)
getAttribute(String name)
removeAttribute(String name)
-------------------------------------- 获取ServletContext对象 ---------------------------------------------
getServletContext()
▶ 最常用的方法
request的功能:
- 获取请求行(getContextPath、getServletPath、getRequestURI,getQueryString)
- 获取请求头(getHeader)
- 获取请求体(getReader / getInputStream)
request其他功能:
- 获取请求参数(getParameter)
- 请求转发(request.getRequestDispatcher("/另一个资源路径").forward(request, response))
- 共享数据(setAttribute / getAttribute)
- 获取ServletContext对象(getServletContext)
End ♬
by a Lolicon ✪