Request对象和response对象

news2024/12/23 15:09:51

 一、概念

       request对象和response对象是通过Servlet容器(如Tomcat)自动创建并传递给Servlet的。

Servlet容器负责接收客户端的请求,并将请求信息封装到request对象中,然后将request对象传

递给相应的Servlet进行处理。类似地,Servlet容器会创建一个response对象,并将其传递给

Servlet,用于生成响应并发送给客户端。

     总的来说,request对象是来获取请求消息,response对象是来设置响应消息

二、Request

        在Servlet的service()方法被调用时,Servlet容器会创建一个包含请求信息的HttpServletRequest对象,并将其作为参数传递给Servlet的service()方法。类似地,Servlet容器还会创建一个HttpServletResponse对象,并将其作为参数传递给Servlet的service()方法。

1、Request功能

(1)获取请求行数据

        请求行的数据有:请求方式  请求url 请求协议/协议版本号

             ①获取请求方式:getMethod()

             ②获取虚拟目录:getContextPath()

             ③获取servlet路径:getServletPath()

             ④获取get方式请求参数:getQueryString()

             ⑤获取请求URI:统一资源定位符:getRequestURI()

                                        统一资源标识符:getRequestURL()

             ⑥获取协议及版本: getProtocol()

             ⑦获取客户机的IP地址:getRemoteAddr()

  代码示例:

@WebServlet("/requestDemo1")
public class RequestDemo1 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //1获取请求方式
        String method=request.getMethod();
        System.out.println(method);
        //2获取虚拟目录
        String contextPath = request.getContextPath();
        System.out.println(contextPath);
        //3获取servlet路径
        String servletPath = request.getServletPath();
        System.out.println(servletPath);
        //4获取请求参数
        String queryString = request.getQueryString();
        System.out.println(queryString);
        //5获取请求URI
        String requestURI = request.getRequestURI();
        System.out.println(requestURI);
        StringBuffer requestURL = request.getRequestURL();
        System.out.println(requestURL);
        //6获取请求协议及版本号
        String protocol = request.getProtocol();
        System.out.println(protocol);
        //7获取客户机的ip地址
        String remoteAddr = request.getRemoteAddr();
        System.out.println(remoteAddr);
    }

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

    }
}

(2)获取请求头数据

     方法:getHeader(String name):通过请求头的名称获取请求头的值

                 getHeaderNames():获取所有的请求头名称

@WebServlet("/requestDemo2")
public class RequestDemo2 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //演示获取请求头数据
        //获取所以请求头数据
        Enumeration<String> headerNames = request.getHeaderNames();
        //遍历
        while(headerNames.hasMoreElements()){
            String s = headerNames.nextElement();
            //根据名称获取请求头的值
            String header = request.getHeader(s);
            System.out.println(s+"......"+header);
        }
        //演示获取请求头数据:user-Agent
        String header = request.getHeader("user-agent");
        //判断agent的浏览器版本
        System.out.println(header);
      
    }

(3)获取请求体数据

      只有post请求有请求体

步骤:①获取流对象
                     BufferedReader getReader():获取字符输入流,只能操作字符数据
                    ServletInputStream getInputStream():获取字节输入流,可以操作所有类型数据

           ② 再从流对象中拿数据

@Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //获取请求消息体--请求参数
        //1、获取字符流
        BufferedReader reader = request.getReader();
        //2、读取数据
        String line=null;
        while((line=reader.readLine())!=null){
            System.out.println(line);
        }
        System.out.println("-------------------------------------");
    }

 2、其他功能

(1)获取请求参数(不区分post和get方法)

       ①根据参数名称获取参数值:getParameter(String name)

       ②根据参数名称获取参数值数组:getParameterValues(String name)

       ③获取所有请求的参数名称:getParameterNames()

       ④获取所有参数的map集合:getParameterMap()

@WebServlet("/requestDemo4")
public class RequestDemo4 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
     this.doPost(request,response);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //解决中文乱码问题
        request.setCharacterEncoding("utf-8");
        //根据请求参数的名称获取请求参数值
        String username = request.getParameter("username");
        System.out.println(username);
        System.out.println("post");
        System.out.println();
        //根据参数名称获取请求参数数组
        String[] parameterValues = request.getParameterValues("hobby");
        for (String hobby:parameterValues) {
            System.out.println(hobby);
        }
        System.out.println();

        //根据所以请求参数名称
        Enumeration<String> parameterNames = request.getParameterNames();
        while(parameterNames.hasMoreElements()){
            String s = parameterNames.nextElement();
            System.out.print(s);
            String parameter = request.getParameter(s);
            System.out.println(parameter);
        }
        System.out.println();

        //获取所以参数的map集合
        Map<String, String[]> parameterMap = request.getParameterMap();
        Set<String> strings = parameterMap.keySet();
        for(String name:strings){
            String[] strings1 = parameterMap.get(name);
            System.out.print(name);
            for(String value:strings1){
                System.out.println(value);
            }
        }
    }
}

