HTTP协议笔记(小白学习笔记)

一、什么是HTTP协议

什么是协议?
协议是双方或多方相互之间约定好,大家都需要遵守的规则。叫协议。
什么是HTTP协议?
HTTP(hypertext transport protocol),即超文本传输协议。这个协议详细规
定了浏览器和万维网服务器之间互相通信的规则。
HTTP协议是客户端和服务器之间通信时数据都需要遵守的规则。
客户端和服务器之间数据通信的内容,也叫报文。
HTTP就是一个通信规则,这个规则规定了客户端发送给服务器的报文格式,
也规定了服务器发送给客户端的报文格式。实际我们要学习的就是这两种报文。
客户端发送给服务器的称为”请求报文“,服务器发送给客户端的称为”响应报文“

二、请求的协议格式

请求的HTTP协议格式

请求首行;
请求头信息;
空行;
请求体;
GET请求协议格式
在这里插入图片描述
POST请求协议格式
在这里插入图片描述

三、get请求和post请求都分别是哪些操作?

GET请求
1)、在浏览器地址栏中输入地址直接按回车
2)、点击超链接
3)、GET请求表单提交
4)、script src=””,引入外部文件
5)、img src=”路径”,引入图片
6)、引入外部css。。。
POST请求
1)只有表单提交的时候method=post,提交表单就是发post请求

四、响应的协议格式

响应的HTTP协议格式
响应首行
响应头信息
空行
响应体
在这里插入图片描述

五、常见的响应码

响应码对浏览器来说很重要,它告诉浏览器响应的结果;
200:请求成功,浏览器会把响应体内容(通常是html)显示在浏览器中;
404:请求的资源没有找到,说明客户端错误的请求了不存在的资源;
500:请求资源找到了,但服务器内部出现了错误;
302:重定向,当响应码为302时,表示服务器要求浏览器重新再发一个请求,服务器会发送一个响应头Location,它指定了新请求的URL地址;

六、MIME类型

MINE是HTTP协议中数据类型。
MIME的英文全称是"Multipurpose Internet Mail Extensions" 多功能Internet 邮件扩充服务。MIME类型的格式是“大类型/小类型”,并与某一种文件的扩展名相对应。

常见的MIME类型:

文件MIME类型
超文本标记语言文本.html,.html text/html
手机$12
导管$1
普通文本.txt text/plain
RTF文本.rtf application/rtf
GIF图形.gif image/gif
JPEG图形.jpeg,.jpg image/jpeg
au声音文件.au audio/basic
MIDI音乐文件mid,.midi audio/midi,audio/x-midi
RealAudio音乐文件.ra, .ram audio/x-pn-realaudio
MPEG文件.mpg,.mpeg video/mpeg
AVI文件.avi video/x-msvideo
GZIP文件.gz application/x-gzip
TAR文件.tar application/x-tar

七、HttpServletRequest类介绍(重****点)

HttpServletRequest类封装了从客户端传递过来的信息。每次请求,Tomcat都会把客户端请求的信息封装在一个HttpServletRequest对象实例传递到service请求的方法中让我们使用

八、Request对象常用方法(重****点)

getRequestURI() 获取请求的资源路径
getRequestURL() 获取请求的统一资源定位符
getRemoteHost() 获取请求的客户端ip地址
getHeader() 获取请求头信息
getParameter() 获取请求参数值
getParameterValues() 获取请求的多个值(常用于复选框和下拉列表多选)。
getRequestDispatcher() 获取请求的转发对象。转发请求(转发的请求和原请求共享request对象和response对象)
getMethod() 获取请求的方式GET 或 POST

setAttribute(key, value); 设置Request请求范围的属性值。
getAttribute(key); 获取Request请求范围的属性值。

getCookies()					获取Cook对象
getSession()					获取或创建Session对象

九、Request对象的常用方法测试代码:

1.获取请求的资源路径
2.获取请求的统一资源定位符
3.获取请求的客户端ip地址
4.获取请求头信息
5.获取请求的方式GET 或 POST

package com.kgc.javaweb.demo03.servlet;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class Request1
 */
@WebServlet("/Request1")
public class Request1 extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public Request1() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// Request的常用方法
		// 获取请求的资源路径
		System.out.println("getRequestURI==>>" + request.getRequestURI());
		// 获取请求路径的统一资源定位符
		System.out.println("getRequestURL==>>" + request.getRequestURL());
		// 获取客户端的ip地址
		System.out.println("getRemoteHost==>>" + request.getRemoteHost());
		// 获取请求头的信息。
		System.out.println("getHeader('User-Agent')==>>"	+ request.getHeader("User-Agent"));
		// 获取请求方式GET或 POST
		System.out.println("getRemoteHost==>>" + request.getMethod());
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

