IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> Http之请求对象(小进阶) -> 正文阅读

[网络协议]Http之请求对象(小进阶)

目录

请求转发

Request作为域对象

注意事项

request作为域对象,共享范围是当前请求有效。

响应对象:

响应对象之输出内容:

响应对象之定时跳转:

重定向!

资源跳转路径问题(重中之重!!):

Servlet的线程安全问题:


请求转发

概述

  • 跳转资源,站内资源跳转。

@WebServlet("/demo01")
public class Demo01Servlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("Demo01Servlet");
        //①获取请求调度对象
        //RequestDispatcher requestDispatcher = req.getRequestDispatcher("demo02");
        //②执行转发
        //requestDispatcher.forward(req, resp);
		req.getRequestDispatcher("demo02").forward(req, resp);
    }

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


@WebServlet("/demo02")
public class Demo02Servlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("Demo02Servlet");
    }

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

执行流程:

从图中可知这是站内转发,只发送了一次请求。

Request作为域对象

域对象

  • 存储数据并共享

@WebServlet("/demo03")
public class Demo03Servlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("Demo03Servlet");
        request.setAttribute("msg", "hello");
        //请求转发到Demo04Servlet
        request.getRequestDispatcher("demo04").forward(request, response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }
}

@WebServlet("/demo04")
public class Demo04Servlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("Demo04Servlet");
        //request.removeAttribute("msg");
        Object msg = request.getAttribute("msg");
        System.out.println("msg = " + msg);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }
}

注意事项

  • request作为域对象,共享范围是当前请求有效。

响应对象:

  • ServletResponse对象用于发送响应给客户端,通过Servlet的services方法传递给Servlet;

  • 通过ServletOutputStream对象发送字节数据,通过PrintWriter对象发送字符数据。

响应对象之输出内容:

概述

  • 响应对象操作响应体(响应正文)

@WebServlet("/demo06")
public class Demo06Servlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //告诉服务器,以utf-8编码响应正文
        //response.setCharacterEncoding("utf-8");
        //告诉浏览器,以utf-8解码响应正文
        //response.setHeader("Content-Type","text/html;charset=utf-8");
        //告诉服务器,以utf-8编码响应正文 ;告诉浏览器,以utf-8解码响应正文。
        response.setContentType("text/html;charset=utf-8");
        String content = "你好世界";
        PrintWriter writer = response.getWriter();
        writer.write(content);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }
}

响应对象之定时跳转:

通过ReFresh完成

/**
 * 05-响应对象之定时跳转
 * 需求:3秒后跳转到Demo08Servlet
 */
@WebServlet("/demo07")
public class Demo07Servlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("Demo07Servlet");
        response.setHeader("Refresh", "3;url=demo08");

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }
}

实现2:在html中实现

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="Refresh" content="3;url=index.html">
    <title>05-响应对象之定时跳转</title>
</head>
<body>

<span id="spn">3</span>秒后跳转,如果没有跳转,<a href="index.html">请点击</a>

</body>
<script>

    window.setInterval("showCount()",1000);

    function showCount() {
        var count = document.getElementById("spn").innerText;
        if (count <= 1) {
            return;
        }
        count--;
        document.getElementById("spn").innerText = count;
    }

</script>
</html>

重定向!

  • 概述

    • 跳转资源,站外资源跳转。

  • 开发步骤

    • ①操作响应状态码301/302

      • 301 : 永久重定向 , 销毁历史记录

      • 302 : 临时重定向,保存历史记录

    • ②操作响应头location

@WebServlet("/demo09")
public class Demo09Servlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("Demo09Servlet");
        //①操作响应状态码
        //resp.setStatus(302);
        //②操作响应头location
        //resp.setHeader("location","demo10");

        resp.sendRedirect("demo10");

    }

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

由图可知,重定向是需要响应一次,响应携带状态码以及跳转资源路径地址,然后浏览器再请求一次的。

资源跳转路径问题(重中之重!!):

概述

  • 请求转发:站内资源跳转;

    • 相对路径:和原来一样,没有问题

    • 绝对路径 :和原来不一样,"/资源访问路径"

  • 重定向:站外资源跳转。

    • 相对路径:和原来一样,没有问题

    • 绝对路径:和原来一样,"/项目访问路径/资源访问路径"

@WebServlet("/demo11")
public class Demo11Servlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("Demo11Servlet");
        //相对路径 : ok
        //req.getRequestDispatcher("demo12").forward(req,resp);
        //绝对路径
        req.getRequestDispatcher("/day05/demo12").forward(req, resp);
    }

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

@WebServlet("/demo13")
public class Demo13Servlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("Demo13Servlet");
        //相对路径
        //resp.sendRedirect("demo14");
        //绝对路径
        resp.sendRedirect("/day05/demo14");
    }

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

Servlet的线程安全问题:

概述

  • Servlet是多线程单实例的。操作同一个变量容易出现问题。

  • 解决方案1:尽量避免在Servlet中使用成员变量,而使用局部变量

@WebServlet("/demo16")
public class Demo16Servlet extends HttpServlet {

    //private String num;//成员变量,也叫对象变量

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        String num = request.getParameter("num");

        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        //线程1 : num=250
        //线程2 : num=500
        response.getWriter().write("num = " + num);

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }
}

方案2就是上锁,上锁效率低,一般不建议使用。sleep那更不谈了,直接影响用户使用,我都懒得写出来。

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章           查看所有文章
加:2022-03-21 21:30:49  更:2022-03-21 21:35:28 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 5:53:10-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码