HTTP协议

什么是协议
双方或多方相互约定要遵守的规则叫做协议
HTTP协议就是客户端和服务端通信时发送的数据需要遵守的规则。
HTTP协议中的数据叫做报文

请求的HTTP协议格式
请求行:基础设置①请求的方式GET或POST
②请求的路径 /hello/abc
③请求协议和版本号HTTP/1.1
请求头:扩展设置,键值对类型数据常见的有:
Accept: 表示客户端可以接收的数据类型
Accpet-Languege: 表示客户端可以接收的语言类型
User-Agent: 表示客户端浏览器的信息
Host: 表示请求时的服务器 ip 和端口号
请求体(get没有请求体,参数拼接在url后面):数据主体前端表单收集的用户输入的具体信息,就是发送给服务器的主体数据
响应的HTTP协议格式
响应行:基础设置①响应的协议和版本号 HTTP/1.1
②响应的状态码 200、404 等
③响应状态描述符 OK、Not Found等
响应头:扩展设置,键值对类型常见的有:
Server:表示服务器的信息
Content-Type:响应体的数据类型
Content-Length:响应体的长度
Date:请求响应的时间
响应体:数据主体服务器回传给客户端的具体数据

GET

GET

POST

POST

响应

响应

常用响应码

类别原因短语
1xxInformational(信息性状态码)接受的请求正在处理
2xxSuccess(成功状态码)请求正常处理完毕
3xxRedirection(重定向)需要进行附加操作以完成请求
4xxClient error(客户端错误)客户端请求出错,服务器无法处理请求
5xxServer Error(服务器错误)服务器处理请求出错
200OK请求成功
204No Content服务器接收的请求已成功处理,但返回的响应报文中不含实体的主体部分,即无资源可返回
一般在只需从客户端往服务器发送信息,而对客户端不需要发送新信息内容的情况下使用
301Moved Permanently永久重定向(请求的资源已被分配新的URL,以后应使用资源现在所指的URL)
302Found临时重定向(请求的资源已被分配新的URL,希望用户本次使用新的URL)
304Not Modified客户端发送附带条件的请求时,,服务器端允许请求访问资源,但请求未满足条件。304其实与重定向没有关系
400Bad Request请求报文中存在语法错误
401unauthorized表示发送的请求需要有通过 HTTP 认证的认证信息
403Forbidden对请求资源的访问被服务器拒绝了
404Not Found服务器上无法找到请求的资源
500Internal Server Error服务器在执行请求时发生错误
503Service Unavailable服务器暂处于超负载或正在进行停机维护,现在无法处理请求

HttpServletRequest和HttpServletResponse类

在这里插入图片描述
HTTPServletRequest类的作用

每次有请求进入到Tomcat服务器中时,Tomcat服务器就会将请求过来的HTTP协议信息解析好封装到Request对象中,然后传递到service方法(doGet和doPost)供我们使用。HttpServletRequest对象可以获取到所有请求信息

HTTPServletRequest类的常用方法

方法作用
getRequestURI()获取请求的资源路径
getRequestURL()获取请求的统一资源定位符(绝对路径)
getRemoteHost()获取客户端的 ip 地址
getHeader()获取请求头
getParameter()获取请求的参数
getParameterValues()获取请求的参数(多个值的时候使用)
getMethod()获取请求的方式 GET 或 POST
setAttribute(key, value)设置域数据
getAttribute(key)获取域数据
getRequestDispatcher()获取请求转发对象

用法

Servlet程序

