JavaWeb学习第三天:
http协议:
网络之间传输信息,通讯需要遵守协议。
例如你要传输一个123数据,它会一层一层给你把数据封装,然后在解封装,最后你看看的就是123.
HTTP 协议一般指 HTTP(超文本传输协议)。
超文本传输协议(英语:HyperText Transfer Protocol,缩写:HTTP)是一种用于分布式、协作式和超媒体信息系统的应用层协议,是因特网上应用最为广泛的一种网络传输协议,所有的 WWW 文件都必须遵守这个标准。
HTTP是一个基于TCP/IP通信协议来传递数据(HTML 文件, 图片文件, 查询结果等)。
注意:
http在传输数据之前先要建立连接
http协议是基于TCP协议
http 在传输数据之前先要建立连接
发送http请求
http协议不同的版本
三个版本
http1.0
连接不可以复用(只用一次)
客户端发送请求到服务器
建立连接
传输数据
关闭连接
浏览器展示数据
http1.1
连接可复用
客户端发送请求到服务器
建立连接
传输数据
传输数据
关闭连接
浏览器展示数据
http2.0
HTTP是无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。
http请求之间不能共享数据
get请求和post请求的区别
1. get请求请求参数是放在浏览器地址栏中提交的 post请求的请求参数是放在请求体中
2. get请求相对不安全,post请求相对安全
3. get请求提交的请求数据大小有限制4kb post请求没有大小限制(文件上传)
2.HttpServletrequest
1. 获取客户端传过来的三部分信息
分别是请求行,请求头和请求体
代码如下:
package com.swlz.request; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; @WebServlet("/requestDemo") public class RequestDemo extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // System.out.println("处理get请求"); //请求行相关方法 请求行信息获取 String method = req.getMethod(); System.out.println("请求方式"+method); String requestURL = req.getRequestURL().toString(); System.out.println("请求路径URL"+requestURL);//http://localhost:8080/tomcat/requestDemo String requestURI = req.getRequestURI(); System.out.println("请求路径URI"+requestURI);///tomcat/requestDemo String protocol = req.getProtocol(); System.out.println("请求协议"+protocol); //请求头信息获取:从浏览器传到服务器中去,一般是浏览器告诉服务器本次请求的基本信息 // GET /tomcat/requestDemo?username=admin&password=12345 HTTP/1.1 // Host: localhost:8080 // Connection: keep-alive // Upgrade-Insecure-Requests: 1 // 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:8080/tomcat/ // Accept-Encoding: gzip, deflate, br // Accept-Language: zh-CN,zh;q=0.9 // Cookie: Hm_lvt_1cd9bcbaae133f03a6eb19da6579aaba=1632280557; username=admin; rememberMe=true; password=cRM1L2ln+WnKDx+fqJmgc+ZdVQKlLP/IzLXKMBx5bdBuMofh/Z4t0r50cE0js72EE2zmJUkl7NhNQTrfd2d6Ug==; qx=AC8E9B7B1BC008998D7EF3CE50A0A9C3 // req.getHeader(" ") String host = req.getHeader("Host"); System.out.println("Host"+host); //http1.1支持长连接 String connection = req.getHeader("Connection"); System.out.println("connection"+connection); //告诉服务器本次请求的浏览器版本信息 String header = req.getHeader("User-Agent"); System.out.println("User-Agent"+header); //告诉服务器本次请求响应的数据格式 String accept = req.getHeader("Accept"); System.out.println("Accept"+accept); //Referer 告诉服务器本次请求的来源http://localhost:8080/tomcat/ 防盗链 // 防盗链:防止其他人随便跳到你的网页中来 String referer = req.getHeader("Referer"); System.out.println("Referer"+referer); String header1 = req.getHeader("Accept-Encoding"); System.out.println("Accept-Encoding"+header1); String header2 = req.getHeader("Accept-Language"); System.out.println("Accept-Language"+header2); String cookie = req.getHeader("Cookie"); System.out.println("cookie:"+cookie); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("处理post请求"); } }
获取请求参数的时候,由于get请求和post请求参数所在的位置不一样,所有导致我们get请求和post请求处理代码也不一致
2. 获取请求参数相关的方法
httpServeltRequest对象总又给我们封装了一些方便的统一获取请求参数的方法对get和post都适用
package com.swlz.request; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.Map; import java.util.Set; @WebServlet("/servletRequestDemo1") public class ServletRequestDemo1 extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //获取请求参数username和password // request.getParameter("username"); 根据参数名称获取唯一的参数值 String username = request.getParameter("username"); String password = request.getParameter("password"); //复选框 getParameterValues("hobby"); 根据参数名称获取一个或者多个参数值 String[] parameterValues = request.getParameterValues("hobby"); System.out.println(username+":"+password); System.out.println(parameterValues[0]+":"+parameterValues[1]); //ParameterMap的键对应的是你请求参数的名字,值对象的是你请求参数的值(数据) 一次获取所有请求参数 //request.getParameterMap();一次获取所有请求参数 map的key是请求参数的名称 value请求参数值所对应的数组 Map<String, String[]> parameterMap = request.getParameterMap(); Set<String> keySet = parameterMap.keySet(); for (String key : keySet) { //通过键得到值 String[] values = parameterMap.get(key); System.out.println(key+":"+values); } } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //获取请求参数username和password // String username = request.getParameter("username"); // String password = request.getParameter("password"); // System.out.println(username+":"+password); doPost(request,response); } }
1. 请求乱码问题
注意:
Post请求中文乱码解决
package com.swlz.request; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; //乱码问题 浏览器跟服务器不用的编码表不一样 @WebServlet("/servletRequestDemo2") public class ServletRequestDemo2 extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("utf-8");//设置服务器编码格式 设置request缓冲区的编码格式 在获取请求参数之前设置编码格式 String username = request.getParameter("username"); System.out.println("username:"+username); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request,response); } }
Get请求中文乱码在tomcat8.5之后自动解决,在tomcat8之前会有乱码问题
今日学习感受:多去理解,多敲代码,多去思考,多去自己动手,争取不要看教程,把它成你自己的对象,这样印象深刻一点,不然学完很容易忘记。最后一句话:千里之行,始于足下。