response应用及重定向和request转发

请求和转发:


response说明

response是指HttpServletResponse,该响应有很多的应用,比如像浏览器输出消息,下载文件,实现验证码等。

一、response文件下载

1.创建一个javaweb的项目。

2.实例类FileServlet的具体实现。

java 复制代码
import java.net.URLEncoder;
public class FileServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        1.获取要下载文件的路径        realPath:绝对路径
        String realPath = "E:\\Software\\IDEA\\javaweb-02-servlet\\response\\src\\main\\resources\\aa.webp";
        System.out.println("文件下载的路径:" + realPath);
//        2.下载的文件名
        String fileName = realPath.substring(realPath.lastIndexOf("\\") + 1);
//        3.设置浏览器能够支持下载我们需要的东西
//        如果想让网站能下载东西,需要搜一个下载文件的一个头。
//        resp.setHeader("Content-disposition", "attachment;filename" + fileName);
        resp.setHeader("Content-disposition", "attachment;filename="+ URLEncoder.encode(fileName,"UTF-8"));
//        4.获取下载文件的输入流。
        FileInputStream fis = new FileInputStream(realPath);
//        5.创建缓冲区
//        6.获取OutputStream对象
//        7.将FileOutputStream流写入到缓冲区,使用OutputStream将缓冲区中的数据输出到客户端。
        ServletOutputStream oos = resp.getOutputStream();
        byte[] buf = new byte[1024];
        int len = 0;
        while ((len = fis.read(buf)) > 0) {
            oos.write(buf, 0, len);
        }

        oos.close();
        fis.close();

    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

3.配置web.xml文件及tomcat服务器。

4.启动服务。


5.回顾总结

  • (5.1)思路分析:
    • 1.获取文件输入流
    • 2.获取web的响应的输出流
    • 3.将输入流写入到输出流,进而发给客户端。
  • (5.2)注意实项:
    • 1.下载文件名
java 复制代码
 String fileName = realPath.substring(realPath.lastIndexOf("\\") + 1);
 - 2.下载文件的头
java 复制代码
 resp.setHeader("Content-disposition", "attachment;filename" + fileName);
 - 3.相关搜索

二、response验证码实现

1.前置知识:

下载文件需要一个响应头,响应浏览器的类型是:

java 复制代码
resp.setHeader("Content-disposition", "attachment;filename" + fileName);

而图片验证码需要设置 发送到客户端的响应的内容类型

java 复制代码
resp.setContentType("image/jpg");
以jsp的形式发送的图片类型。
此外,也可以是png,jepg等形式。

还需要设置每60s刷新一次:

java 复制代码
resp.setHeader("refresh","60");

常见的内容类型:

java 复制代码
resp.setContentType("text/html");
以html的格式响应的文本类型,即代表响应的是html页面。

2.具体实现:

java 复制代码
import javax.imageio.ImageIO;
import javax.servlet.ServletException;
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;


public class ImageServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//如何让浏览器每60s自动刷新一次
        resp.setHeader("refresh","60");

//        在内存中创建一个图片
        BufferedImage image = new BufferedImage(80, 20, BufferedImage.TYPE_INT_RGB);
//        得到图片
        Graphics2D g = (Graphics2D) image.getGraphics();//笔来对图片进行操作
//        设置图片的背景颜色。---先选定颜色,再添加一个填充的矩形。
        g.setColor(Color.WHITE);
        g.fillRect(0,0,80,20);

//        给图片写数据
        g.setColor(Color.CYAN);
        g.setFont(new Font(null,Font.BOLD,20));
        g.drawString(makeNum(),0,20);

//        告诉浏览器,这个请求用图片的方式打开
//        setContentType  设置发送到客户端的响应的内容类型
        resp.setContentType("image/jpg");
//网站存在缓存,不让浏览器去缓存
//        setHeader设置响应头
//        setDateHeader 是设置页面缓存的,防止 JSP或者Servlet中的输出 被浏览器保存在缓冲区中。
        resp.setDateHeader("Expires",-1);//在代理服务器端防止缓冲
        resp.setHeader("Cache-Control","no-cache");
        resp.setHeader("Pragma","no-cache");