(2)请求转发

          在服务器内部的资源跳转方式

       步骤:

            通过request对象获取请求转发器对象:getRequestDispatcher(String path)。

            使用RequestDispatcher对象来进行转发:forward(ServletRequest request, ServletResponse response) 。

      特点:

          浏览器地址栏不发生改变

          只能转发到当前服务器内部资源中

          转发是一次请求

(3)共享数据

         域对象:一个有作用范围的对象,可以在范围内共享数据
         request域:代表一次请求的范围,一般用于请求转发的多个资源中共享数据
         方法:
                ①setAttribute(String name,Object obj):存储数据
                ②getAttitude(String name):通过键获取值
                ③ void removeAttribute(String name):通过键移除键值对
          注意:这个放于forward方法的上面,不然响应太快会导致无法获取信息!

   代码示例

@WebServlet("/requestDemo5")
public class RequestDemo5 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("demo5被访问了");
        request.setAttribute("ttt","hhhh");
        //转发到demo6
        request.getRequestDispatcher("/requestDemo6").forward(request,response);
    }

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

    }
}


@WebServlet("/requestDemo6")
public class RequestDemo6 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        Object ttt = request.getAttribute("ttt");
        System.out.println(ttt);
        System.out.println("demo6被访问了");
    }

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

    }
}

(4)获取ServletContext对象 :getServletContext()

三、Response

 response:设置响应消息

1、设置响应行方法

(1)设置响应行状态码方法:setStatus();

(2)设置响应头:setHeader(String name,String value)

(3)设置响应体:

              使用步骤:

                         ①获取输出流
                                  字符输出流:PrintWriter getWriter()

                                 字节输出流:ServletOutputStream getOutputStream()

                        ② 使用输出流,将数据输出到客户端浏览器

2、重定向: 一种资源跳转的方式

      (1)方法:sendRedirect()

     (2) 重定向的特点:redirect
            ① 地址栏发生变化
            ② 重定向可以访问其他站点(服务器)的资源
            ③ 重定向是两次请求。不能使用request对象来共享数据

@WebServlet( "/responseDemo1")
public class responseDemo1 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("demo1");
        //设置状态码为302
        response.setStatus(302);
       /* //设置响应头location
        response.setHeader("location","/servlet/responseDemo2");*/
        //获取当前应用程序的上下文路径
        String contextPath = request.getContextPath();

        //简单的重定向方法
        response.sendRedirect(contextPath+"/responseDemo2");
    }

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

@WebServlet("/responseDemo2")
public class responseDemo2 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("demo2");
    }

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

(3)服务器输出字符数据到浏览器

         步骤:
                 获取字符输出流
                 输出数据

@WebServlet("/responseDemo3")
public class responseDemo3 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        /*//获取流对象之前,设置流的默认编码:ISO-8859-1设置为:浏览器默认编码
        response.setCharacterEncoding("utf-8");
        //告诉浏览器服务器发送的消息体数据的编码,建议浏览器使用改编码解码
        response.setHeader("content-type","text/html;charset=utf-8");*/
        response.setContentType("text/html;charset=utf-8");//解决乱码问题
        //获取字符输出流
        PrintWriter writer = response.getWriter();
        //输出数据
        writer.write("牛牛牛");
    }

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

(4)服务器输出字节数据到浏览器
          步骤:
                 获取字节输出流
                 输出数据

@WebServlet("/responseDemo4")
public class responseDemo4 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        //获取字节输出流
        ServletOutputStream outputStream = response.getOutputStream();
        //输出数据
        outputStream.write("你好".getBytes());
    }

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

三、ServletContext对象

1、概念

       ServletContext 实例代表了整个 Web 应用程序的上下文环境,可以在整个应用程序中访问和共享,可以和服务器来通信。

2、获取

      方式一:

              通过request对象获取:request.getServletContext();

     方式二:

              通过HttpServlet获取:this.getServletContext();

3、功能

(1)获取MIME类

             MIME类型:在互联网通信过程中定义的一种文件数据类型
             格式: 大类型/小类型   text/html        image/jpeg

        获取方法:getMimeType(String file)  

   代码示例

