【Servlet】4:详解请求对象 HttpServletRequest

news2024/11/17 2:25:10

目录

| 请求对象 HttpServletRequest接口

HttpServletRequest的基本概述

请求对象获取 URL & Method

请求对象获取 参数名

请求对象获取 参数值

参数值乱码问题


本文章属于后端全套笔记的第三部分

(更新中)【后端入门到入土!】Java+Servlet+JDBC+SSM+SpringBoot+SpringCloud 基础入门_m0_57265007的博客-CSDN博客一篇文章,后端入门到入土。包含 Java基础+高级、MySQL、JDBC、Servlet、SSM、SpringBoot、SpringCloud、项目 的笔记。https://blog.csdn.net/m0_57265007/article/details/127962617?csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22127962617%22%2C%22source%22%3A%22m0_57265007%22%7D

| 请求对象 HttpServletRequest接口

HttpServletRequest的基本概述

HttpServletRequest在哪里使用?

  • 仔细观察就能发现,之前的 doGet 和 doPost 方法的参数列表内为 HttpServletRequest req, HttpServletResponse resp

  • 这两个参数就是我们现在学习的HttpServletRequest和之后要学习的HttpServletRespose

  • 我们再来复习一下Tomcat处理请求的全流程,好方便接下来更清晰地使用它

当一个请求发送到Tomcat之后,首先经过Service然后会交给Connector,Connector用于接收请求并将接收的请求封装为Request和Response来具体处理,Request和Response封装完之后再交由Container内的Servlet进行处理,Container处理完请求之后再返回给Connector,最后在由Connector通过Socket将处理的结果返回给客户端,这样整个请求的就处理完了!

HttpServletRequest是什么?

  • HttpServletRequest来自于Servlet规范中,是一个接口

  • 实现类由 HTTP服务器(Tomcat)提供

  • HttpServletRequest的实现类对象被称为请求对象

作用?

  • HttpServletRequest接口负责在doGet/doPost方法运行时读取Http请求协议包中信息

  • 读取Http请求协议包中【请求行】信息

  • 读取保存在Http请求协议包中【请求头】或【请求体】中请求参数信息

  • 代替浏览器向Http服务器申请资源文件调用


请求对象获取 URL & Method

语法

  • 参考资料:URL 和 URI 的区别

request.getRequestURI();  //获取请求行的URI
request.getRequestURL();  //获取请求行的URL
request.getMethod();      //获取请求行的method(请求方式)

示例

  • 下面的Servlet的实现类相关web.xml配置已经配好了。

  • 网站部署在Tomcat的别名为web2。该Servlet对象的别名为web1.、

  • 配置完毕、代码写完之后,启动Tomcat,输入URLhttp://localhost:8080/web2/web1 即可访问Servlet

public class MyServlet extends HttpServlet {

    @Override
    public void init() throws ServletException {
        super.init();
        System.out.println("MyServlet对象被创建了");
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //super.doGet(req, resp); 如果你是要彻底覆盖父类的doGet方法,不需要父类提供的功能,就可以删除super.doGet(req,resp);这一句
        System.out.println("这是Servlet的doGet方法");

        //request.getRequestURI()
        System.out.println("获取到请求行的URL:" + req.getRequestURL());  //http://localhost:8080/web2/web1
        System.out.println("获取到请求行的URI:" + req.getRequestURI());  ///web2/web1
        //request.getMethod()
        System.out.println("获取到请求行的method(请求方式):" + req.getMethod());  //?GET
    }
}


请求对象获取 参数名

语法

使用 getParameterNames 方法,返回一个 Enumeration 枚举类

Enumeration parameters = request.getParameterNames();
while(parameters.hasMoreElements()){
	String parameter = (String)parameters.nextElement(); //得到的是Object,所以要强转为String
}

示例

  • 下面的代码、web.xml配置、Tomcat部署,和上一小节完全一样

  • 本次输入的URL为:http://localhost:8080/web2/web1?name=Klee&age=12 模拟有参数的情形

public class MyServlet extends HttpServlet {

    @Override
    public void init() throws ServletException {
        super.init();
        System.out.println("MyServlet对象被创建了");
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //...
        
        //request.getParameters
        Enumeration parameters = req.getParameterNames();
        while(parameters.hasMoreElements()){
            System.out.println("参数名:" + (String)parameters.nextElement());//得到的是Object,所以要强转为String
            //参数名:name    参数名:age
        }
    }
}

请求对象获取 参数值

语法

String value = request.getParameter(参数名);

联系上一小节 获取参数名 的代码,则完整代码如下

Enumeration parameters = request.getParameterNames();
int i = 1;
while(parameters.hasMoreElements()){
	String parameterName = (String)parameters.nextElement();//得到的是Object,所以要强转为String
	String parameterValue = request.getParameter(parameterName);
	System.out.println("参数" + i + ":" + parameterName + " = " + parameterValue);
    //name = Klee   age = 12
}

示例

  • 下面的代码、web.xml配置、Tomcat部署,和上一小节完全一样

  • 本次输入的URL为:http://localhost:8080/web2/web1?name=Klee&age=12 模拟有参数的情形

public class MyServlet extends HttpServlet {

    @Override
    public void init() throws ServletException {
        super.init();
        System.out.println("MyServlet对象被创建了");
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //...
        
        //request.getParameters
        Enumeration parameters = req.getParameterNames();
        int i = 1;
        while(parameters.hasMoreElements()){
            String parameterName = (String)parameters.nextElement();//得到的是Object,所以要强转为String
            String parameterValue = req.getParameter(parameterName);
            System.out.println("参数" + i++ + ":" + parameterName + " = " + parameterValue);
            //参数1:name = Klee  参数2:age = 12
        }
    }
}
 

参数值乱码问题

为什么来自POST请求获取到的参数值会乱码?

  • 浏览器若以GET方式发送请求,请求参数保存在【请求头】,在Http请求协议包到达Http服务器之后,第一件事就是进行解码请求头二进制内容由Tomcat负责解码,Tomcat9.0默认使用【utf-8】字符集解码请求头,可以解释一切国家文字

  • 浏览器若以POST方式发送请求,请求参数保存在【请求体】,在Http请求协议包到达Http服务器之后,第一件事就是进行解码请求体二进制内容由当前请求对象(request)负责解码。request默认使用[IS0-8859-1]字符集解码请求体,一个东欧语系字符集此时如果请求体参数内容是中文,将无法解码只能得到乱码

  • 需要注意的是,任意版本的Tomcat都存在POST请求乱码问题,仅8.0版本前的Tomcat存在GET请求乱码(因此本节不介绍GET请求乱码,需要的自己百度)

    除此之外,除了上述Tomcat服务器与浏览器间的编码不匹配导致的乱码问题外,我们还要考虑一下由于控制台输出的编码设置引起的乱码,同时还要考虑一下由于本地代码文件中的字符设置引起的乱码

浏览器若以POST方式发送请求,请求参数保存在【请求体】,在Http请求协议包到达Http服务器之后,第一件事就是进行解码请求体二进制内容由当前请求对象(request)负责解码。request默认使用[IS0-8859-1]字符集解码请求体,一个东欧语系字符集此时如果请求体参数内容是中文,将无法解码只能得到乱码

解决POST乱码的基本思路

在Post请求方式下,在读取请求体内容之前,应该通知请求对象使用utf-8字符集对请求体内容进行一次重新解码

POST乱码、控制台输出乱码、本地代码中文乱码 解决办法

  • 在doPost方法的第一行添加代码 req.setCharacterEncoding("UTF-8");(该方法只针对POST乱码有效,即只能用于doPost)

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("UTF-8");
        System.out.println("编码方式" + req.getCharacterEncoding());

        String parameterValue = req.getParameter("userName");
        System.out.println(parameterValue);
    }

如果POST加了第一行代码之后还是乱码,甚至GET也乱码,则可以考虑是控制台输出乱码

解决办法:【点击Edit Configuration ,在VM Options】 输入 -Dfile.encoding=utf-8

(该方法解决的办法对POST和GET都有效:作用是解决控制台输出乱码) 参考资料1 参考资料2



 

如果使用了上述两种方法后,来自浏览器的中文不乱码了,但是代码中的中文又乱码了,则可以考虑进入【Settings - Editor - File Encdings】设置一下

