http响应消息:
http协议分为两个部分:
- 请求消息:客户端发送给服务器端的数据
- 响应消息:服务器端发送给客户端的数据
设置完响应消息后,浏览器会自动解析响应消息的内容
数据格式:
1、响应行:协议+版本+响应状态码
2、响应头
Content-Length: 53
Content-Type: text/plain; charset=UTF-8
Date: Mon, 21 Dec 2020 10:55:01 GMT
3、响应空行
4、响应体:响应的页面内容
响应状态码:
(1) 1**
服务器接收客户端的消息,但是没有接收完成,服务器等待一段时间发送1**状态码来确认是否需要持续发送消息
(2) 2**
代表成功,本次响应的请求成功
(3) 3**
代表重定向(302)
重定向:a找b借钱,b说我没钱,你去找c,a很听话的找c借钱,这个过程叫做重定向。
代表缓存(304)
当客户端访问浏览器的时候,如果服务器资源经常不固定发生变化,在响应后就直接把这个资源存储在浏览器中,当客户端再次来访问的时候,服务器响应一个304,告诉客户端,不要再从我这拿数据了,从自己家拿吧。如果资源后期发生了变化,就会自动刷新,不再让访问缓存。
(4) 4**
404:请求路径没有对应的资源
405:请求方式没有找到对应的方法
(5) 5**
500:服务器内部发生错误
绝对路径和相对路径:
1、绝对路径:
通过绝对路径可以确定唯一资源
如:http://localhost:8080/servlet
以 / 开头的路径
2、相对路径
需要找到当前资源和目标资源对应的关系
./ 指代当前目录
.// 后退一级
响应乱码问题:
服务器向浏览器响应数据:
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("/test01_Servlet")
public class test01_Servlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 向浏览器响应数据
response.getWriter().write("Hello World");
response.getWriter().write("远赴人间惊鸿宴,一睹人间盛世颜");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
结果如下,中文的显示乱码:
中文的乱码情况:
当我们在response.getWriter().write(“中文”)时,页面无法解析。
原因:
浏览器会自动解析服务器的字符编码,浏览器的编码格式是根据操作系统来决定的,我们使用Windows是中文操作系统,所以,浏览器的字符编码格式是GBK或者GB2312中文字符编码。
可是,我们字符输出流是由response对象创建的,response对象是由Tomcat服务器创建的,Tomcat的字符编码格式是拉丁文:ISO-8859-1。
由此可知,GBK解析不了ISO的编码,解决办法是在创建字符输出流之前先设置编码格式。
解决办法:
1、设置字节编码格式:
response.setCharacterEncoding(“GBK”)
2、设置通用utf-8编码,告诉浏览器,我用的是utf-8
建议浏览器也使用utf-8进行解码(IE浏览器可以设置)
response.setHeader(“content-type”,“text/html;charset=utf-8”)
3、直接设置setContent-type
response.setContentType(“text/html;charset=utf-8”)
按照第一种方法进行设置,结果如下:
向前端页面响应验证码:
1、首先在项目中导入生成验证码的jar包:
2、代码如下:
import cn.dsna.util.images.ValidateCode;
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("/test07")
public class Test07 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
ValidateCode validateCode = new ValidateCode(400, 200, 4, 10); // 宽度、高度、字符个数、干扰线个数
String code = validateCode.getCode();
System.out.println(code);
validateCode.write(response.getOutputStream());
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
结果如下: