怀旧网,博客详情:Response 和 Request 介绍

1、Java Web 的基本概念

2、IDEA 中配置启动Tomcat

3、如何运行第一个Tomcat HttpServlet 程序

4、Servlet 详解

5、Response 和 Request 介绍

6、Cookie Session 介绍

7、JSP 详细讲解

8、Java Bean 介绍

9、MVC 架构介绍

10、Filter过滤器、监听器 介绍

11、JDBC 事务的使用

12、Java Web 文件上传

原创

Response 和 Request 介绍

image-20240328102158518

1、HttpServletResponse

1、简单分类

image-20240328102527294

image-20240328102448429

2、文件下载

image-20240328103202624

通过Response下载文件数据

放一个文件到resources目录

image-20240328111356039

编写下载文件Servlet文件

public class FileDownServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
        // 1.获取要下载文件的路径
        String filePath = "D:\\Java Web\\JavaWebDemo\\ServletDemo\\src\\main\\resources\\1.png";

        // 2.获取文件的下载名(客户端下载保存的时候的名字)
        String downFileName = filePath.substring(filePath.lastIndexOf("\\")+1);

        // 3.设置让浏览器能够支持(Content-Disposition)下载我们需要的文件,中文文件名URLEncoder。encode编码,否则可能会乱码
        resp.setHeader("Content-Disposition", "attachment;filename=" + downFileName);

        // 4.获取下载文件的输入流
        FileInputStream fis = new FileInputStream(filePath);

        // 5.创建缓冲区
        int len;
        byte[] buffer = new byte[1024];

        // 6.获取OutputStream对象
        ServletOutputStream sos = resp.getOutputStream();

        // 7.将文件流输出到ServletOutputStream中
        while((len = fis.read(buffer)) != -1){
            // 8.将数据输出到客户端
            sos.write(buffer, 0, len);
        }

        // 9.关闭文件的输入输出流
        sos.close();
        fis.close();
    }
}	

编写下载映射xml

<servlet>
    <servlet-name>downFile</servlet-name>
    <servlet-class>com.huaijiuwang.servlet.FileDownServlet</servlet-class>
</servlet>

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

访问测试:localhost:8080/downFile

image-20240328112811073

下载成功(再次测试下载文件名为中文情况)

修改代码

// 3.设置让浏览器能够支持(Content-Disposition)下载我们需要的文件,中文文件名URLEncoder。encode编码,否则可能会乱码
resp.setHeader("Content-Disposition", "attachment;filename=" + "怀旧.png");

访问测试:

image-20240328112919174

文件名输出失败,修改代码,设置下载文件的编码

// 3.设置让浏览器能够支持(Content-Disposition)下载我们需要的文件,中文文件名URLEncoder。encode编码,否则可能会乱码
resp.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode("怀旧.png", "utf-8"));

再次测试:

image-20240328113051477

显示成功!

3、验证码功能

实现目的:在浏览器端创建一个图片生成验证码,让图片3秒刷新一次:

编写Servlet:

public class ToImageServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
        // 设置浏览器3秒刷新一次
        resp.setHeader("refresh", "3");

        // 在内存中创建一个图片对象 · 参数(1.图片宽度 2. 图片长度 3.图片颜色渲染类型)
        BufferedImage image = new BufferedImage(80, 20, BufferedImage.TYPE_INT_RGB);

        // 得到图片对象
        Graphics2D graphics = (Graphics2D) image.getGraphics();

        // 设置图片的背景颜色
        graphics.setColor(Color.WHITE);
        graphics.fillRect(0, 0, 80, 20);

        // 给图片写入数据
        // 设置当前画笔颜色
        graphics.setColor(Color.GREEN);
        // 设置当前画笔字体
        graphics.setFont(new Font(null, Font.BOLD, 20));
        // 设置当前的内容
        graphics.drawString(getData(), 0, 20);

        // 响应浏览器,当前界面以图片形式打开
        resp.setContentType("image/jpeg");

        // 将当前图片输出到前端
        ImageIO.write(image, "jpg", resp.getOutputStream());
    }

    public static String getData(){
        Random random = new Random();
        return String.format("%06d", random.nextInt(999999));
    }
}

编写访问映射xml

<servlet>
    <servlet-name>image</servlet-name>
    <servlet-class>com.huaijiuwang.servlet.ToImageServlet</servlet-class>
</servlet>

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

访问测试:

image-20240328145830726

image-20240328145835396

格3秒就自动刷新

4、实现重定向

image-20240328150049470

image-20240328150226176

编写代码实现重定向:

public class RedirectServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.sendRedirect("/image");
    }
}

编写访问映射文件

<servlet>
    <servlet-name>Redirect</servlet-name>
    <servlet-class>com.huaijiuwang.servlet.RedirectServlet</servlet-class>
</servlet>

<servlet-mapping>
    <servlet-name>Redirect</servlet-name>
    <url-pattern>/red</url-pattern>
</servlet-mapping>

访问测试:

image-20240328151426440

image-20240328151431687

自动重定向到了image路径

修改tomcat配置

image-20240328152034804

image-20240328152105670

添加一个前缀

重新测试重定向

访问路径:localhost:8080/hj/red 结果如下,重定向的地址没有带hj前缀,所以找不到

image-20240328152222484

因为访问image需要带上hj前缀

image-20240328152300583

这样就可以访问了,所以在重定向的时候,我们需要加上前面的前缀才可以,修改代码

public class RedirectServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.sendRedirect(this.getServletContext().getContextPath() + "/image");
    }
}

再次访问localhost:8080/hj/red,得到结果如下

