响应消息
1.响应行
组成:协议/版本 响应状态码 状态码描述
状态码(服务器告诉客户端本次请求和响应的一个状态
- 1xx:服务器接收客户端消息,但是没有接收完成,等待一段时间后发出1xx响应码
- 2xx:成功。代表:200
- 3xx:重定向。(302,重定向) (304 ,访问缓存)
- 4xx:客户端出现错误。(404,表示请求路径没有对应的资源)(405,请求方式没有对应的doXxx方法)
- 5xx:服务器出错 (500,服务器内部出现异常)
2.响应头
组成: 头名称 :值
常见的响应头:
- Content-Type :服务器告诉客户端本次 响应体 数据格式以及编码格式
- Content-disposition:服务器告诉客户端以什么格式打开响应体数据,值1 in-line:默认值,在当前页面打开 ;值2 attachment;filename = xxx :以附件的形式打开响应体,一般文件下载的时候需要用到。
3.响应空行
4.响应体 :传输的数据
Response对象
功能:设置响应消息
1.设置响应行
设置状态码:public void setStatus(int sc)
2.设置响应头
设置响应头:public void setIntHeader(String name, int value)
3.设置响应体
使用步骤:
a.获取输出流
- 字符输出流:PrintWriter getWriter()
- 字节输出流:ServletOutputStream getOutputStream()
b.使用输出流,将数据输出到客户端浏览器
案例
完成重定向:(前面学到的请求转发器的不太一样)
步骤:
1.告诉浏览器重定向,状态码302 利用 setStatus(302)方法
2.告诉浏览器重定向的页面的资源的路径,利用响应头location 利用response.setHeader("location","/Tomcat_war_exploded/servletresponse2") 方法
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("1111被访问了");
//设置响应头的状态码
response.setStatus(302);
//设置响应头的location,
//注意s1 中需要包含虚拟目录,不然出现404错误
response.setHeader("location","/Tomcat_war_exploded/servletresponse2");
}
注意
重定向代码的简单实现:response.sendRedirect("/Tomcat_war_exploded/servletresponse2");
路径记得加上虚拟目录,这个和HTML表单的提交action是一一样的道理
重定向(redirect)和转发(forward)比较:
- 请求转发地址栏不发生变化,而重定向会发生变化
- 请求转发不可以访问本服务器外的站点,但是重定向可以
- 请求转发是一次请求,而重定向是两次请求(这里就不能使用request和response对象来进行信息交互了)。
重新说明一下路径的写法:
规则:判断定义的路径是给谁用的?判断请求是从哪里发出?
给客户端使用的:需要加上虚拟目录
一般我们会动态获取虚拟目录:request.getContextPath() 再拼接到资源路径 比如<a> <form> 重定向 这些都是需要加上虚拟路径
给服务器使用:不需要加上虚拟目录,如 请求转发
服务器输出字符数据到浏览器
步骤:
1.获取字节(符)输出流
- 字符输出流 :PrintWriter getWriter()
- 字节输出流:public ServletOutputStream getOutputStream()
2.输出数据
做一个验证码案例:
package com.response;
import javax.imageio.IIOImage;
import javax.imageio.ImageIO;
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.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Random;
/**
* @author 承夕
* @date 2020/2/18 0018 - 8:44
* @contact:https://github.com/chengxi0
*/
@WebServlet("/servletresponse4")
public class ServletResponse4 extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
int height = 50 , width = 100 ;
//创建一个对象,再内存中生成图片,
BufferedImage bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
//美化图片
//获取画笔对象
Graphics graphics = bufferedImage.getGraphics();
graphics.setColor(Color.pink);
graphics.fillRect(0,0,width,height);
//画边界
graphics.setColor(Color.red);
graphics.drawRect(0,0,width -1,height -1);
graphics.setColor(Color.red);
String checkcode = "0123456789ABCDEFGHIJKLMNOPQRSTUVWZXY";
Random random1 = new Random();
for (int i = 1; i < 5; i++) {
int n = random1.nextInt(36);
graphics.drawString(checkcode.charAt(n)+ "", i * 20, 25);
}
graphics.setColor(Color.blue);
Random random2 = new Random();
Random random3 = new Random();
for (int i = 0; i < 10; i++) {
int x1 = random2.nextInt(100);
int y1 = random3.nextInt(50);
int x2 = random2.nextInt(100);
int y2 = random3.nextInt(50);
graphics.drawLine(x1, y1, x2, y2);
}
//将图片输出到页面上
ImageIO.write(bufferedImage, "jpg", response.getOutputStream());
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request,response);
}
}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<script>
window.onload = function () {
var e2 = document.getElementById("img");
e2.onclick = function () {
var date = new Date();
e2.setAttribute("src","/Tomcat_war_exploded/servletresponse4?" + date.getTime())
}
}
</script>
<body>
<a href="" id="word">看不清楚么,点击刷新</a>
<img src="/Tomcat_war_exploded/servletresponse4" id="img">
</body>
</html>
效果图如下: