ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

【Servlet】HttpServletResponse实现下载文件、验证码功能、实现重定向,使用HttpServletRequest获取前端传递的参数+请求转发,请求转发与重定向

2021-03-09 20:05:42  阅读:161  来源: 互联网

标签:HttpServletRequest 请求 resp req HttpServletResponse IOException 转发 重定向


前言:本文仅为我的学习笔记,方便今后回顾, 学习来源是B站UP主:遇见狂神说,本文主要讲的是Servlet中的两个请求和相应类,并未涉及Session和Cookie的内容,而且仅是学习的例子,其中有些例子对于已对JavaWeb有全面了解的观众来说是不太恰当的(我是这么认为的),因此这些例子仅单纯用来学习HttpServletResponse类和HttpServletRequest类的部分用法,更多用法请参考这两者的源码,它们的源码很有对应关系,如一个是setxxx,一个是getxxx,and so on…很容易理解,本文就是闹着玩,作为学习记录而已。

文章目录

一、HttpServletResponse

1.下载文件

实例测试:

1)主要代码

public class FileServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        1.获取下载的文件路径;
        String realPath = "C:\\Users\\DELL\\Desktop\\IDEA Java代码仓库\\javaweb-02-servlet\\response\\src\\main\\resources\\123.png";
        System.out.println("下载文件的路径:" + realPath);
//        2.获取下载的文件名;
        String filename = realPath.substring(realPath.lastIndexOf("\\") + 1);
//        3.设置让浏览器能够识别我们需要的内容,同时指定下载此文件时文件的下载名;
//        中文名用URLEncoder.encode编码,否则可能乱码
        resp.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(filename, "UTF-8"));
//        4.获取下载文件的输入流;
        FileInputStream in = new FileInputStream(realPath);
//        5.创建缓冲区;
        int len = 0;
        byte[] buffer = new byte[1024];
//        6.获取OutputStream对象;
        ServletOutputStream out = resp.getOutputStream();
//        7.将FileOutputStream流写入到buffer缓冲区,使用OutputStream将缓冲区的数据输出到客户端。
        while ((len = in.read(buffer)) > 0) {
            out.write(buffer, 0, len);
        }
        in.close();
        out.close();
    }

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

web.xml

<servlet>
    <servlet-name>filedown</servlet-name>
    <servlet-class>com.zlc.servlet.response.FileServlet</servlet-class>
</servlet>

<servlet-mapping>
    <servlet-name>filedown</servlet-name>
    <url-pattern>/fd</url-pattern>
</servlet-mapping>

2)效果图

请求此地址
在这里插入图片描述
回车后立即下载
在这里插入图片描述

2.验证码功能

实例测试:

1)主要代码

public class ImageServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //让浏览器5s自动刷新一次
        resp.setHeader("refresh", "3");
        //在内存中创建一个图片
        BufferedImage bufferedImage = new BufferedImage(80, 20, BufferedImage.TYPE_INT_RGB);
        //得到图片的画笔
        Graphics g = bufferedImage.getGraphics();
        //设置图片的背景颜色
        g.setColor(Color.white);
        g.fillRect(0, 0, 80, 20);
        //给图片写数据
        g.setColor(Color.BLUE);
        g.setFont(new Font(null, Font.BOLD, 20));
        g.drawString(makeNum(), 0, 20);
        //使浏览器以图片形式打开此请求
        resp.setContentType("image/jpeg");
        //网站存在缓存,不让浏览器缓存
        resp.setDateHeader("expires", -1);
        resp.setHeader("Cache-Control", "no-cache");
        resp.setHeader("Pragma", "no-cache");
        //把图片写给浏览器
        ImageIO.write(bufferedImage, "jpg", resp.getOutputStream());
    }

    //生成随机数
    private String makeNum() {
        Random random = new Random();
        String strNum = random.nextInt(9999999) + "";
        StringBuffer stringBuffer = new StringBuffer();
        for (int i = 0; i < 7 - strNum.length(); i++) {
            stringBuffer.append(0);
        }
        strNum = stringBuffer.toString() + strNum;
        return strNum;
    }

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

web.xml

<servlet>
    <servlet-name>validnum</servlet-name>
    <servlet-class>com.zlc.servlet.response.ImageServlet</servlet-class>
</servlet>

<servlet-mapping>
    <servlet-name>validnum</servlet-name>
    <url-pattern>/num</url-pattern>
</servlet-mapping>

2)效果图

在这里插入图片描述
在这里插入图片描述

3.实现重定向

实例测试一:

1)主要代码

