HTTP协议 Request请求对象
http协议
概述
协议:规定了被约束对象都需要去遵守的规则
http协议:是互联网上运用最为广泛的一种浏览器和服务器之间的协议(合同)
这份合同规定了浏览器访问服务器要遵循的内容以及服务器响应浏览器要遵循的内容
作用
强制规定了只要浏览器访问服务器就要传递哪些内容以及这些内容传递时的格式
强制规定 了只要服务器响应浏览器要响应哪些内容以及这些内容响应时的格式
协议规定的内容(抓包工具)
请求内容:浏览器发送给服务器的数据(今天)
响应内容:服务器响应给浏览器的数据 (明天)
请求内容
请求内容:
请求行(第一行) 请求头(key:value) 请求体(表单的的内容)
注意:对于请求内容
get提交没有请求体 所有的表单的数据都在请求行中(地址栏中)
post提交有请求体 所有的表单数据都在请求体中(不在地址栏中)
面试题 get提交和post提交的区别?
get提交没有请求体 所有的页面数据都在请求行中 会在地址栏中暴露 不安全
post提交有请求体 所有的页面数据都在请求体中 不会地址栏中暴露 安全
get提交有着大小的限制 post没有大小的限制
什么情况下访问服务器是get提交? 什么情况下访问服务器时post提交?
浏览器只要和服务器交互 只有将表单的method设置成post才属于post提交,其它的一律是get提交
http请求协议的组成内容
请求行 请求头 请求体
请求行
请求方式 请求资源 协议版本 POST /day_02/sd1 HTTP/1.1
请求头
数据的格式:键值对的数据
掌握的头数据:Referer User-Agent
Referer:当前页面的来源地址 防盗链
User-Agent:用户的浏览器版本信息
请求体
只有post提交才有 是页面表单的数据要传递给服务器的内容
问:请求行 请求头 请求体的数据最终都要传递给服务器 服务器如何获取到这些数据?
请求行 请求头 请求体会随着请求封装request对象中,所以我们在服务器端只要使用提供好的request对象调用api即可获取到
request请求对象
概述
request对象代表浏览器端的请求,当浏览器端通过HTTP协议访问服务器时,HTTP请求中的所有
信息都封装在这个对象中,开发人员通过这个对象的api,可以获得客户通过浏览器传递过来的数据
作用
作用:用来封装所有页面数据(请求行 请求头 请求体)
1.获取请求行的数据
2.获取请求头的数据
3.获取请求体的数据
1.获取请求行数据的api概述(请求方式 访问的资源 协议版本)
1.(了解)String getMethod() 获取请求方式
2.(了解)String getRequestURI() 获取请求行中的资源名部分
3.(掌握)StringBuffer getRequestURL() 获取客户端请求完整URL
4.(了解)String getProtocol() 获取请求协议和版本
5.(了解)int getLocalPort() 获取端口
6.(掌握)String getRemoteAddr() 获取请求者的ip地址
Localhost:ipv6
127.0.0.1:ipv4
7.(掌握)String getContextPath() 例如:/day_02
2.获取请求头数据的api概述 (键值对key/value的数据)
1.getHeader(String key) 根据请求头的key获取value
例如:Referer可以获取到来源地址(没有来与为null:直接访问) 防盗链
例如:User-Agent可以获取用户的浏览器版本信息 下载
2.(了解)Enumeration getHeaderNames() 返回此请求包含的所有头名称
3.获取请求体数据api概述(所有浏览器提交的表单数据)
1.String getParameter("name的属性名")
2.String[] getParameterValues("name的属性值")
3.Map<String,String[]> getParameterMap()
注意:key:对应的是表单中name属性名
在提交表单的过程中,如果有中文 get提交没问题 但是post提交会乱码
解决方案:request.setCharacterEncoding("utf-8");
4.request请求对象的其它作用
作为容器数据存取删的方法:(request也被称为域对象)
1.void setAttribute(String name, Object o) 存储数据
2.Object getAttribute(String name) 获取数据
3.void removeAttribute(String name) 移除数据
注意:request这3个方法也可以做多个servlet之间的数据传递?
问题:当我们浏览器访问2个不同的servlet的时候,发现并不能得到我们想要的获取数据效果
原因:请求一次就创建一个request对象,响应就销毁,要想用同一个request对象,得学习请求转发
解决:使用请求转发
请求转发:可以在一个servlet中访问另外一个servlet
request.getRequestDispatcher("/servlet的地址").forward(request,response);
BeanUtils工具包的使用
需求:在开发的过程中,我们经常性的会有需求将map的数据转给对象属性,如果自己来做转化实现的话过于麻烦,我们可以借助第三方的工具包来实现,操作简单方便
BeanUtis工具包的使用
1 导包 commons-beanutils-1.8.3 commons-logging-1.1.1
2 调用api方法 BeanUtils.populate(对象,map);
注意:只有map(key)和对象(属性)共同的内容 才会封装