十、获取请求参数的值 (重*****点,无条件必须掌握)

1)请求的页面 register.html 内容

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<form action="http://127.0.0.1:8080/javaweb-demo03/Request2" method="get">
			用户名:<input name="username" type="text" /><br/>
			密 码:<input name="password" type="password" /><br/>
			兴趣爱好:
				<input name="hobby" type="checkbox" value="c" />C
				<input name="hobby" type="checkbox" value="cpp" />C++
				<input name="hobby" type="checkbox" value="java" />java
				<input name="hobby" type="checkbox" value="php" />php
				<br/>
			<input type="submit" />
	</form>
</body>
</html>
package com.kgc.javaweb.demo03.servlet;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class Request2
 */
@WebServlet("/Request2")
public class Request2 extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public Request2() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//获取客户端传递过来的用户名参数值
		String username = request.getParameter("username");
		System.out.println("用户名:" + username);
		
		// 获取密码
		String password = request.getParameter("password");
		System.out.println("密码:" + password);
		
		// 获取兴趣爱好,这个方法只能获取到一个兴趣爱好。
//				String hobby = request.getParameter("hobby");
//				System.out.println("getParameter得到的兴趣爱好:" + hobby);
		
		// 如果获取的参数有多个值的情况下。我们都使用getParameterValues方法来获取
		// 因为它可以获取到多个值。而getParameter只能获取到一个值。
		String[] hobbys = request.getParameterValues("hobby");
		if (hobbys != null) {
			for (String hb : hobbys) {
				System.out.println("getParameterValues兴趣爱好:"  + hb);
			}
		}
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

十一、GET请求中文参数值乱码问题解决(重****点)。

解决乱码的核心思路,就是把得到的乱码按照原来乱码的步骤逆序操作。
1、先以iso-8895-1进行编码
2、然后再以utf-8进行解码

username = new String(username.getBytes("ISO-8859-1"), "UTF-8");
		System.out.println("乱码解决后用户名:" + username);

解决GET请求中文乱码第二种方案:
找到你Eclipse中的Tomcat的配置文件server.xml,找到Connector标签,添加URIEncoding=”UTF-8” 属性

<Connector URIEncoding="UTF-8" connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>

十二、POST请求中文参数值乱码问题解决(重*****点)

post请求方式乱码的原因是:Tomcat服务器对参数的默认编码是ISO-8859-1
POST请求乱码解决,只需要在获取请求参数之前调用 request.setCharacterEncoding(“UTF-8”); 方法设置字符集 即可。

// 1.post请求方式的数据是以二进制流的形式发送到服务器。
		// 2.那么就说明它缺少一个字符集。所以我们要设置请求体的字符集即可。
		// setCharacterEncoding必须要获取请求参数之前调用才有效
		request.setCharacterEncoding("UTF-8");

十三、请求转发(重*****点)

问题:什么是请求的转发?

在这里插入图片描述
请求转发的具体实现代码

package com.kgc.javaweb.demo03.servlet;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class Request3
 */
@WebServlet("/Request3")
public class Request3 extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public Request3() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setAttribute("username", "admin");
		request.getRequestDispatcher("/Request4").forward(request, response);
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}
package com.kgc.javaweb.demo03.servlet;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class Request4
 */
@WebServlet("/Request4")
public class Request4 extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public Request4() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		String username = request.getAttribute("username").toString();
		System.out.println(username);
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

十四、Base标签

index.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<form action="http://localhost:8080/javaweb-demo03/Servlet01" method="post">
		<input type="text" name="username"/>
		<input type="submit" value="提交"/>
	</form>
	<hr/>
		这是WebContent目录下的index.html页面<br/>
		<a href="a/b/c.html">跳到a/b/c.html页面</a><br/>
		<a href="http://localhost:8080/javaweb-demo03/forwardC">通过转发到a/b/c.html页面</a>
		<br/>
		<br/>
		<br/>
		<a href="/">斜杠</a>
</body>
</html>

a/b/c.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	这是a/b/c.html页面<br/>
	<a href="../../index.html">跳回index.html页面</a>
</body>
</html>

