HTTP协议
1.定义
Http:超文本传输协议,客户端【浏览器】和服务器端进行通信的协议。
类似于发电报。是基于请求(request)与响应(response)模型的,一次请求必然会有一次响应。
2.协议格式:可以通过F12/ Fn+F12 调出浏览器的开发工具
1、请求的格式
1)请求行
GET /demo01?name=zhangsan HTTP/1.1
请求的方式:Http协议中,浏览器请求服务器7种请求格式,常用的只有两种GET/POST
GET:
1、请求的参数在请求行中,在url后面
2、请求的url长度有限制
3、不太安全
http://localhost/servlet02/demo01?name=zhangsan&age=10
要想获取参数的值:req.getParameter("name")
在浏览器中直接输入网址,敲回车,就是GET请求方式的一种。
即使使用表单提交数据,请求的url中自动的封装参数
http://localhost/servlet02/demo01?name=laoyan&password=sdfsdf
POST:
1、请求的参数在请求体中,不在请求行中
http://localhost/servlet02/demo01
2、url长度没有限制
3、相对安全
post请求一般都是通过编写一个表单才能发出来的请求。
2、HTTP协议 1.0 1.1版本 1.1版本的连接是长连接
2)请求头: 浏览器访问服务器时携带的其他信息
Host: localhost
Connection: keep-alive
Content-Length: 27
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
Origin: http://localhost
Content-Type: application/x-www-form-urlencoded
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,/;q=0.8,application/signed-exchange;v=b3;q=0.9
Sec-Fetch-Site: same-origin
Sec-Fetch-Mode: navigate
Sec-Fetch-User: ?1
Sec-Fetch-Dest: document
Referer: http://localhost/servlet02/login.html
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
Cookie: JSESSIONID=084E13F9A167EED0BE445DD51C9BB837; __guid=111872281.2075806226320622000.1626660648791.204; monitor_count=40
需要掌握的内容:
User-Agent: 浏览器告诉服务器,我访问你的时候用的浏览器版本是什么
Referer:访问你这个资源之前,我是在哪个页面的。防盗链
3)请求空行
就是一个空行,什么内容都没有,作用是区分上面的资源和请求体间隔
4)请求体
封装的就是post请求的数据,get请求没有请求体(get请求中的请求体都是空的)
name: laoyan
password: sdfsdf
2、响应的格式
3.HTTPServletRequest
1、req.getContextPath();
2、req.getRequestURI();
3、req.getRemoteAddr();
4、req.getHeader("请求头的Key");
5、req.getReader();//获取字符流
req.getInputStream(); //获取字节流
6、重点:
获取数据的三个API:
req.getParameter("name");
req.getParameterValues("hobby");
req.getParameterMap();
7、关于中文乱码的问题
GET 中文不乱码,Tomcat8.0之后,tomcat解决了我们get请求的中文乱码问题
POST 不管使用哪个版本,中文一般会乱码,在获取数据之前,指定请求的字符集
req.setCharacterEncoding("utf-8");
4.HTTPServletResponse
1、Http协议之response的协议格式
1)响应行
协议/版本 响应状态码 响应码的描述
HTTP/1.1 500
1、响应状态码一般都是一个三位数的数字 404 405 500 200
2、分类
1) 1xx: 服务器端接收浏览器的消息,但是没有接收完成,等待一段时间之后,就会出现1xx
2) 2xx: 成功,代表状态码200
3) 3xx: 重定向 302(重定向) 304(访问缓存)
4) 4xx: 客户端错误 404(服务器端访问的资源没有) 405(服务器端没有与之对应的方法)
5) 5xx: 服务器端错误 代表作:500(服务器内部出错了)
2)响应头
Content-Type: text/html;charset=utf-8
Content-Language: en
Content-Length: 1506
Date: Fri, 03 Sep 2021 01:33:46 GMT
Connection: close
内容说明:
Content-Type:服务器告诉浏览器本次响应的数据格式(text/html)以及编码格式(charset=utf-8)
Content-disposition:以什么样的格式打开响应体的数据
文件的下载
3)响应空行 分隔符
4)响应体 传输的数据
2、服务器端的数据要想传递给浏览器,我们有一个已经创建好的对象HttpServletResponse
常用方法:
resp.setStatus(302);//指定状态码
resp.setHeader("location","www.baidu.com");//设置header数据
resp.sendRedirect("www.baidu.com");//可以进行重定向
resp.getWriter();//获取字符流
resp.setCharacterEncoding("utf8");//设置字符集
resp.setContentType("text/html;charset=utf-8");//解决中文乱码问题,推荐使用该方案,一句中有两个作用。
// 上面那个setContentTyep方法其实就是下面的这种写法,两种都行,但是建议使用上面的
//resp.setHeader("Content-Type","text/html;charset=utf-8");
5.重定向和内部转发的区别
都是可以跳转界面
内部转发:
内部转发跳转界面:
1、只发送一次请求与响应
2、url地址不发生变化
3、数据可以传递
4、只能访问内部资源
req.getRequestDispatcher("/demo04").forward(req,resp);
重定向:
1、发送两次请求
2、url地址发生了变化
3、因为是两次不同的请求与响应,数据无法共享
4、可以访问外部资源
//resp.setStatus(302);//指定状态码
//resp.setHeader("location","www.baidu.com");
// 下面一句话就可以完成跳转,一句顶两句,推荐使用下面这种方式
resp.sendRedirect("www.baidu.com");
6.ServletContext对象
servlet的一个上下文对象。
如何获取该对象:
//如何获取ServletContext对象呢?
// 通过req对象获取
ServletContext servletContext = req.getServletContext();
//HttpServlet 对象获取
ServletContext servletContext1 = this.getServletContext();
用法:
1、可以获取MIME类型 ,通过我们的文件名的后缀,获取对应的MIME类型
tomcat 作为一个服务器,web.xml中定义了N多种文件后缀对应的MIME类型
tomcat下的web.xml是一个总的web.xml ,我们每一个项目中的web.xml都是tomcat下的web.xml的子文件,
它拥有父类的全部功能,并且可以拓展功能
getMimeType
2、可以获取共享数据 -- 所有用户的所有请求,能设置数据的对象都称之为域对象
你在项目中设置了一个数据
servletContext.setAttribute("name","张三");
servletContext.getAttribute("name");
在我们web项目中有多个域对象,但是表示的范围不同。
3、可以获取文件所在目录的绝对路径
servletContext.getRealPath("/a.jpeg");
获取到的路径是编译完之后的文件所在路径,而不是源代码中的文件的路径
E:\Java2108\coding\ServletDemo03\out\artifacts\ServletDemo03_war_exploded\a.jpeg
补充:
在web.xml中可以定义项目启动后,首页是什么?
会从第一个文件开始查找,找不到,就展示第二个,第二个找不到依次找下去,如果都找不到,报404错误。
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>