Servlet之response对象

响应消息

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>

效果图如下:

发布了55 篇原创文章 · 获赞 4 · 访问量 1056

猜你喜欢

转载自blog.csdn.net/weixin_45062761/article/details/104373971