示例

    <form action="/web2/postWeb" method="GET">
      请求参数:<input type="text" name="userName"/>
      <br/>
      <input type="submit" value="POST方式访问Servlet">
    </form>

 

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("UTF-8");
        System.out.println("编码方式" + req.getCharacterEncoding());

        String parameterValue = req.getParameter("userName");
        System.out.println(parameterValue);

 

    <!--Servlet实现类PostServlet的配置-->
    <servlet>
        <servlet-name>MyPostServlet</servlet-name>
        <servlet-class>controller.PostServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>MyPostServlet</servlet-name>
        <url-pattern>/postWeb</url-pattern>
    </servlet-mapping>

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

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

相关文章

CAN电压测试

CAN总线&#xff1a; 一般用在汽车&#xff0c;伺服驱动器&#xff0c;步进驱动器&#xff0c;舵机&#xff0c;分布式io等设备上。 有以太网转CAN和4G网转CAN。 当然得到数据后&#xff0c;可以往RS485等上面转。 只需要2根线&#xff1a; H和L线&#xff0c;终端再并联120…

Linux history 命令相关使用以及配置

Linux history 命令相关使用以及配置 Linux history 新手学习 shell 的时候都知道 history 命令能帮助我们查看之前运行的命令集合&#xff0c;通过这个能够帮我们回忆之前的命令&#xff0c;以及进行各种排错等等。 比如我们直接输入 history 进行查看&#xff1a; histor…

Flutter高仿微信-第20篇-支付-充值

Flutter高仿微信系列共59篇&#xff0c;从Flutter客户端、Kotlin客户端、Web服务器、数据库表结构、Xmpp即时通讯服务器、视频通话服务器、腾讯云服务器全面讲解。 详情请查看 效果图&#xff1a; 实现代码&#xff1a; /*** Author : wangning* Email : maoning20080809163.…

Android AIDL跨进程通信基础(多端情况)

简介 AIDL建议在来自不同的客户端访问你的服务并且需要处理多线程问题时你才必须使用AIDL&#xff0c;其他情况下你都可以选择其他方法&#xff0c;如使用 Messenger&#xff0c;也能跨进程通信。可见 AIDL 是处理多线程、多客户端并发访问的&#xff0c;而 Messenger 是单线程…

年末盘点时间——用Python绘制饼状图对商品库存进行分析

人生苦短&#xff0c;我用python 存货盘点最重要的是什么&#xff0c;盘点比例要达到&#xff0c; 比如说要达到80%&#xff0c;于是就拿着企业给导的进销存明细表&#xff0c; 于是就开始筛选大金额的存货作为选择的样本&#xff0c; 这样就够比例了。 可是实际盘点的时候…

手把手教你在ARM板上写一个驱动程序!

摘要&#xff1a;搞嵌入式有两个方向&#xff0c;一个是嵌入式软件开发(MCU方向)&#xff0c;另一个是嵌入式软件开发(Linux方向)。其中MCU方向基本是裸机开发和RTOS开发。而Linux开发方向又分为驱动开发和应用开发。其中应用开发相比于驱动开发来说简单一些&#xff0c;因为搞…

初阶指针---从入门到入坟

今天我们来见识一下c语言里让万千少年少女从入门到入坟的一道大门槛——指针 目录 1.指针是什么&#xff1f; 2.指针和指针类型 3.野指针 4. 指针运算 5. 指针和数组 6. 二级指针 7. 指针数组 1.指针是什么&#xff1f; 指针理解的2个要点&#xff1a; 1. 指针是内存中一…

C语言:计算阶乘与计算从1加到100的代码对比:都要用到3个变量,不同之处在于表达式

计算1 到 100 之间所有整数之和 #include <stdio.h> int main() {int i1,total0;while(i<100)//不能在 while 后面加分号{totali;i;//循环内要有使循环趋近于假的操作}printf("%d\n",total);return 0; } 和下面对比&#xff0c;只不过是100用输入j来代替了 …

将windows的显示器作为linux的扩展屏

这里写自定义目录标题前言WinLinuxRequirementsBuild and install运行前言 测试的linux系统为ubuntu 18.04测试的windows系统为win10将windows的显示器作为linux的扩展屏&#xff0c;需要使用微软的Miracast技术。windows自带就不多说了&#xff0c;linux使用的是这个开源软件…

MATLAB绘图合集:填充二维等高线图contourf