@Override
protect void doGet(HttpServletRequest req,HttpServletResponse resp)throws ServletException,IOException{
    req.getRequestURI();
    req.getMethod();
    String username =req.getParameter("username");
    req.getParameter("password");
    String[] hobby =req.getParameterValues("hobby")
    System.out.println("兴趣爱好"+(Arrays.asList(hobby));
}

表单

<body> 
    <form action="http://localhost:8080/07_servlet/parameterServlet" method="get"> 
        用户名:<input type="text" name="username"><br/> 
        密码:<input type="password" name="password"><br/> 
        兴趣爱好:<input type="checkbox" name="hobby" value="cpp">C++ 
        <input type="checkbox" name="hobby" value="java">Java
        <input type="checkbox" name="hobby" value="js">JavaScript<br/>
        <input type="submit"> 
        </form> 
</body>

解决乱码问题

doGet请求乱码  
//先用iso8859-1编码 再用UTF-8解码 String
username=req.getParameter("username"); 
username=new String(username.getBytes("iso-8859-1·"),"UTF-8)

doPost请求乱码 
//直接设置请求体的字符集为UTF-8 
req.setCharacterEncoding("UTF-8");

请求转发

服务器收到请求后,从一个资源跳转到另一个资源的操作叫做请求转发

RequestDispatcher reqDisp=req.getRequestDIspatcher(“/servlet2”);
reqDisp.forward(req,resp);

在这里插入图片描述

Servlet1程序:
public class Servlet1 extends HttpServlet { 
    @Override 
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 
        // 获取请求的参数(办事的材料)查看 
        String username = req.getParameter("username"); 
        System.out.println("在 Servlet1(柜台 1)中查看参数(材料):" + username); 
        // 给材料 盖一个章,并传递到 Servlet2(柜台 2)去查看 
        req.setAttribute("key1","柜台 1 的章"); 
        // 问路:Servlet2(柜台 2)怎么走 
        //请求转发必须要以斜杠打头,/ 斜杠表示地址为:http://ip:port/工程名/ , 映射到 IDEA 代码的 web 目录
        RequestDispatcher requestDispatcher = req.getRequestDispatcher("/servlet2"); 
        // RequestDispatcher requestDispatcher = req.getRequestDispatcher("http://www.baidu.com"); 
        // 走向 Sevlet2(柜台 2) 
        requestDispatcher.forward(req,resp);
    } 
} 

Servlet2程序: 
public class Servlet2 extends HttpServlet { 
    @Override 
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 
        // 获取请求的参数(办事的材料)查看 
        String username = req.getParameter("username"); 
        System.out.println("在 Servlet2(柜台 2)中查看参数(材料):" + username); 
        // 查看 柜台 1 是否有盖章 
        Object key1 = req.getAttribute("key1"); 
        System.out.println("柜台 1 是否有章:" + key1); 
        // 处理自己的业务 
        System.out.println("Servlet2 处理自己的业务 "); 
    } 
}

base标签的作用【【【】】】

HttpServletResponse类的作用
每次请求Tomcat服务器会创建一个Response对象来供Servlet程序使用。HttpServletRequest 封装请求过来的信息,HttpServletResponse 封装返回给客户端的响应信息,可以通过 HttpServletResponse 对象设置返回给客户端的信息

两个输出流

字节流getOutputStream()常用于下载(传递二进制数据)
字符流GetWriter()常用于回传字符串(常用)

两个字节流不能同时使用

服务器往客户端回传数据

例:回传字符串数据

public class ResponseIOServlet extends HttpServlet{
    @Override
    protected void doGet(HttpServletRequest req,HttpServletResponse resp) throws ServletException,IOException{
        PrintWriter writer = resp.getWriter();
        writer.write("这是一条响应信息");
    }
}

解决响应乱码

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

//下面这个方法不推荐使用
//设置服务器字符集为UTF-8
resp.setCharacterEncoding("UTF-8");
//通过响应头 设置浏览器也使用UTF-8字符集
resp.setHeader("Content-Type","text/html; charset=UTF-8");

请求重定向

请求重定向,是指客户端给服务器发请求,然后服务器告诉客户端说。我给你一些地址。你去新地址访问。叫请求 重定向(因为之前的地址可能已经被废弃)。
在这里插入图片描述

resp.sendRedirect("http://local:8080");

//下面这种方法不推荐使用
//设置响应状态码302,表示重定向
resp.serStatus(302);
//设置响应头,说明新地址在哪里
resp.setHeader("Location","http://local:8080");

MIME类型说明

MIME是HTTP协议中的数据类型

全称是Multipurpose Internet Mail Extensions 多功能邮件扩充服务,

MIME类型格式是 大类型/小类型 并与某一种文件的扩展名相对应

文件MIME类型
超文本标记语言文本.html , .htmtext/html
普通文本.txttext/plain
RTF文本.rtfapplication/rtf
GIF图形.gifimage/gif
JPEG图形状.jpeg,.jpgimage/jpeg
au声音文件.auaudio/basic
MIDI 音乐文件mid,midiaudio/midi,audio/x-midi
RealAudio 音乐文件.ra,.ramaudio/x-pn-realaudio
MPEG 文件.mpg,.mpegvideo/mpeg
AVI 文件.avivideo/x-msvideo
GZIP 文件.gzapplication/x-gzip
TAR 文件.tarapplication/x-tar
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

在外面要叫头哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值