认识HttpServletRequest和HttpServletResponse

news2024/11/27 18:44:23

hi,大家好,上一期我们认识了HttpServlet,这一期我们来认识一下HttpServletRequest和HttpServletResponse
在这里插入图片描述

🚀HttpServletRequest

💚1.核心方法介绍

💚2.代码举例展示

🚀HttpServletResponse

💚1.核心方法展示

💚2.代码举例展示

1.HttpServletRequest

一个http请求,在Tomcat收到http请求,就会解析成上述的HttpServletRequest对象,HTTP 请求报文里面有啥,这个类里面就有啥
来看它的核心方法

方法描述
String getProtocol()返回请求协议的名称和版本
String getMthod()返回请求的HTTP方法的名称,例如get,post,或者put
String getRequest()URI从协议名称直到 HTTP 请求的第一行的查询字符串中,返回该请
求的 URL 的一部分。
String getContextPath()返回指示请求上下文的请求 URI 部分。
String getQueryString()返回包含在路径后的请求 URL 中的查询字符串。
EnumerationgetParameterNames()返回一个 String 对象的枚举,包含在该请求中包含的参数的名称。
String getParameter(Stringname)以字符串形式返回请求参数的值,或者如果参数不存在则返回null。
String[]getParameterValues(Stringname)返回一个字符串对象的数组,包含所有给定的请求参数的值,如果参数不存在则返回 null
EnumerationgetHeaderNames()返回一个枚举,包含在该请求中包含的所有的头名。
String getHeader(Stringname)以字符串形式返回指定的请求头的值。
StringgetCharacterEncoding()返回请求主体中使用的字符编码的名称。
String getContentType()返回请求主体的 MIME 类型,如果不知道类型则返回 null。
int getContentLength()以字节为单位返回请求主体的长度,并提供输入流,或者如果长度未知则返回 - 1
InputStreamgetInputStream()用于读取请求的 body 内容. 返回一个 InputStream 对象.

通过上述的方法可以获取一个请求的各个方面的信息
细心的同学可以发现方法都是get类型的,因为请求是服务器获取到的内容,不应该修改,所以都是get方法,没有set
解释一下这个方法里的URI,URI和URL不是一个东西
URL是唯一资源定位符,URI是唯一资源标识符,也可以认为URI包含于URL中,概念非常相似,很多时候就会混着用

注意一下最后一个方法,通过InputSream,进一步读取body的内容,如果确实需要按照字符处理,手动转换即可

我们都知道InputStream是按照字节流读取,为啥不按照字符流嘞?
字节流比字符流更加通用,当前数据如果是文本,那么用字符流或者字节流都行,如果数据是二进制的,那么就只能用字节流

HTTP是超文本协议,但是其实http的body也可以携带二进制数据
比如请求或者响应的body压缩过的的话,此时的body就是二进制的,当然了,大部分的请求的body都不是二进制

==================================================
下面我们用代码来认识一下这些方法
前五个我们已经在之前学习了,这里就不再赘述了~~~

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Enumeration;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: WHY
 * Date: 2023-06-09
 * Time: 16:57
 */
@WebServlet("/showRequest")
public class ShowRequest extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        StringBuilder result=new StringBuilder();
        result.append(req.getProtocol());
        result.append("<br>");
        result.append(req.getMethod());
        result.append("<br>");
        result.append(req.getRequestURI());
        result.append("<br>");
        result.append(req.getQueryString());
        result.append("<br>");
        result.append(req.getContextPath());
        result.append("<br>");

        result.append("=============================");


    /*    Enumeration<String>  headerNames=req.getHeaderNames();
        while(headerNames.hasMoreElements()){
            String headerName=headerNames.nextElement();
            String headerValue=req.getHeader(headerName);
            result.append(headerName+":"+headerValue+"<br>");
        }*/
       //设置响应格式便于让浏览器解析
       resp.setContentType("text/html; charset=utf8");
        resp.getWriter().write(result.toString());//转换成字符串的形式


    }
}

运行代码看看结果
在这里插入图片描述
在这里我不小心将result.toString()写成了resp.toString(),就出现了另一个结果
在这里插入图片描述
这一段其实就是resp对象的地址了
getParameter是最常用的API之一
前端给后端传递数据,是非常常见的需求

1.通过querystring 传递
2.通过body(form表单的形式)
3.通过body(json格式)

下面我们分别来说
1.通过query string传递

我们约定前端通过query string传递username和password
看后端代码咋写

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: WHY
 * Date: 2023-06-09
 * Time: 18:16
 */