forwardC

package com.kgc.javaweb.demo03.servlet;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class forwardC
 */
@WebServlet("/forwardC")
public class forwardC extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public forwardC() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.getRequestDispatcher("/a/b/c.html").forward(request, response);
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

当通过Servlet转发跳转的页面再返回时报404的错误,原因分析如下

在这里插入图片描述
解决方案
在C.html中添加base标签,指定相对路径参考页面

<base href="http://localhost:8080/javaweb-demo03/a/b/c.html">

十五、Web中的相对路径和绝对路径

Web的路径是:
相对路径:
. 当前目录
… 上一级目录
资源名 ./资源名 ./可以省略
绝对路径:
http://ip:port/工程名/资源名
1、在实际开发中,不允许简单的使用相对路径进行开发
2、在实际开发中,都必须使用绝对路径。
http://ip:port/工程名/资源名
base标签+相对路径
斜杠打头的地址

十六、web中/斜杠的不同意义

在web中 /斜杠 就是绝对路径。
/斜杠 被html浏览器解析的时候,地址是:http://ip:port/
/斜杠  如果在服务器代码中被解析。则得到的地址是:http://ip:port/工程名/
	比如说:
	servletContext.getRealPath(“/”);	
	表示到http://ip:port/工程名/		
	映射到代码的WebContent目录
	request.getRequestDisapcher(“/servlet2”);   
	也表示到http://ip:port/工程名/		
	映射到代码的WebContent目录	
注意:
	特殊情况是:
	response.sendRedirect(“/”);		表示:http://ip:port/

十七、HttpServletResponse类介绍(重****点)

Response对象封装了服务器到客户端返回的信息。

十八、获取输出流

getOutoutStream() 拿到的是二进制流。主要用于返回二进制数据。比如说下载,图片验证码等。
getWriter() 拿到字符流。大部分的返回都用writer。
这两个输出流,我们不能同时获取两个,只能使用一个做为返回。
只要同时获取两个输出流就会报错,不管你是先获取二进制输出,还是先获取字符串输出流。

十九、如何往客户端回传数据

  1. 往客户端输出。分两个步骤:
    第一步:先获取输出流(二进制返回用获取字节流,字符出获取字符流)
    第二步:调用输出流对象,写出数据第客户端
	protected void doGet(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		// 通过response响应对象获取到字符输出流
		Writer writer = response.getWriter();
		// 往 客户 端 输出数据。
		writer.write("this is response content!");
	}

二十、输出中文到客户端的乱码解决方法

遇到这种情况是什么原因呢?主要是因为服务器输出的字符串的编码和客户端显示字符串的编码不一致。导致乱码问题。所以我们只需要设置服务器和客户端的编码相同就可以解决这个问题。
方案一(不推荐使用):

		// 设置服务器端字符集为UTF-8
		response.setCharacterEncoding("UTF-8");
		// 通过设置响应头,让客户端也使用UTF-8字符集
		response.setHeader("Content-Type", "text/html; charset=UTF-8");

方案二(推荐使用):

		// 同时设置客户端和服务器都统一使用UTF-8字符集,还设置了响应头
		// 此方法一定要在获取流之前调用 才有效
		response.setContentType("text/html; charset=UTF-8");

二十一、如何设置响应头和响应状态码

请求重定向,是指从一次请求结果,获取信息,再请求到另一个资源。这种行为叫请求重定向。
方式一:

		// 设置响应状态码
		response.setStatus(302);
		// 设置响应头
		response.setHeader("Location", "http://localhost:8080/day07/Response2");

方式二:

		// 设置请求重定向
	response.sendRedirect("http://www.baidu.com");

在这里插入图片描述

二十二、请求转发和重定向的对比

/转发重定向
浏览器地址栏没有变化有变化
几次请求1次请求2次请求
APIrequestresponse
WEB-INF可以访问WEB-INF下的资源不能访问WEB-INF下的资源
共享request请求域数据可以不可以
目标资源只能访问当前工程以内的资源可以访问工程外的资源

1、看需求
(1)我要访问WEB-INF里面的内容 === 请求转发
(2)我要访问http://www.baidu.com === 请求重定向

2、在请求转发和请求重定向都可以跳转的情况下
(1)优先使用请求转发 (因为快 , SpringMVC底层默认也是使用请求转发)
(2)请求转发出bug,再排查,不行,再使用重定向。
(3)跳到首页(一般使用重定向,注销功能)

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值