首页 > 其他分享 >day17-Servlet06

day17-Servlet06

时间:2022-11-13 20:57:50浏览次数:40  
标签:重定向 Servlet06 html HttpServletResponse day17 import servlet response

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:

<!DOCTYPE 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:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>支付页面</title>
</head>
<body>
<h1>支付页面</h1>
<!--注意:这里action="/servlet_demo/myPayServlet"的第一个斜杠/
    被浏览器解析成浏览器当前地址栏的主机-->
<!--什么时候加上web应用名主要看 / 是服务器还是浏览器来解析
    如果是浏览器来解析就要加上web工程名
    如果是服务器来解析,就不需要加(例如请求转发)-->
<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:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>支付成功</title>
</head>
<body>
<h1>恭喜你,支付成功~</h1>
</body>
</html>

标签:重定向,Servlet06,html,HttpServletResponse,day17,import,servlet,response
From: https://www.cnblogs.com/liyuelian/p/16886900.html

相关文章

  • 牛客java选择题每日打卡Day17
    牛客java选择题每日打卡Day17......
  • 代码随想录Day17
    LeetCode199.二叉树右视图给定一棵二叉树,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。   层序遍历一个思路,只需要判断当前元素是否......
  • day17.运动(下)+轮播图 .笔记
    链式动画就是动画执行完接另一个动画,不断的进行链接封装进阶(通过传入回调函数完成链式运动)//0.缓冲运动的封装//element表示元素,targetObj表示目标对象,ca......
  • day17 MySQL的安装 & 数据库基本语法——增删改查
    day17MySQL登录数据库mysql-hlocalhost-P3307-uroot-p查看所有数据库showdatabases;退出数据库exit;//现有表格usesitu;//使用哪个数据库createtable......
  • java_day17~18
    Java基础JavaIO流什么是流?​ 内存与存储设备之间传输数据的通道流的分类按方向分类输入流:将设备中的内容读入到内存中输出流:将内存中的内容写入到设备中按单......
  • day17 运动(下)
    day17运动(下)链式动画动画执行完接另一个动画不断进行链接。封装进行(通过传入回调函数完成链式运动)//缓冲运动封装//element表示当前的元素target表示目标对象callb......
  • 《剑指offer》day17
    最小的k个数题目描述思路快速排序注意本题对返回结果的顺序性没有要求,可以根据基准点来提高效率当基准点==k,直接返回当基准点>k,往左递归否则往右递归代码实现c......
  • 进入python的世界_day17_python基础——了解模块、如何使用和导入模块、包的原理
    一、模块介绍1.什么是模块​ 其实我们前一阵已经接触过了,importxxx、fromxximportxxx​ 能够有一定功能的集合体就是模块,比如有某些功能的py文件,包含这个文件的......
  • day17模块基础简介
    目录索引取值与迭代取值的差异模块简介模块的分类导入模块的两种句式导入模块补充说明循环导入问题判断文件类型模块的查找顺序绝对导入与相对导入包索引取值与迭代取值的......
  • 代码随想录day17
    110.平衡二叉树递归法:1classSolution{2public:3//递归三步走4//1、确定返回值和函数参数5intgetHeight(TreeNode*node){6//......