@WebServlet("/getParameter")
public class GetParameter  extends HttpServlet {
    //前端通过query string传递username和password两个属性

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String username=req.getParameter("username");
        if(username==null){
            System.out.println("username这个key在query string不存在");

        }
        String password=req.getParameter("password");
        if(password==null){
            System.out.println("password这个key在query string不存在");
        }
        System.out.println("username="+username+",password="+password);
        resp.getWriter().write("ok");

    }


}

打开浏览器

在这里插入图片描述
在这里插入图片描述

2.通过body(form表单形式)

相当于body存的格式和query string一样,但是Content-Type是
application/x-www-form-urlencoded,也是通过getParameter来获取键值对

构造post请求(一般来说都是post请求有body)

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: WHY
 * Date: 2023-06-09
 * Time: 18:16
 */
@WebServlet("/getParameter")
public class GetParameter  extends HttpServlet {
    //前端通过query string传递username和password两个属性

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String username=req.getParameter("username");
        if(username==null){
            System.out.println("username这个key在query string不存在");

        }
        String password=req.getParameter("password");
        if(password==null){
            System.out.println("password这个key在query string不存在");
        }
        System.out.println("username="+username+",password="+password);
        resp.getWriter().write("ok");

    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       //前端通过body,以form表单的格式,将username和password传给服务器
        String username=req.getParameter("username");
        String password=req.getParameter("password");
        if(username==null){
            System.out.println("username这个key在body 不存在");
        }
        if(password==null){
            System.out.println("password这个key在body不存在");
        }

        System.out.println("username"+username+",password"+password);
        resp.getWriter().write("ok");




    }
}

这个请求是一个post请求,我们使用postman构造这个请求
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

可以看到成功返回结果

有一个问题,键值对的value是否可以是中文呢?
在这里插入图片描述

在这里插入图片描述
我们看到结果依然返回,但是这其实只是一个巧合

在URL中,如果query string 中包含中文或者特殊字符,必须使用urlencode的方式进行转码.如果直接写中文或者特殊字符,会有风险!
在这里插入图片描述

在这里插入图片描述

一敲回车
在这里插入图片描述
在这里插入图片描述

结果显示张三

如果不转码,有些浏览器或者http服务器,对中文支持不好的话,出现问题
一搬来说服务器解码(urldecode),Servlet已经处理好了,前端编码(urlencode)

post请求中
用postman来看更加直观
在这里插入图片描述
在这里插入图片描述
直接乱码了,为什么会出现乱码呢,前端默认是utf8编码方式,但是后端不知道啊,所以要给请求设置编码方式
在这里插入图片描述

此时
在这里插入图片描述

在这里插入图片描述
结果就不会乱码了

3.使用body(json格式)
json也是键值对格式的数据,要拿到key和value,但是Servlet自身没有内置json解析功能,我们拿到的就只是字符串,拿不到key和对应的value,咋办捏
我们采用第三方库,用来处理json的第三方库有很多,我们使用jackson
要引入依赖
在这里插入图片描述

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>servlet</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>


    </properties>

    <dependencies>
        <!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.1.0</version>
            <scope>provided</scope>
        </dependency>
        <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.15.0</version>
        </dependency>


    </dependencies>
    <packaging>war</packaging>
    <build>
        <finalName>hello_servlet</finalName>
    </build>
</project>

在这里插入图片描述
在这里插入图片描述
下面来解释一下这个代码的执行流程
在这里插入图片描述
在这里插入图片描述
readvalue的作用(json字符串转换成Java对象)
1.通过readValue解析json字符串转化成若干键值对
2.根据第二个参数User.class找到User里面的public的属性,依次遍历
3.根据属性名字,去准备好的键值对查询是否存在对应的value,然后赋值给该属性

总结:HttpServletRequest,这个类,主要就是用于获取到请求的各个方面的信息,尤其是前端传过来的自定义数据,自定义数据通过query
string,post body (form),post body(json)来体现

2.HttpServletResponse

依旧先来看核心方法

方法描述
void setStatus(int sc)为该响应设置状态码
void setHeader(String name,String value)设置一个带有给定的名称和值的header,如果那么name已经存在,则覆盖旧的值
void addHeader(Stringname, String value)添加一个带有给定的名称和值的 header. 如果 name 已经存在,不覆盖旧的值, 并列添加新的键值对
void setContentType(Stringtype)设置被发送到客户端的响应的内容类型。
voidsetCharacterEncoding(Stringcharset)设置被发送到客户端的响应的字符编码(MIME 字符集)例如,UTF-8。
void sendRedirect(Stringlocation)使用指定的重定向位置 URL 发送临时重定向响应到客户端
PrintWriter getWriter()用于往 body 中写入文本格式数据.
OutputStreamgetOutputStream()用于往 body 中写入二进制格式数据.

