JavaWeb-03-Servlet-08-Http状态码
JavaWeb-03-Servlet-08-Http状态码
1.状态码介绍
1.状态码是由三位数字组成的符号。
2.Http服务器在推送响应包前,根据本次请求处理情况,将Http状态码写入到响应包里的【状态行】上。
3.如果Http服务器针对本次请求,返回了对应的资源文件,那么就通过Http状态码通知浏览器该如何处理这个结果;
如果Http服务器针对本次请求,没有返回对应的资源文件,那么就通过Http状态码向浏览器解释不能返回的原因。
2.状态码分类
2.1状态码分为五个大类
状态码的组成:[100-599],以第一个数字为区分,分为5个大类。
2.2 【1XX】
其中最具特征的是:100
作用:通知浏览器,本次返回的资源文件并不是一个独立的完整资源文件,需要浏览器在接收到响应包后,继续向Http服务器请求所依赖的其他资源文件。
例:
比如百度的页面,在发送请求时,服务器返回一个html文件。
这个html中包含很多图片等其他元素,而这些元素是作为独立的资源文件保存在网站中的,只是在html中引用它们。所以,在服务器发送响应包时,会在状态行中写入100。
浏览器在接收到响应包后,发现状态码为100,就会得知接收到的不是一个完整的资源文件。
然后会根据命令自动向服务器索要缺失的图片文件。
2.3【2XX】
最具特征的是:200
作用:通知浏览器,本次返回的资源文件是一个完整的独立资源文件。浏览器在接收到之后,不需要再索要其他关联文件。
2.4【3XX】
最具特征的是:302
作用:通知浏览器,本次返回的不是一个资源文件,而是一个资源文件地址,需要浏览器根据这个地址自动发起请求。
如何实现:
response.sendRedirect("资源文件地址"); ------> 【响应头】location
这个行为会导致服务器将302状态码写入到状态行。
演示:
新建一个网站MyWeb,新建一个Servlet接口实现类OneServlet,在该类中,重写doGet方法
在该方法中,调用响应对象,将百度地址写入响应头中的【location】属性。
package com.tsccg.controller;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* @Author: TSCCG
* @Date: 2021/08/16 16:59
*/
public class OneServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String address = "http://www.baidu.com";
response.sendRedirect(address);
}
}
Tomcat在推送响应包之前,发现响应体中内容为空,但是响应头的location中却存放了一个地址,
Tomcat就会把302状态码写入到响应包的状态行中
发布网站,开启Tomcat服务器,在浏览器中访问OneServlet类,打开F12,查看网络:
浏览器在接收到响应包后,发现状态码为302,就不会读取响应体中的内容。
会根据location中的地址发起第二次请求。
2.5【4XX】
2.5.1【404】
作用:通知浏览器,服务端没有定位到被访问的资源文件,无法提供帮助。
2.5.2【405】
作用:通知浏览器,在服务端已经定位到被访问的资源文件【必须是Servlet】了,但是这个Servlet对于浏览器的【请求方式】无法处理。
就比如在Servlet接口实现类里只重写了doPost方法,这个类只能处理post方式的请求。
如果此时,在浏览器中通过get方式请求访问这个Servlet接口实现类,这个类就无法处理这个请求。
Tomcat服务器就会在响应包的状态行里写入405。
2.6【5XX】
最具特征的:500
作用:通知浏览器,在服务端已经定位到了被访问的资源文件【Servlet】。但是在Servlet处理当前请求时,由于Java异常而导致处理失败。
演示:
新建一个网站MyWeb,新建一个Servlet接口实现类OneServlet,在该类中,重写doGet方法
在该方法中,放入一个异常。
package com.tsccg.controller;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
/**
* @Author: TSCCG
* @Date: 2021/08/16 17:41
*/
public class OneServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Map map = new HashMap();
int num = (int)map.get("key1");//空指针异常,int类型无法存储null
/*
修改方案:
Integer num2 = (Integer)map.get("key1");//所有引用类型都可以存储null
response.getWriter().print(num2);
*/
}
}