http协议
一. Request请求
1.请求消息数据格式
①请求行
请求方式 请求url 请求协议/版本
②请求头
请求头名称:请求头值
③请求空行:空行,做分割功能
④请求体(正文)
参数名称=参数值
POST /login.html HTTP/1.1
Host: localhost
User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:60.0) Gecko/20100101 Firefox/60.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate 允许的打包方式
Referer: http://localhost/login.html
Connection: keep-alive
Upgrade-Insecure-Requests: 1
username=zhangsan
uer-Agent:浏览器告诉服务器,浏览器版本信息(可在服务器获取改头信息,解决兼容性问题)
referer: 告诉服务器,我从哪里来? (功能:1.防盗链2.统计工作)
2.request原理
①tomcat服务器根据url中的资源路径,创建对应的servlet对象
②tomcat服务器,创建request和response对象,request对象封装请求消息数据
③tomcat将request和response对象传递给service方法,并调用
④程序员可以通过request对象获得请求消息数据,通过response对象设置响应消息数据
⑤服务器在给浏览器响应之前,会从response对象中获得响应消息数据
3.request对象功能
url: http://localhost:8080/visualPath/project.do?username=zhangsan&password=123
①获得请求消息数据
获取请求行数据:
●String getMethod():获得请求方式
●String getContextPath(): 获得虚拟目录 /visualPath
●String getservletPath(): 获得servlet路径 /visualPath/project.do
●String getQueryString(): 获得get方式请求参数
●String getRequestURI(): 获得请求URI
●String getProtocol(): 获得协议及版本
●String getRemoteAddr(): 获得客户机的IP地址
获得请求头数据:
●String getHeader(String name): 通过请求头名称获得请求头的值
●Enumeration<String> getHeaderNames():获得所有请求头
获得请求体数据(只有post请求方式才有请求体):
①获取流对象
●BufferedReader getReader():获得字符流
●SevletInputStream getInputStream():获得字节流,一般用在文件上传中
②再从流对象中拿数据
②其他功能
获取请求参数通用方法
●String getParameter(String name):根据参数名称获取参数值
●String[] getParameterValues(String name):根据参数名称获得参数值数组 ,一般用来获得checkbox的值
●Enumeration<string> getParameterNames():获得所有请求的参数名称
●Map<String,String[]> getParameterMap():获得所有参数的Map集合
中文乱码问题
●get方式:tomcat 8 已经将get方式乱码问题解决了
●post方式:会乱码
解决:在获取参数前,设置request的编码request.setCharacterEncoding("utf-8");
请求转发(一种在服务器内部资源跳转的方式)
①步骤
●通过request对象获得请求转发器对象:RequestDispatcher
getRequestDispatcher(String path)
●使用RequestDispatcher对象来进行转发:forward(ServletRequest request, ServletResponse response)
②特点:
1. 浏览器地址栏路径不发生变化
2. 只能转发到当前服务器内部资源中。
3. 转发是一次请求
共享数据(域对象)
域对象:一个有作用范围的对象,可以在范围内共享数据
request域:代表一次请求的范围,一般用于请求转发的多个资源中共享数据
方法:
●void setAttribute(String name,Object obj):存储数据
●Object getAttitude(String name):通过键获取值
●void removeAttribute(String name):通过键移除键值对
注:web中有4个对象可以可以做到共享数据,并且均有上述三个方法,有
Request:作用范围是一次请求内,可以理解为,只有转发才用到request对象
Session:作用范围是一次会话
servletContext:作用范围:整个项目
pageContext:作用范围:当前页面
4.BeanUtils工具类
●populated(Object obj,Map map):将map中的数据放到obj中
●setProperty(String key,String name,String value):给obj中的name属性赋值value
●getProperty(Object obj,String name):得到obj中的name属性的值
二. Response响应
1.数据格式
①响应行
协议/版本 响应状态码 状态码描述
注:
响应状态码:
●1xx:服务器接收客户端消息,但没接收完,等一段时间后,发送1xx状态码
●2xx:成功.代表:200
●3xx:重定向.代表:302(重定向),304(访问缓存)
●4xx:客户端错误.代表:404(请求路径没有对应的资源)
405(请求方式没有对应的doXxx方法)
●5xx:服务器端错误.代表:500(服务器内部出现异常)
②响应头
头名称:值
●Content-Type:服务器告诉客户端(浏览器)本次响应体的数据格式(text/html)及编码方式(utf-8,gbk,iso-8859-1)
●Content-disposition:服务器告诉客户端以什么方式打开响应体数据
值:
*in-line:默认,当前页面打开
*attachment:filename=xxx以附件形式打开响应体.如文件下载
●locaiton:可以给浏览器一个地址,可以配合302状态码完成重定向的动作
③响应空行
④响应体
2. response对象
①功能:设置响应消息
●设置响应行
格式:HTTP/1.1 200 ok
设置状态码:setStatus(int sc)
●设置响应头:setHeader(String name, String value)
●设置响应体:
* 使用步骤:
i 获取输出流
* 字符输出流:PrintWriter getWriter()
* 字节输出流:ServletOutputStream getOutputStream()
ii 使用输出流,将数据输出到客户端浏览器
②重定向
●方式1
(1)设置状态码:response.setStatus(302)
(2)设置路径:response.setHeader(“location”,”路径”)
●方式2
Response.sendDirecter(”路径”)
重定向与转发的区别
重定向 转发
地址栏 地址改变 地址不变
访问范围 可访问其他服务器资源 只能访问本服务器资源
至少两次访问,不能使用request共享数据 一次访问,可以使用request共享数据
③路径
●相对路径:通过相对路径不可以确定唯一资源(html)
规则:找到访问当前资源和目标资源之间的相对位置关系
./:当前目录 ../:后退以及目录
●绝对路径:以/开头的路径, 通过绝对路径可以确定唯一资源(jsp)
规则:判断定义的路径是给谁用的?判断请求将来从哪儿发出
* 给客户端浏览器使用:需要加虚拟目录(项目的访问路径)
* 建议虚拟目录动态获取:request.getContextPath()
* <a> , <form> 重定向...
* 给服务器使用:不需要加虚拟目录,,,,转发
* 转发路径
④乱码问题
1. PrintWriter pw = response.getWriter();获取的流的默认编码是ISO-8859-1
2. 设置该流的默认编码
Request.setCharactEncoding(“编码方式”);
3. 告诉浏览器响应体使用的编码
Response.setHeader(“content-type”,”text/html;charset=utf-8”);
●简单的形式,设置编码,是在获取流之前设置
response.setContentType("text/html;charset=utf-8");
3.servletContext对象
①概念
代表整个web应用,可以和程序的容器通信.
可以通过request对象获取
●Request.getServletContext();
●This.getServletContext()
●getServletContext()
②功能
●获取MIME类型
可以让浏览器用指定引擎解析你的数据
MIME类型:互联网通信过程中定义的一种文件数据类型
格式:大类型/小类型 text/html
String getMimeType(String file)
●域对象:共享数据
作用范围:所有用户所有请求数据
方法:
SetAttribute(string name,Object obj)存储
getAttribute(String name) 得到
removeAttribute(String name) 删除
●获取文件的真实路径(服务器路径)
String GetRealPath(String filename)
其实为file,自己创建的流服务的,原因是file或者自己创建的流不能采用相对路径,不然都相对于tomcat/bin目录下,这时一定要用绝对路径,二绝对路径通过servletContext对象来获取,因为它可以读取catelina/local/xxx.xml中的docBace,使用servletContext的getRealPath()方法获得绝对路径,即获得项目的out目录.
●获取全局参数
全局参数在web.xml中使用<context-param></context-param>来创建全局参数
通过调用servletContext的getInitParameter(参数名称)获得指定的全局参数的值或者getInitParameters()来获得所有的全局参数的值.
|
|