面对空的响应对象就需要设置一些属性了
也依然通过代码来看

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: WHY
 * Date: 2023-06-09
 * Time: 20:46
 */
@WebServlet("/status")
public class StatusServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setStatus(200);
        resp.setContentType("text/html charset=utf8");
        resp.getWriter().write("返回200响应");
    }
}

这个是设置状态码,根据需要自己设置
结果
在这里插入图片描述
通过header实现自动刷新效果

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: WHY
 * Date: 2023-06-09
 * Time: 20:58
 */
@WebServlet("/refresh")
public class RefreshServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //每隔一秒自动刷新一次
        resp.setHeader("Refresh","1");
        resp.getWriter().write("time="+System.currentTimeMillis());
    }
}

在这里插入图片描述
这个结果是一个动态的,时间一直在变
实现重定向

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: WHY
 * Date: 2023-06-09
 * Time: 21:03
 */@WebServlet("/redirect")
public class RedirectServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //当用户访问这个路径自动重定向到百度
        /*resp.setStatus(302);
        resp.setHeader("Location","https://www.baidu.com");*/
        resp.sendRedirect("https://www.bidu.com");

    }
}

以上就是今天所有的内容,我们下期再见,886~~~
在这里插入图片描述

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

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

相关文章

STC12读取内部ID方法介绍

STC12读取内部ID方法介绍 &#x1f516;这里以STC12LE5A60S2为例&#xff0c;从STC12手册的第一章&#xff0c;1.10小结可以找到相关的ID相关的信息。这个信息主要是用于程序加密或产品销售管理等方面。&#x1f33f;STC12LE5A60S2系统板&#xff1a; https://oshwhub.com/pers…

javaScript蓝桥杯----阅读吧

目录 一、介绍二、准备三、目标四、代码五、完成 一、介绍 “读万卷书&#xff0c;行万里路”&#xff0c;无论你现在贫穷或富有&#xff0c;身和心一定要有一个在路上。那么&#xff0c;在快节奏的今天&#xff0c;人们是如何利用碎片化的时间去阅读的呢&#xff1f;没错&…

【MySQL高级篇笔记-事务基础知识(中) 】

此笔记为尚硅谷MySQL高级篇部分内容 目录 一、数据库事务概述 1、存储引擎支持情况 2、基本概念 3、事务的ACID特性 1.原子性&#xff08;atomicity&#xff09; 2.一致性&#xff08;consistency&#xff09; 3.隔离型&#xff08;isolation&#xff09; 4.持久性&a…

卷积编码和维特比译码

文章目录 卷积编码维特比译码 卷积编码 卷积码是一种非分组码&#xff0c;通常适用于前向纠错。在分组码中&#xff0c;编码器产生的 n 个码元的一个码组&#xff0c;完全决定于这段时间中 k 比特输入信息。这个码组中的监督位仅监督本码组中 k 个信息位。卷积码在编码时虽然也…

Calico介绍

Calico 是一个基于 BGP 的纯三层的网络方案&#xff0c;与 OpenStack 、Kubernetes 、AWS 、GCE 等云平台都能够良好地集成 。 Calico 在每个计算节点都利用 Linux Kernel 实现了一个高效的 vRouter 来负责数据转发 。每个 vRouter 都通过 BGP 协议把在本节点上运行的容器的路由…

msf渗透练习-php后门反弹

说明&#xff1a; 本章内容&#xff0c;仅供学习&#xff0c;不要用于非法用途&#xff08;做个好白帽&#xff09; &#xff08;一&#xff09;后门反弹是什么 后门反弹是指攻击者在成功入侵一台计算机后&#xff0c;在目标计算机上安装一个“后门程序”&#xff0c;将该程序…

内网安全:横向传递攻击(SMB || WMI 明文或 hash 传递)

内网安全&#xff1a;横向传递攻击. 横向移动就是在拿下对方一台主机后&#xff0c;以拿下的那台主机作为跳板&#xff0c;对内网的其他主机再进行后面渗透&#xff0c;利用既有的资源尝试获取更多的凭据、更高的权限&#xff0c;一步一步拿下更多的主机&#xff0c;进而达到控…

解决语言障碍:如何将Axure变为中文版?

Axure 是一款备受称赞的原型设计工具&#xff0c;被誉为 "交互神器"。然而&#xff0c;在国内&#xff0c;一些设计师对于使用 Axure 有所犹豫&#xff0c;其中语言环境不适应是主要的顾虑之一。在本文中&#xff0c;我们将探讨一种更适合国内设计师的 Axure 中文版即…

网工内推 | 国企专场,补贴福利多,CCNP认证以上优先