public class RedirectServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        /**
         * 重定向相当于
         * resp.setHeader("Location", "/r/num");
         * resp.setStatus(HttpServletResponse.SC_MOVED_TEMPORARILY); 302
         */
        resp.sendRedirect("/r/num");
    }

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

web.xml

<servlet>
    <servlet-name>rd</servlet-name>
    <servlet-class>com.zlc.servlet.response.RedirectServlet</servlet-class>
</servlet>

<servlet-mapping>
    <servlet-name>rd</servlet-name>
    <url-pattern>/rd</url-pattern>
</servlet-mapping>

2)效果图

发起请求
在这里插入图片描述
地址栏地址立即跳转至预先设定地址
在这里插入图片描述

实例测试二:

1)主要代码

public class RequestTest extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        处理请求
        String username = req.getParameter("username");
        String password = req.getParameter("password");

        System.out.println(username + ":" + password);

        resp.sendRedirect("/r/success.jsp");

    }

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

web.xml

<servlet>
    <servlet-name>req</servlet-name>
    <servlet-class>com.zlc.servlet.response.RequestTest</servlet-class>
</servlet>

<servlet-mapping>
    <servlet-name>req</servlet-name>
    <url-pattern>/req</url-pattern>
</servlet-mapping>

index.jsp

<%@ page contentType="text/html; charset=gb2312"%>
<html>
<body>
<h2>Hello World!</h2>
<%--${pageContext.com.zlc.servlet.request.contextPatjsh}:代表当前项目--%>
<form action="${pageContext.com.zlc.servlet.request.contextPath}/req" method="get">
    用户名:<input type="text" name="username"> <br/>
    密码:<input type="password" name="password"> <br/>
    <input type="submit">
</form>
</body>
</html>

success.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h1>Success</h1>
</body>
</html>

2)效果图

发起请求
在这里插入图片描述
立即跳转
在这里插入图片描述



二、HttpServletRequest

1.获取前端传递的参数+请求转发

实例测试:

1)主要代码

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 = " + username);
        System.out.println("password = " + password);
        System.out.println(Arrays.toString(hobbys));
        System.out.println("=========================");

        //通过请求转发
        req.getRequestDispatcher("/success.jsp").forward(req, resp);
    }

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

web.xml

<servlet>
  <servlet-name>login</servlet-name>
  <servlet-class>com.zlc.servlet.request.LoginServlet</servlet-class>
</servlet>

<servlet-mapping>
  <servlet-name>login</servlet-name>
  <url-pattern>/login</url-pattern>
</servlet-mapping>

index.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>

<div style="text-align: center">
    <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="read">看书
        <input type="checkbox" name="hobbys" value="code">代码
        <input type="checkbox" name="hobbys" value="music">音乐
        <input type="checkbox" name="hobbys" value="game">游戏 <br/>
        <input type="submit">
    </form>
</div>
</body>
</html>

success.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h1>Success</h1>
</body>
</html>

(注:此例子中因为form表单中action属性的原因,导致请求转发操作中地址栏地址变了,这只是一个不恰当的例子,掩盖不了在很多场景中请求转发本质不改变地址栏的事实。)

2)效果图

在这里插入图片描述
提交后
在这里插入图片描述


三、请求转发与重定向

有一篇很好的博文,地址是:https://www.cnblogs.com/duanwandao/p/9855229.html

摘选与本文例子有关的部分内容:

请求转发:request.getRequestDispatcher().forward(request,response):

1、属于转发,也是服务器跳转,相当于方法调用,在执行当前文件的过程中转向执行目标文件,两个文件(当前文件和目标文件)属于同一次请求,前后页共用一个request,可以通过此来传递一些数据或者session信息,request.setAttribute()和request.getAttribute()。

2、在前后两次执行后,地址栏不变,仍是当前文件的地址。

3、不能转向到本web应用之外的页面和网站,所以转向的速度要快。

4、URL中所包含的“/”表示应用程序(项目)的路径。

重定向:response.sendRedirect():

1、属于重定向,也是客户端跳转,相当于客户端向服务端发送请求之后,服务器返回一个响应,客户端接收到响应之后又向服务端发送一次请求,一共是2次请求,前后页不共用一个request,不能读取转向前通过request.setAttribute()设置的属性值。

2、在前后两次执行后,地址栏发生改变,是目标文件的地址。

3、可以转向到本web应用之外的页面和网站,所以转向的速度相对要慢。

4、URL种所包含的"/"表示根目录的路径。

标签:HttpServletRequest,请求,resp,req,HttpServletResponse,IOException,转发,重定向
来源: https://blog.csdn.net/m0_46360532/article/details/114550172

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有