//        把图片写给浏览器
        ImageIO.write(image,"jpg",resp.getOutputStream());
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
    private String makeNum(){
        Random random = new Random();
        String num=random.nextInt(9999999)+"";
        StringBuffer sb = new StringBuffer();//变化的字符串。
        for (int i=0;i<7-num.length();i++){
            sb.append("0");
        }
        num=sb.toString()+num;
        return num;
    }
}

3.知识总结

(1)设置浏览器自动刷新。

(2)清除浏览器缓存。

(3)将图片写给浏览器。(可以试试其他的内容,比如音乐电影什么行不行?)

(4)设置客户端的响应内容形式为图片。

(5)内存中创建图片,并通过画笔类进行操作。

(ImageIO是一个图片类,专门写图片的。)

(6)生成随机数。

画笔是如果要写文字,要先选定颜色,然后选定字体,文本框,在哪个位置开始写。


三、response重定向

如:

java 复制代码
resp.sendRedirect("/re/img1");
即	resp.sendRedirect("/项目映射名/跳转的页面的映射");


也可以跳转到jsp页面。

实例代码:

html 复制代码
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<body>
<h2>Hello World!</h2>
<%--这里提交的路径 需要寻找到项目的路径--%>
<form action="${pageContext.request.contextPath}/login" method="get">
    用户名:<input type="text" name="username">
    密码:<input type="password" name="password">
    <input type="submit">
</form>
</body>
</html>
java 复制代码
public class RedirectServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        redirect 重定向
        resp.sendRedirect("/re/img1");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}


四、request转发

request处理请求:

HTTP请求中的所有信息被封装到HttpServletRequest对象,通过该对象的方法,可以获取客户端的所有信息。

主要的获取参数的两种方法:

实例代码:

html 复制代码
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>登录</title>
</head>
<body>
<h1>登录</h1>
<div style="text-align: center">
<%--以post方式提交表单,提交到我们的login请求--%>
    <form action="${pageContext.request.contextPath}/login" method="post">
        用户名:<input type="text" name="username"><br>
        密码:<input type="password" name="password"><br>
        爱好:
        <input type="checkbox" name="hobbys" value="张三">张三
        <input type="checkbox" name="hobbys" value="李四">李四
        <input type="checkbox" name="hobbys" value="飞机">飞机
        <input type="checkbox" name="hobbys" value="蜘蛛">蜘蛛
        <br>
        <input type="submit">
    </form>
</div>
</body>
</html>
java 复制代码
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.Arrays;

/**
 *
 */
public class LoginServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("UTF-8");
        resp.setCharacterEncoding("UTF-8");
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        String[] hobbys = req.getParameterValues("hobbys");
        System.out.println("================");
        System.out.println(username+":"+password);
        System.out.println(Arrays.toString(hobbys));
        System.out.println("================");
//请求转发 req
//       /被解析成当前项目路径
         req.getRequestDispatcher("/success.jsp").forward(req,resp);

    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

五、重定向和转发的区别

相同点:

  • 页面都会实现跳转。

不同点:

  • 请求转发的时候,url不会发生改变。
    转发时:
java 复制代码
 req.getRequestDispatcher("/success.jsp").forward(req,resp);
  • 重定向的时候,url地址栏会发送改变。
    重定向:
java 复制代码
 resp.sendRedirect("/re/img1");
相关推荐
Swift社区27 分钟前
在 Swift 中实现字符串分割问题:以字典中的单词构造句子
开发语言·ios·swift
没头脑的ht28 分钟前
Swift内存访问冲突
开发语言·ios·swift
没头脑的ht31 分钟前
Swift闭包的本质
开发语言·ios·swift
wjs202434 分钟前
Swift 数组
开发语言
吾日三省吾码1 小时前
JVM 性能调优
java
stm 学习ing2 小时前
FPGA 第十讲 避免latch的产生
c语言·开发语言·单片机·嵌入式硬件·fpga开发·fpga
湫ccc2 小时前
《Python基础》之字符串格式化输出
开发语言·python
弗拉唐2 小时前
springBoot,mp,ssm整合案例
java·spring boot·mybatis
oi773 小时前
使用itextpdf进行pdf模版填充中文文本时部分字不显示问题
java·服务器