01 凯盛数智信息技术科技&#xff08;上海&#xff09;有限公司 &#x1f537;招聘岗位&#xff1a;网络工程师&#xff08;IT工程师&#xff09; &#x1f537;职责描述&#xff1a; 1、负责公司数据中心机房、服务器及网络设备的管理和维护工作&#xff1b; 2、负责公司基础…

微信小程序实用工具——渐变色按钮(二)

今日推荐&#x1f481;‍♂️ 今年的国美毕业展已经开始了&#x1f9d1;‍&#x1f3a8;&#x1f9d1;‍&#x1f3a8;在杭州的小伙伴可以快速出击了&#x1f3c3;‍♂️&#x1f3c3;‍♂️ 这里我想推荐其中的一副版画作品《突围》 在众多版画系作品中被它所吸引 文章目录 今…

【linux离线升级gcc版本---gcc4.8.5-->gcc12.2.0】

【linux离线升级gcc版本---gcc4.8.5--&#xff1e;gcc12.2.0】 &#x1f53b; 一、gcc简介&#x1f53b; 二、gcc下载上传&#x1f53b; 三、查看和安装gcc-12.2.0需要的依赖3.1 &#x1f341; 查看gcc-12.2.0所需依赖库3.2 &#x1f341; 安装gmp、mpfr、mpc、isl &#x1f53…

DJ4-8 抖动与工作集

目录 4.8 抖动与工作集 1、缺页率对有效访问时间的影响 2、CPU 利用率急剧下降的原因 3、抖动 4、工作集模型 5、抖动的预防 4.9 请求分段存储管理方式 4.9.1 请求分段中的硬件支持 4.9.2 分段的共享与保护 4.8 抖动与工作集 1、缺页率对有效访问时间的影响 有…

总建面64万平,配3所幼儿园+54班九年制学校,坪山江岭竹元规划

近日&#xff0c;坪山区城市更新和土地整备局发布&#xff0c;关于《坪山区马峦街道江岭竹元片区城市更新单元规划》已通过深圳市城市规划委员会法定图则委员会审批。现予以公告。 项目位于坪山区马峦街道&#xff0c;南邻南坪快速路&#xff0c;北邻比亚迪路&#xff0c;东西两…

一种新型智能优化算法—鼠群优化(RSO)算法

目录 一、RSO理论基础 二、RSO数学模型 2.1 追逐猎物 2.2 攻击猎物 三、RSO流程图 四、运行结果 鼠群优化(Rat Swarm Optimizer&#xff0c;RSO)算法是由Dhiman G等人于2020年提出&#xff0c;主要启发于老鼠追逐和攻击猎物的种群行为。该优化算法具有结构简单&#xf…

DJ4-2 程序的装入和链接

目录 4.2.1 程序的装入 一、绝对装入方式 二 、可重定位装入方式 三、动态运行时装入方式 4.2.2 程序的链接 一、静态链接 二、装入时动态链接 三、运行时动态链接 在多道程序环境下&#xff0c;如果程序要运行&#xff0c;那么必须为之创建进程。而创建进程的第一件…

六级备考8天|CET-6|阅读强化2|19:30~21:00

目录 正确选项两大标准 练习 问题一 问题二 问题三 问题四​ 问题五 ​ 正确选项两大标准 1. 定位准确 2. 改写正确 举例&#xff1a; 练习 问题一 immediate vicinity oftoo close unprecedented 前所未有的&#xff1b; 问题二 主语&#xff1a;a global campaign 谓…

解决问题 Could not obtain transaction-synchronized Session for current thread

一、问题现象 在使用Hibernate的项目中&#xff0c;在一个定时任务中&#xff0c;执行某段代码&#xff0c;满足条件后&#xff0c;更新表数据。 程序在执行到更新表数据的时候&#xff0c;报错如下&#xff1a; Could not obtain transaction-synchronized Session for cur…

chatgpt赋能python:用Python优化微信群SEO

用Python优化微信群SEO 随着微信群的普及&#xff0c;越来越多的人开始将其作为社交媒体和个人品牌的重要推广渠道之一。然而&#xff0c;想要让你的微信群在搜索引擎中排名靠前&#xff0c;就需要进行一些有效的SEO技巧&#xff0c;以吸引更多的目标用户。 在本文中&#xf…

黏糊糊的菜单

先看效果&#xff1a; 再看代码&#xff1a; <!--黏糊糊的菜单 可融合--> <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-s…

【pytorch】维度变换

【pytorch】维度变换 View操作unSqueeze操作图片处理的一个案例squeeze 维度删减操作维度扩展-expand维度扩展-repeat矩阵的转置操作-transpose View操作 将一个四维的张量&#xff08;b x c x h x w&#xff09;转换成一个二维的张量 对于四张图片 将每一张图像用一行向量进…