@WebServlet("/ContextDemo1")
public class ContextDemo1 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //获取Context对象的方式
       // ServletContext servletContext = request.getServletContext();
        ServletContext servletContext1 = this.getServletContext();
        //定义文件名称
        String filename="a.jpg";
        //获取MIME类型
        String mimeType = servletContext1.getMimeType(filename);
        System.out.println(mimeType  );
    }

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

(2)域对象:共享数据

        ① setAttribute(String name,Object value)
        ② getAttribute(String name)
        ③removeAttribute(String name)

         ServletContext对象范围:所有用户所有请求的数据


@WebServlet(name = "ContextDemo2", value = "/ContextDemo2")
public class ContextDemo2 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        ServletContext servletContext1 = this.getServletContext();
        servletContext1.setAttribute("n","hello");
    }

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


@WebServlet(name = "ContextDemo2", value = "/ContextDemo2")
public class ContextDemo3 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        ServletContext servletContext1 = this.getServletContext();
        Object n = servletContext1.getAttribute("n");
        System.out.println(n);
    }

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

(3) 获取文件的真实(服务器)路径

         方法:String getRealPath(String path)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/929934.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

改进YOLO系列:10.添加NAMAttention注意力机制

添加NAMAttention注意力机制 1. NAMAttention注意力机制论文2. NAMAttention注意力机制原理3. NAMAttention注意力机制的配置3.1common.py配置3.2yolo.py配置3.3yaml文件配置1. NAMAttention注意力机制论文 论文题目:NAM: Normalization-based Attention Module 论文…

软件设计师学习笔记4-寻址方式

目录 1.指令的基本概念 2.寻址方式 2.1寻址方式及其特点 2.2寻址方式图解 3.CISC和RISC 1.指令的基本概念 一条指令就是机器语言的一个语句&#xff0c;它是一组有意义的二进制代码&#xff0c;指令的基本格式为操作码字段地址码字段&#xff0c;其中操作码给出该指令的对…

pgadmin4树节点增删查(二)

十九&#xff0c;表 &#xff08;一&#xff09;查询 请求参数&#xff1a; gid1 sid1 did13799 scid2200pg模板&#xff1a; SELECT rel.oid, rel.relname AS name, rel.reltablespace AS spcoid,rel.relacl AS relacl_str,(CASE WHEN length(spc.spcname::text) > 0 T…

【LeetCode-中等题】238. 除自身以外数组的乘积

题目 题解一&#xff1a;暴力双指针—超时了 双指针暴力查找(需考虑begin end 和begin end i) 的情况 ----- 力扣示例超出时间限制 public int[] productExceptSelf(int[] nums) {int length nums.length;int begin 0;int end length -1;int i 0;int[] number new in…

基于python+pyqt实现opencv银行卡身份证等识别

效果展示 识别结果 查看处理过程 历史记录 完整演示视频&#xff1a; 无法粘贴视频........ 完整代码链接 视频和代码都已上传百度网盘&#xff0c;放在主页置顶文章

MATLAB图论合集(二)计算最小生成树

今天来介绍第二部分&#xff0c;图论中非常重要的知识点——最小生成树。作为数据结构的理论知识&#xff0c;Prim算法和克鲁斯卡尔算法的思想此处博主不详细介绍&#xff0c;建议在阅读本帖前熟练掌握。 对于无向带权图&#xff0c;在MATLAB中可以直接以邻接矩阵的方式创建出来…

研磨设计模式day11观察者模式

目录 场景 代码示例 定义 观察者模式的优缺点 本质 何时选用 简单变型-区别对待观察者 场景 我是一家报社&#xff0c;每当我发布一个新的报纸时&#xff0c;所有订阅我家报社的读者都可以接收到 代码示例 报纸对象 package day11观察者模式;import java.util.Observ…

stm32之DS18B20

DS18B20与stm32之间也是通过单总线进行数据的传输的。单总线协议在DHT11中已经介绍过。虽说这两者外设都是单总线&#xff0c;但时序电路却很不一样&#xff0c;DS18B20是更为麻烦一点的。 DS18B20 举例&#xff08;原码补码反码转换_原码反码补码转换_王小小鸭的博客-CSDN博客…

什么是计算机视觉,计算机视觉的主要任务及应用

目录 1. 什么是计算机视觉 2. 计算机视觉的主要任务及应用 2.1 图像分类 2.1.1 图像分类的主要流程 2.2 目标检测 2.2.1 目标检测的主要流程 2.3 图像分割 2.3.1 图像分割的主要流程 2.4 人脸识别 2.4.1 人脸识别的主要流程 对于我们人类来说&#xff0c;要想认出身边…

