• day17-Servlet06


    Servlet06

    15.HttpServletResponse

    15.1HttpServletResponse介绍

    1. 每次HTTP请求,Tomcat都会创建一个HttpServletResponse对象传递给Servlet程序使用
    2. HttpServletRequest表示请求过来的信息,HttpServletResponse表示所有响应的信息,如果需要设置返回给客户端的信息,通过HttpServletResponse对象来设置即可。
    • HttpServletResponse类图
    image-20221113172438469

    image-20221113172538284 image-20221113172610605

    • 向客户端返回数据方法:
    image-20221113173334168
    1. 字节流getOutputStreamWriter(); 常用于下载(处理二进制数据)
    2. 字符流getWriter(); 常用于回传字符串
    3. 两个流同时只能使用一个,使用了字节流,就不能使用字符流,反之亦然,否则就会报错。

    例子

    image-20221113173637791

    15.2返回数据时注意事项和细节

    1. 处理中文乱码问题-方案1(推荐)

      image-20221113173929212
      response.setContentType("text/html;charset=utf-8");
    2. 处理中文乱码问题-方案2

      image-20221113173842325
      //1.设置服务器使用utf-8
      response.setCharacterEncoding("utf-8");
      //2.设置浏览器端是utf-8,而且类型是text/html
      response.setHeader("Content-Type","text/html;charset=utf-8");

    15.3请求重定向

    15.3.1请求重定向介绍

    请求重定向:一个web资源收到客户端请求后,通知客户端去访问另外一个web资源,这称之为请求重定向

    请求重定向的地址栏会改变

    15.3.2请求重定向应用实例

    需求:演示请求重定向的使用,当访问DownServlet下载文件,重定向到DownServletNew下载文件

    DownServlet:

    package com.li.servlet.response;
    import javax.servlet.*;
    import javax.servlet.http.*;
    import javax.servlet.annotation.*;
    import java.io.IOException;
    import java.io.PrintWriter;
    @WebServlet(urlPatterns = {"/downServlet"})
    public class DownServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    doPost(request, response);
    }
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    //完成自己的业务..
    //请求重定向->downServletNew
    //1.sendRedirect本质 会返回一个 302的状态码 和一个Location:/servlet_demo/downServletNew
    //2.因此302和location是浏览器解析的,而不是服务器
    //3.浏览器会将/servlet_demo/downServletNew 解析成
    // =>http://localhost:8080/servlet_demo/downServletNew
    //浏览器不能知道服务器上的web应用名称,只能将当前所在页面的主机名和端口拼上来,
    // 所以重定向需要把/web应用名也写上来
    //而请求转发是在服务器端的,可以获取到web应用名称,所以请求转发直接写/资源名即可
    response.sendRedirect("/servlet_demo/downServletNew");
    }
    }

    DownServletNew:

    package com.li.servlet.response;
    import javax.servlet.*;
    import javax.servlet.http.*;
    import javax.servlet.annotation.*;
    import java.io.IOException;
    import java.io.PrintWriter;
    @WebServlet(urlPatterns = {"/downServletNew"})
    public class DownServletNew extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    doPost(request, response);
    }
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    System.out.println("DownServletNew-doPost()被调用..");
    response.setContentType("application/x-tar;charset=utf-8");
    PrintWriter writer = response.getWriter();
    writer.print("ok");
    writer.flush();
    writer.close();
    }
    }

    down.html:

    html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <title>下载文件title>
    head>
    <body>
    <h1>下载文件h1>
    <a href="http://localhost:8080/servlet_demo/downServlet">天龙八部a>
    body>
    html>

    15.3.3请求重定向注意事项和细节

    1. 最佳应用场景:网站迁移,比如原域名是www.abc.com,迁移到www.xyz.com,但是百度抓取的还是原网址

    2. 浏览器地址会发生变化,本质上是两次http请求

    3. 不能共享Request域中的数据,本质是两次http请求,因此会产生两个httpServletRequest对象

    4. 不能重定向到/WEB-INF下的资源

    5. 可以重定向到Web工程之外的资源,比如到 www.baidu.com

    6. 重定向有两种方式,推荐使用第一种

      image-20221113192234822 image-20221113192753508
    7. 动态获取到application context(即Tomcat中配置的web应用项目名称)

      image-20221113193127441
      //动态获取到application context
      String contextPath = getServletContext().getContextPath();
      //contextPath => /servlet_demo
      response.sendRedirect(contextPath+"/downServletNew");

    15.3.4练习

    image-20221113194157745 image-20221113194219288

    1. 编写一个MyPayServlet,能够接收到提交的数据
    2. 编写一个简单的html页面pay.html
    3. 如果支付金额大于100,则重定向到payok.html,否则重定向到原来的pay.ok

    WebUtils:

    package com.li.servlet.response.homework;
    //编写一个String-->int的方法,并处理可能的异常
    public class WebUtils {
    public static int parseString(String str) {
    int num = 0;
    try {
    //try-catch快捷键:ctrl+alt+t
    num = Integer.parseInt(str);
    } catch (NumberFormatException e) {
    //这个异常不会throw给Tomcat
    System.out.println("输入的str格式不正确...");
    //如果输入的格式不正确,num的值还是0
    }
    return num;
    }
    }

    MyPayServlet:

    package com.li.servlet.response.homework;
    import javax.servlet.*;
    import javax.servlet.http.*;
    import javax.servlet.annotation.*;
    import java.io.IOException;
    @WebServlet(urlPatterns = {"/myPayServlet"})
    public class MyPayServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    doPost(request, response);
    }
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    //得到金额
    String moneyCount = request.getParameter("moneyCount");
    //转成int
    //处理一下异常
    int i = WebUtils.parseString(moneyCount);
    if (i > 100) {
    //重定向到payok.html
    response.sendRedirect(getServletContext().getContextPath() + "/payok.html");
    } else {
    //重定向到pay.html
    response.sendRedirect(getServletContext().getContextPath() + "/pay.html");
    }
    }
    }

    pay.html:

    html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <title>支付页面title>
    head>
    <body>
    <h1>支付页面h1>
    <form action="/servlet_demo/myPayServlet" method="post">
    用户编号:<input type="text" name="userId"/><br/>
    支付金额:<input type="text" name="moneyCount"/><br/>
    <input type="submit" value="点击支付">
    form>
    body>
    html>

    payok.html:

    html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <title>支付成功title>
    head>
    <body>
    <h1>恭喜你,支付成功~h1>
    body>
    html>
  • 相关阅读:
    docker容器化技术
    京东数据平台:2023年Q3季度黄金市场数据分析
    计算读取速度
    前后端分离项目,vue+uni-app+php+mysql在线考试小程序系统 开题报告
    开源对象存储系统minio部署配置与SpringBoot客户端整合访问
    【译】C# 11 特性的早期预览
    数据可视化----网页显示温湿度
    深度学习 | CNN卷积核与通道
    甲壳素晶须/羟丁基壳聚糖温敏水凝胶/羟乙基壳聚糖/透明质酸双网络水凝胶的制备
    YOLOv7基于自己的数据集从零构建模型完整训练、推理计算超详细教程
  • 原文地址:https://www.cnblogs.com/liyuelian/p/16886900.html