image-20240328152657060

重定向成功,并且带上了前缀

并且状态为302代表重定向,并且url也改变了

image-20240328151008093

2、HttpServletRequest

1、HttpServletRequest 介绍

  1. HttpServletRequest 对象代表客户端的请求

  2. 当客户端/浏览器通过 HTTP 协议访问服务器时,HTTP 请求头中的所有信息都封装在这个对象中

  3. 通过这个对象的方法,可以获得客户端这些信息

2、HttpServletRequest 常用方法

  1. getRequestURI() 获取请求的资源路径

  2. getRequestURL()获取请求的统一资源定位符(绝对路径)

  3. getRemoteHost() 获取客户端的 主机, getRemoteAddr()

  4. getHeader() 获取请求头

  5. getParameter() 获取请求的参数

  6. getParameterValues() 获取请求的参数(多个值的时候使用), 比如 checkbox, 返回的数组

  7. getMethod() 获取请求的方式 GET 或 POST

  8. setAttribute(key, value); 设置域数据

  9. getAttribute(key); 获取域数据

  10. getRequestDispatcher() 获取请求转发对象, 请求转发的核心对象

3、测试Request获取前端数据

编写处理登录请求的servlet

public class RequestTestServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 获取用户输入的数据
        String userName = req.getParameter("userName");
        String passWord = req.getParameter("passWord");

        // 判断用户输入
        if("huaijiu".equals(userName) && "123456".equals(passWord)){
            // 登录成功重定向success地址
            resp.sendRedirect(this.getServletContext().getContextPath() + "/success.jsp");
        }else{
            // 登录失败重定向error地址
            resp.sendRedirect(this.getServletContext().getContextPath() + "/error.jsp");
        }
    }
}

编写重定向成功或者失败地址:

image-20240328154141466

image-20240328154147583

image-20240328154152112

添加jsp所需maven依赖

<dependency>
    <groupId>javax.servlet.jsp</groupId>
    <artifactId>jsp-api</artifactId>
    <version>2.2</version>
</dependency>

编写发起请求的jsp代码 (index.jsp)

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>登录</title>
  </head>
  <body>
<%--  "${pageContext.request.contextPath} 获取前缀访问路径/hj--%>
    <form action="${pageContext.request.contextPath}/login" method="get">
      <input style="font-size: 20px;" type="text" name="userName" /><br />
      <input style="font-size: 20px;" type="password" name="passWord" /><br />

      <input type="submit" value="登录" />
    </form>
  </body>
</html>

访问测试:

输入错误的用户名或密码

image-20240328160242023

image-20240328160249246

成功重定向到了登录失败界面

输入正确的用户名密码

image-20240328160310174

image-20240328160313523

返回到登录成功的界面。

4 、HttpServletRequest 获取参数,请求转发

image-20240328163118352

image-20240328163126722

和对应的response基本就是相对的

获取参数:

image-20240328163213376

常用的就两个:

  • getParameter() 获取一个参数数据
  • getParameterValues() 当传过来的一个数据名称但是数据多个的时候,可以用这个方法,例如前端传过来的多选框

4.1、测试获取参数

编写前端代码

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>登录</title>
  </head>
  <body>
<%--  "${pageContext.request.contextPath} 获取前缀访问路径/hj--%>
    <form action="${pageContext.request.contextPath}/login" method="post">
      用户名:<input style="font-size: 20px;" type="text" name="userName" /><br />
      密码:<input style="font-size: 20px;" type="password" name="passWord" /><br />
        爱好:<input type="checkbox" value="学习" name="hobby" />学习
        <input type="checkbox" value="唱歌" name="hobby" />唱歌
        <input type="checkbox" value="跳舞" name="hobby" />跳舞
        <input type="checkbox" value="篮球" name="hobby" />篮球<br />
      <input type="submit" value="登录" />
    </form>
  </body>
</html>

后台获取数据代码:

public class RequestTestServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 获取一个数据
        String userName = req.getParameter("userName");
        String passWord = req.getParameter("passWord");

        // 获取多个值
        String[] hobbies = req.getParameterValues("hobby");


        // 打印输出结果
        System.out.println(userName + " : " + passWord);

        System.out.println(Arrays.toString(hobbies));
    }
}

请求前端提交输入信息:

image-20240328163805605

image-20240328163811691

成功请求,查看控制台的输出:

image-20240328163824286

输出乱码:

解决乱码问题: 添加下面的代码到获取数据的签名

 req.setCharacterEncoding("utf-8");

重新访问:

image-20240328163937844

成功解决乱码问题:并且获取多条数据成功。

4.2、测试请求转发

添加转发代码:

// 信息获取成功,转发到成功登录的地址
        req.getRequestDispatcher(req.getContextPath() + "/success.jsp").forward(req, resp);

访问/login地址

image-20240328164808558

发现请求地址前缀有两个hj所以找不到界面报错404

查看原因:

修改代码

req.getRequestDispatcher("/success.jsp").forward(req, resp);

image-20240328164603118

修改代码完转发

  • 原因就是因为 在转发的时候默认会自己带上当前请求的前缀
req.getRequestDispatcher("success.jsp").forward(req, resp);

image-20240328164928380

同样转发成功.

  • 在重定向的时候 url地址会发生变化 请求响应为 302
  • 在转发的时候 url地址不会发生变化 请求响应为 307
  • 平台作者:怀旧(联系作者)
  • QQ:444915368
  • 邮箱:444915368@qq.com
  • 电话:17623747368
  • 评论

    登录后才可以进行评论哦!

    回到顶部 留言