【80天学习完《深入理解计算机系统》】第十天 3.3 条件码寄存器【CF ZF SF OF】

专注 效率 记忆 预习 笔记 复习 做题 欢迎观看我的博客&#xff0c;如有问题交流&#xff0c;欢迎评论区留言&#xff0c;一定尽快回复&#xff01;&#xff08;大家可以去看我的专栏&#xff0c;是所有文章的目录&#xff09;   文章字体风格&#xff1a; 红色文字表示&#…

01.sqlite3学习——数据库概述

目录 重点概述总结 数据库标准介绍 什么是数据库&#xff1f; 数据库是如何存储数据的&#xff1f; 数据库是如何管理数据的&#xff1f; 数据库系统结构 常见关系型数据库管理系统 关系型数据库相关知识点 数据库与文件存储数据对比 重点概述总结 数据库可以理解为操…

串行FIR滤波器

串行 FIR 滤波器设计 串行设计&#xff0c;就是在 16 个时钟周期内对 16 个延时数据分时依次进行乘法、加法运算&#xff0c;然后在时钟驱动下输出滤波值。考虑到 FIR 滤波器系数的对称性&#xff0c;计算一个滤波输出值的周期可以减少到 8 个。串行设计时每个周期只进行一次乘…

网络安全(黑客)零基础自学

网络安全是什么&#xff1f; 网络安全&#xff0c;顾名思义&#xff0c;网络上的信息安全。 随着信息技术的飞速发展和网络边界的逐渐模糊&#xff0c;关键信息基础设施、重要数据和个人隐私都面临新的威胁和风险。 网络安全工程师要做的&#xff0c;就是保护网络上的信息安…

phpstorm动态调试

首先在phpstudy搭建好网站&#xff0c;在管理拓展开启xdebug拓展 查看php.ini配置已经更改 需要增添修改一下设置 [Xdebug] zend_extensionD:/phpstudy_pro/Extensions/php/php5.6.9nts/ext/php_xdebug.dll xdebug.collect_params1 xdebug.collect_return1 xdebug.auto_trace…

Word导出创建Adobe PDF其中emf图片公式马赛克化及文字缺失

软件版本 Word 2021 Visio 2019 Adobe Acrobat Pro 2020 问题描述 公式马赛克化&#xff0c;是指在Word中使用MathType编辑的公式&#xff0c;然后在Visio中使用图片(增强型图元文件)形式得到的粘贴对象&#xff0c;效果如下 文字缺失&#xff0c;是指Word导出→创建Adobe P…

【element-ui】el-dialog改变宽度

dialog默认宽度为父元素的50%&#xff0c;这就导致在移动端会非常的窄&#xff0c;如图1&#xff0c;需要限定宽度。 解决方法&#xff1a;添加custom-class属性&#xff0c;然后在style中编写样式&#xff0c;注意&#xff0c;如果有scoped限定&#xff0c;需要加::v-deep &l…

C++ 网络编程项目fastDFS分布式文件系统(六)--qss样式表,项目文件的上传和下载。

目录 1 单例模式 2. 如何在单例类中存储数据? 3. QSS样式表 3.1 选择器类型 3.2 QSS的使用步骤 3.3 登录窗口设置 4. 客户端post方式上传数据 4.1 常用的四种方式 5. 上传协议 1 单例模式 #include<iostream> #include<vector> #include<mutex> …

初阶c语言:趣味扫雷游戏

目录 前言 制作菜单 构建游戏选择框架 实现游戏功能 模块化编程&#xff1a;查看前节三子棋的内容 初始化雷区 ​编辑 优化棋盘 随机埋入地雷 点击后的决策 实现此功能代码 game&#xff08;&#xff09;&#xff1b;的安排 前言 《扫雷》是一款大众类的益智小游戏&…

lnmp架构-PHP

08 PHP源码编译 09 php初始化配置 nginx 的并发能力强 phpinfo函数 就是 显示php信息 10 php的功能模块 编译memcache模块 php的动态模块方式 mamcache 就是内存 直接从内存中命中 所以性能非常好 但是 这还不是最好的方式 工作流程 关键看后端的 php 什么时候处理完 mamcac…

Windows部署SQL Server-开发者版

一、简介 SQL Server 开发者版本&#xff0c;是一个为开发人员准备的版本。它是免费的&#xff0c;但不能在生产中使用它。它包含所有 SQL Server 企业版的功能&#xff0c;但不能在生产中部署&#xff0c;是一个用于非生产环境的免费版本。 二、下载 访问 https://www.mic…