本文主要介绍填充的二维等高线图和基本的用法例子 目录 说明 例子 绘制10个层级的等高线 显示具有标签的特定层级的等高线图 自定义等高线线宽 说明 contourf(Z) 创建一个包含矩阵 Z 的等值线的填充等高线图&#xff0c;其中 Z 包含 x-y 平面上的高度值。MATLAB会自动选择…

【第六部分 | JavaScript高级】3:正则表达式

目录 【第三章】正则表达式&#xff08;重点&#xff09; | 概述 | 创建正则表达式 | 测试某个字符串是否符合正则 | 正则符号 什么是正则符号&#xff1f; 1.1.边界符 ^ $ 1.2.连字符 - 2.1.字符类—方括号符 [] 2.2.字符类—方括号符内 范围符 - &#xff08;易错&a…

nacos服务注册源码过程阅读

准备部分 这是在真正调用注册实例的方法之前&#xff0c;需要使用到的对象的关系图。 源码跟踪 NacosServiceRegistryAutoConfiguration类 Configuration(proxyBeanMethods false) EnableConfigurationProperties ConditionalOnNacosDiscoveryEnabled ConditionalOnPropert…

C语言学习之路(基础篇)—— 内存管理

说明&#xff1a;该篇博客是博主一字一码编写的&#xff0c;实属不易&#xff0c;请尊重原创&#xff0c;谢谢大家&#xff01; 作用域 C语言变量的作用域分为&#xff1a; 代码块作用域(代码块是{}之间的一段代码)函数作用域文件作用域 1) 局部变量 生命周期&#xff1a;…

Python 基础(一):初识 Python

文章目录Python是什么解释型语言Python 之父Python 名字的由来Python 的应用领域人生苦短&#xff0c;我用 Python大家好&#xff0c;我是水滴~~ 本文对 Python 做了一个初步的介绍&#xff0c;并了解 Python 的作者、名字由来、应用领域等。 Python是什么 Python 是一种面向…

什么是软件测试?

什么是软件测试&#xff1f; 软件测试的定义&#xff1a;在一定条件下对软件进行操作&#xff0c;发现软件的问题&#xff0c;提高软件的质量。 软件测试在开发中的有着重要地位。软件测试在各阶段的完成相应的任务&#xff0c;需求测试&#xff0c;架构测试&#xff0c;详细测…

C语言条件运算符——三元表达式例题(素材来自C技能树)

&#x1f4d1;三目运算符 三目运算符也叫条件运算符、三元运算符&#xff0c;是由一个问号和一个冒号组成。语法&#xff1a;表达式1?表达式2:表达式3;语义&#xff1a;先执行表达式1&#xff0c;如果表达式1的结果如果为真&#xff0c;那么执行表达式2&#xff0c;并且这个整…

level2接口有什么用?是如何获取A股行情数据的?

目前国内有很多数据团队专门为金融机构、学术团体和量化研究者们提供的本地量化金融数据服务&#xff0c;那么最常见的就是通达信、同花顺等团队&#xff0c;他们开发出来的level2接口可快速查看和计算金融数据&#xff0c;无障碍解决本地、Web、金融终端调用数据的需求。为了满…

彻底解决 K8s 节点本地存储被撑爆的问题

一、存储的内容 要解决存储使用过多的问题&#xff0c;就得先了解存储中都保存了些什么内容&#xff0c;否则解决不了问题&#xff0c;还可能带来更多的风险。 1.1、镜像 容器要在节点上运行&#xff0c;kubelet 首先要拉取容器镜像到节点本地&#xff0c;然后再根据镜像创建…

3分钟读懂RD与RT

Route-Distinguisher&#xff08;后简称"RD"&#xff09;&#xff0c;Route-Target&#xff08;后简称"RT"&#xff09;经常出现在EVPN、MPLS VPN中&#xff0c;但它们是完全不同的两个概念&#xff0c;初学者往往难以区分两者的差异。学霸题&#xff1a;区…

Jmeter入门

性能测试&#xff1a;模拟多个用户的操作对服务器硬件性能的影响 TPS&#xff1a;Transaction per Second&#xff0c;每秒事务处理能力 RT&#xff1a;Response Time&#xff0c;响应时间 安装 由于本人只有window系统&#xff0c;故只讲解win下的安装 安装JDK 下载地址&a…