Response对象

一 Response对象的功能:设置响应消息 

1. 设置响应行
 
   1. 格式:HTTP/1.1 200 ok
    2. 设置状态码:setStatus(int sc) 
2. 设置响应头
setHeader(String name, String value) 
3. 设置响应体
  
 * 使用步骤:
        1. 获取输出流
            * 字符输出流:PrintWriter getWriter()
            * 字节输出流:ServletOutputStream getOutputStream()
        2. 使用输出流,将数据输出到客户端浏览器

二 Response对象的案例:重定向

* 重定向:资源跳转的方式
    * 代码实现:
        //1. 设置状态码为302
        response.setStatus(302);
        //2.设置响应头location
        response.setHeader("location","/day15/responseDemo2");
        //简单的重定向方法
        response.sendRedirect("/day15/responseDemo2");

1. 使用resp.setStatus(302)和resp.setHeader("location","/day13_Servlet/responseDemo2")的方式

package cn.itcast.web.response;

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("/response1")
public class ResponseDemo1 extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req,resp);
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("responseDemo1......");
        resp.setStatus(302);
        resp.setHeader("location","/day13_Servlet/responseDemo2");
    }
}
package cn.itcast.web.response;

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("/response2")
public class ResponseDemo2 extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req,resp);
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("responseDemo2......");
    }
}

当我们在浏览器中输入http://localhost:8080/day13_Servlet/responseDemo1时,会先访问/day13_Servlet/responseDemo1然后重定向到/day13_Servlet/responseDemo2.

2. 使用resp.sendRedirect("/day13_Servlet/response2")方式

这种方式和方式一效果是一样的,但是更方便一些,操作简单

package cn.itcast.web.response;

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("/response1")
public class ResponseDemo1 extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req,resp);
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("responseDemo1......");
        //重定向路径写法1:省略了IP/域名和端口号的绝对路径 /day13_Servlet/response2
        //resp.sendRedirect("/day13_Servlet/response2");
        //重定向路径写法2:相对路径 ./response2, ./代表和当前资源在同一路径下
        //resp.sendRedirect("./response2");
        //重定向路径写法3:相对路径 response2, 和写./是一样的效果
        resp.sendRedirect("response2");
    }
}
package cn.itcast.web.response;

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("/response2")
public class ResponseDemo2 extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req,resp);
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("ResponseDemo2......");
    }
}

3. 重定向的特点:和请求转发对比

* 重定向的特点:redirect
    1. 地址栏发生变化
    2. 重定向可以访问其他站点(服务器)的资源
    3. 重定向是两次请求。不能使用request对象来共享数据
* 转发的特点:forward
    1. 转发地址栏路径不变
    2. 转发只能访问当前服务器下的资源
    3. 转发是一次请求,可以使用request对象来共享数据

4. 路径的写法

1) 相对路径:通过相对路径不可以确定唯一资源
    * 如:./index.html
    * 不以/开头,以.开头路径

    * 规则:找到当前资源和目标资源之间的相对位置关系
        * ./:当前目录
        * ../:后退一级目录
2) 绝对路径:通过绝对路径可以确定唯一资源
    * 如:完整的绝对路径http://localhost/day15/responseDemo2        简化的绝对路径(省略了IP/域名、端口号)/day15/responseDemo2
    * 以/开头的路径

    * 规则:判断定义的路径是给谁用的?判断请求将来从哪儿发出
        * 给客户端浏览器使用:需要加虚拟目录(项目的访问路径)
            * 建议虚拟目录动态获取:request.getContextPath()
            * <a> , <form> 重定向...
        * 给服务器使用:不需要加虚拟目录
            * 转发路径

三 Response对象的案例:服务器输出字符数据到浏览器

1. 步骤
    1) 获取字符输出流
    2)输出数据

2. 注意
    * 乱码问题:
        1)PrintWriter pw = response.getWriter();获取的流的默认编码是ISO-8859-1
        2)设置该流的默认编码
        3)告诉浏览器响应体使用的编码

        //简单的形式,设置编码,是在获取流之前设置
        response.setContentType("text/html;charset=utf-8");

package cn.itcast.web.response;

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;
import java.io.PrintWriter;

@WebServlet("/response4")
public class ResponseDemo4 extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req,resp);
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        /**
         * 解决中文乱码的方式一:
         * resp.setHeader("content-type","text/html;charset=utf-8");
         * 这一行代码能代表如下两行代码:
         * resp.setCharacterEncoding("UTF-8");
         * resp.setHeader("content-type","text/html;charset=utf-8");
         */
        //resp.setHeader("content-type","text/html;charset=utf-8");
        
        //解决中文乱码的方式二:简单,和方式一效果是一样的
        resp.setContentType("text/html;charset=utf-8");
        PrintWriter pw = resp.getWriter();
        pw.write("输出字符流数据");
    }
}

四 Response对象的案例:服务器输出字节数据到浏览器

1. 步骤:
1) 获取字节输出流
2) 输出数据

package cn.itcast.web.response;

import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

@WebServlet("/response4")
public class ResponseDemo4 extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req,resp);
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //解决中文乱码,告诉浏览去用什么方式解码
        resp.setContentType("text/html;charset=utf-8");
        ServletOutputStream outputStream = resp.getOutputStream();
        //设置编码的方式
        outputStream.write("服务器输出字节数据到浏览器".getBytes("UTF-8"));
    }
}

五 Response对象的案例:验证码

1. 本质:图片
2. 目的:防止恶意表单注册

package cn.itcast.web.response;

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.util.Random;

@WebServlet("/checkCode")
public class CheckCodeServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req,resp);
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //1. 创建一个图片对象
        int width=100;//图片的宽
        int height=50;//图片的高
        BufferedImage image=new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
        //2. 美化图片
        Graphics graphics = image.getGraphics();//获取画笔对象
        //2.1 填充背景色
        graphics.setColor(Color.PINK);
        graphics.fillRect(0,0,width,height);
        //2.2 画边框
        graphics.setColor(Color.BLUE);
        graphics.drawRect(0,0,width-1,height-1);
        //2.3 生成随机角标
        String str="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
        Random ran=new Random();
        for(int i=1;i<=4;i++){
            int index=ran.nextInt(str.length());
            char ch=str.charAt(index);
            graphics.drawString(ch+"",width/5*i,height/2);
        }
        //2.4 画干扰线
        for(int i=0;i<10;i++){
            graphics.setColor(Color.GREEN);
            int x1=ran.nextInt(width);
            int x2=ran.nextInt(width);
            int y1=ran.nextInt(height);
            int y2=ran.nextInt(height);
            graphics.drawLine(x1,y1,x2,y2);
        }
        //3. 将图片输出到浏览器
        ImageIO.write(image, "jpg", resp.getOutputStream());
    }
}

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值