板块一 Servlet编程:第三节 HttpServletRequest对象全解与请求转发 来自【汤米尼克的JAVAEE全套教程专栏】

news2024/11/27 1:28:30

板块一 Servlet编程:第三节 HttpServletRequest对象全解与请求转发

  • 一、什么是HttpServletRequest
  • 二、接收请求的常用方法
  • 三、请求乱码问题
  • 四、请求转发:forward
  • 五、Request作用域
    • getParameter和getAttribute的区别

在上一节中我们已经学习了完整的Servlet的实现方式、Servle的工作流程和生命周期,但对于service(HttpServletRequest req, HttpServletResponse resp)中的两个重要形参还不了解,我们所有的请求响应都是通过这两个形参来实现的。这节教程开始将详解Servlet的几大对象。

一、什么是HttpServletRequest

HttpServletRequest对象:主要作用是用来接收客户端发送过来的请求信息。例如:请求的参数、发送的头信息等都属于客户端发来的信息,service()方法中形参接收的是HttpServletRequest接口的实例化对象,表示该对象主要应用在HTTP协议上,该对象是由Tomcat封装好传递过来。

  • HttpServletRequest是ServletRequest的子接口,ServletRequest只有一个子接口,就是HttpServletRequest。既然只有一个子接口为什么不将两个接口合并为一个?从长远上讲:现在主要用的协议是HTTP协议,但以后可能出现更多新的协议。若以后想要支持这种新协议,只需要直接继承ServletRequest接口就可以
  • 在HttpServletRequest接口中,定义的方法很多,但都是围绕接收客户端参数的。我们只需直接在service() 方法中由对象传入过来,数据自然就已经被封装在对象容器中了,这为我们所有请求的进行分析、处理提供了非常便捷的操作方式

二、接收请求的常用方法

在这里插入图片描述
实例
我们在helloServlet.java的service()方法中添上这些方法

protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        super.service(req, resp);
        String userName = req.getParameter("");
        String url = req.getRequestURI();
        System.out.println("获取请求的完整路径:" + url);
        String queryString = req.getQueryString();
        //URL中?后面的参数部分
        System.out.println("获取请求的参数字符串:(?后面):" + queryString);
        String method = req.getMethod();
        System.out.println("获取请求方式:" + method);
        String protocol = req.getProtocol();
        System.out.println("获取当前协议版本:" + protocol);
        String  webapp = req.getContextPath();

//      获取指定的参数
        System.out.println("获取项目站点名(对外访问路径):" + webapp);
        String name=req.getParameter("name");
        System.out.println("接受到的参数是:"+ name + '\n');
    }

启动服务器,浏览器访问项目,控制台输出
在这里插入图片描述
其中getParameter("...")是个很重要的方法,它可以根据参数名称获取参数值

//      获取指定的参数
        System.out.println("获取项目站点名(对外访问路径):" + webapp);
        String name=req.getParameter("name");
        System.out.println("接受到的参数是:"+ name + '\n');

实例
当上面的代码在浏览器URL后面输入跟上参数name=ToomyNike
在这里插入图片描述
控制台得
在这里插入图片描述

三、请求乱码问题

由于现在的request属于接收客户端的参数,所以必然有其默认的语言编码,不同版本的服务器,不同的请求方式都会产生不一样的效果

Tomcat 8及以上Tomcat 7及以下
GET请求不会乱码会乱码,使用new String(request.getParameter(name).getBytes("ISO-8859-1"),"UTF-8");
POST请求会乱码,设置服务器编码格式request.setCharacterEncoding("UTF-8");会乱码,设置服务器编码格式request.setCharacterEncoding("UTF-8");

主要是由于在解析过程中默认使用的编码方式为ISO-8859-1此编码不支持中文,所以解析时一定会出现乱码。要想解决这种乱码问题,需要设置Request中的编码方式,告诉服务器以何种方式来解析数据。或者在接收到乱码数据以后,再通过相应的编码格式还原。

实例:当前是Tomcat8.5 以POST请求提交给helloServlet.java的Servlet进行测试
我们在web目录下新建hello.jsp文件
在这里插入图片描述

写入以POST为提交方式的测试表单,注意提交路径只需写为我们Servlet里@WebServlet("/helloServlet")注释的路径即可,之后遇到不再赘述

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
	<head>
	    <title>hello</title>
	    <h1>Tomcat with IDEA</h1>
	</head>
	<body>
		<form action="helloServlet" method="post">
		    输入参数<input type="text" name="name">
		    <button>提交</button>
		</form>
	</body>
</html>

启动服务器在浏览器中访问hello.jsp,输入中文参数,点击提交,跳转到helloServlet.java
在这里插入图片描述

控制台输出的内容是乱码
在这里插入图片描述
解决方式

  • 方式一 设置服务器编码格式request.setCharacterEncoding("UTF-8");这种方式只针对POST有效且必须在接收所有的数据之前设定

实例
在helloServlet.java的service()中,接受参数参数之前添上代码

        req.setCharacterEncoding("UTF-8");
        String name=req.getParameter("name");
        System.out.println("接受到的参数是:"+ name + '\n');

便解决中文乱码问题了
在这里插入图片描述

  • 方式二 在获取参数时使用String对象的方法new String(request.getParameter(name).getBytes("ISO-8859-1"),"UTF-8");该种方式对任何请求有效,是通用的。注意Tomcat8起,以后的GET方式请求是不会出现乱码的,并且Tomcat8以上的GET请求强行使用此方法还会导致乱码

四、请求转发:forward

请求转发是一种服务器的行为,当客户端请求到达后,服务器进行转发,此时会将请求对象进行保存,地址栏中的URL地址不会改变,得到响应后,服务器端再将响应发送给客户端,从始至终只有一个请求发出。

实现方式如下,达到多个资源协同响应的效果

request.getRequestDispatcher("url").forward(request, response);

实例
在helloServlet.java中写入测试代码

        //接收客户端请求的参数
        String name=req.getParameter("name");
        System.out.println("helloServlet接受到了参数:"+ name);
        // 请求转发跳转到
        req.getRequestDispatcher( "Servlet_do").forward(req,resp);

在Servlet_do.java中写入接受参数的代码

        String name=req.getParameter("name");
        System.out.println("Servlet_do接受到了参数:"+ name);

启动服务器,在浏览器中访问helloServlet并传递参数,提交后发现地址栏没有改变
在这里插入图片描述
控制台两个文件都打印了
在这里插入图片描述
说明参数在helloServlet中成功请求转发到了Servlet_do中
此时,如果直接访问Servlet_do
在这里插入图片描述
会发现控制台接收不到参数
在这里插入图片描述
这是因为请求转发从始至终只有一个请求,就是helloServlet的Request对象

五、Request作用域

在上面的代码中,我们通过浏览器的地址栏或者jsp的表单提交了很多参数,在Servlet中用Request对象的req.getParameter("name")方法接受了这些参数,除了这个方法,Request对象也可以在一个请求中传递数据,作用范围:在一次请求中有效,即服务器跳转有效,除了接受参数,它还可以设置内容或者删除内容

// 设置域对象内容 第一个参数为名称,第二个参数为内容
request.setAttribute(String name, Obj value);
// 获取域对象内容
request.getAttribute(String name);
// 删除域对象内容
request. removeAttribute(String name);

实例
新建一个start.java作为我们发送参数的Servlet

package www.caijiyuan;

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;

@WebServlet("/start")
public class start extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //设置参数age的内容
        req.setAttribute("age",18);
        // 请求转发跳转到after.java
        req.getRequestDispatcher( "after").forward(req,resp);
    }
}

新建一个after.java作为我们接受参数的Servlet

package www.caijiyuan;

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;

@WebServlet("/after")
public class after extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        int age = (int) req.getAttribute("age");
        System.out.println("接受到的参数为:" + age);
    }
}

启动服务器,在浏览器访问start以后,控制台输出
在这里插入图片描述
就实现了一次Request作用域的完整范围,也就是一次请求转发的范围:
从始至终只有一个请求发出,也就只有start.java里的Request发出

getParameter和getAttribute的区别

那么好像req.getParameter("...")req.getAttribute("...")都可以接受参数,让人傻傻分不清楚,它们的区别是什么?
getParameter的过程如下图
在这里插入图片描述
getAttribute过程如下图
在这里插入图片描述
二者可以具体区分为这个表格

getParametergetAttribute
获取的是客户端设置的数据获取的是服务器设置的数据
永远返回字符串返回值是任意类型

既然parameter和attribute都是传递参数,为什么不直接使用parameter呢?

  • 服务器端不能通过setParameter(key,value)来添加参数,因为没有这个函数,所以如果需要在服务器端进行跳转,并需要想下个页面发送新的参数时,则没法实现。是Attribute可以,可以通setAttribute()将值放入到request对象,然后在其他页面使用getAttribute获取对应的值,这样就达到一次请求可以在多个页面共享一些对象信息
  • parameter返回值是字符串,意味着不能传递其他的对象,如Map,List,但是attribute则可以存放任意类型的Java对象

以上就是HttpServletRequest对象的所有基础内容了,下一节我们将学习请求的兄弟:HttpServletResponse(响应)对象

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

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

相关文章

【Linux】进程地址空间的理解

进程地址空间的理解 一&#xff0c;什么是程序地址空间二&#xff0c;页表和虚拟地址空间三&#xff0c;为什么要有进程地址空间 一&#xff0c;什么是程序地址空间 在我们写程序时&#xff0c;都会有这样下面的内存结构&#xff0c;来存放变量和代码等数据。 一个进程要执行…

【安全狐】Windows隐藏计划任务技术及排查方法

0x00 前置知识 计划任务SCHTASKS命令 SCHTASKSSCHTASKS /Create 参数 SCHTASKS /Create [/S system [/U username [/P [password]]]][/RU username [/RP password]] /SC schedule [/MO modifier] [/D day][/M months] [/I idletime] /TN taskname /TR taskrun [/ST starttim…

掘根宝典之C++深复制与浅复制(复制构造函数,默认复制构造函数)

到目前为止我们已经学了构造函数&#xff0c;默认构造函数&#xff0c;析构函数&#xff1a;http://t.csdnimg.cn/EOQxx 转换函数&#xff0c;转换构造函数&#xff1a;http://t.csdnimg.cn/kiHo6 友元函数&#xff1a;http://t.csdnimg.cn/To8Tj 接下来我们来学习一个新函数…

FL Studio21.2.3最新版一键安装版专业版水果FLStudio 2024最新下载

FL Studio21.2.3.4004中文破解版系统要求&#xff1a; 版本&#xff1a;v21.2.3 内部版本 [4004] 开发商&#xff1a; Image-Line 格式&#xff1a;独立、VST 位深度&#xff1a;64位 界面语言&#xff1a;英语、德语、西班牙语、法语、中文。 系统环境 Microsoft Window…

AcuAutomate:一款基于Acunetix的大规模自动化渗透测试与漏洞扫描工具

关于AcuAutomate AcuAutomate是一款基于Acunetix的大规模自动化渗透测试与漏洞扫描工具&#xff0c;该工具旨在辅助研究人员执行大规模的渗透测试任务。 在大规模的安全测试活动中&#xff0c;AcuAutomate可以帮助我们同时启动或停止多个Acunetix扫描任务。除此之外&#xff…

ASUS华硕枪神8笔记本电脑G614JIR,G814JVR,G634JYR,G834JZR工厂模式出厂Windows11系统 带重置还原功能

适用ROG枪神8系列笔记本型号&#xff1a; G614JIR、G614JVR、G634JYR、G634JZR G814JIR、G814JVR、G834JYR、G834JZR 链接&#xff1a;https://pan.baidu.com/s/1tYZt6XFNC2d6YmwTbtFN7A?pwd3kp8 提取码&#xff1a;3kp8 带有ASUS RECOVERY恢复功能、自带所有驱动、出厂主…

minio+nginx 集群快速搭建

文章目录 1、概要2、整体架构流程3、集群搭建3.1、服务器准备3.2、下载并安装3.3、minio集群配置3.4、minio.service配置3.5、启动 4、nginx 转发 1、概要 minIO 是一个开源的分布式对象存储服务&#xff0c;可用于构建高可用性和高扩展性的存储集群。 分布式架构&#xff1a;…

Ubuntu本地安装code-server结合内网穿透实现安卓平板远程写代码

文章目录 1.ubuntu本地安装code-server2. 安装cpolar内网穿透3. 创建隧道映射本地端口4. 安卓平板测试访问5.固定域名公网地址6.结语 1.ubuntu本地安装code-server 准备一台虚拟机,Ubuntu或者centos都可以&#xff0c;这里以VMwhere ubuntu系统为例 下载code server服务,浏览器…

http协议概念与使用

一、http相关概念 1.1 什么是 http HTTP协议采用了请求/响应模型。客户端向服务器发送一个请求&#xff0c;请求头包含请求的方法、URL、协议版本、以及包含请求修饰符、客户信息和内容的类似于MIME的消息结构。 服务器以一个状态行作为响应&#xff0c;响应的内容包括消息协…

STM32-点亮 LED

目录 1 、电路构成及原理图 2 、编写实现代码 3、代码讲解 4、烧录到开发板调试、验证代码 5、检验效果 本人使用的是朗峰 STM32F103 系列开发板&#xff0c;此笔记基于这款开发板记录。 1 、电路构成及原理图 首先&#xff0c;通过朗峰 F1 开发板 LED 部分原理图看到…

计算机专业必看《编程之神》

前言 这是一部关于数学家艾伦图灵&#xff08;Alan Turing&#xff09;的人物传记电影,非常值得一看. 影片中&#xff0c;艾伦图灵被描绘成一个富有创造力、勇气和独立思考的人物。他的天才思维和对计算机的理解在纠缠复杂的密码解密过程中发挥了重要作用。 图灵的天才 提出图灵…

20. 【Linux教程】emacs 编辑器

前面小节介绍了如何使用 vim 编辑器和 nano 编辑器&#xff0c;本小节介绍 emacs 编辑器&#xff0c;emacs 编辑器最开始是作为控制台的编辑器&#xff0c;并且 emacs 编辑器仍然提供最早的命令行模式。 1. 检查 Linux 系统中是否安装 emacs 编辑器 使用如何命令检查 emacs 编…

显微测量|台阶仪二维超精密测量微观形貌

台阶仪通过扫描被测样品表面&#xff0c;获取高分辨率的表面形貌数据&#xff0c;能够揭示微观结构的特征和性能。 标题了解工作原理和性能特点 台阶仪利用扫描探针在样品表面上进行微观测量&#xff0c;通过探测探针和样品表面之间的相互作用力&#xff0c;获取表面形貌信息…

C++学习Day06之继承中的对象模型

目录 一、程序及输出1.1 程序检验对象1.2 开发人员工具查看对象模型1.2.1 查看对应工程目录文件1.2.2 查看对象模型 二、分析与总结 一、程序及输出 1.1 程序检验对象 父类中私有属性&#xff0c;子类访问不到&#xff0c;是由编译器给隐藏了&#xff0c;但仍然在子类对象模型…

【Visual Studio】技巧 :自动与活动文档同步

在这里插入图片描述 工具 -> 选项 -> 项目和解决方案 - 勾选上面的 我厉害不&#xff01;&#xff01;&#xff01;

B端系统升级方案模板:针对美观性和体验性升级(总体方案)

大家好&#xff0c;我是大美B端工场&#xff0c;专注于前端开发和UI设计&#xff0c;有需求可以私信。本篇从全局分享如何升级B端系统&#xff0c;搞B端系统升级的有个整体思维&#xff0c;不是说美化几个图标&#xff0c;修改几个页面就能解决的&#xff0c;这个方案模板&…

数据安全之认识数据资产管理平台

文章目录 一、什么是数据资产二、什么是数据资产管理平台1、什么是数据资产管理平台2、为什么需要数据资产管理平台 三、数据资产管理平台的主要功能四、数据资产管理平台的工作原理五、数据资产管理平台的应用场景六、安全资产管理平台与数据资产管理平台的区别与关系1、安全资…

IDEA配置Maven的步骤

目录 一 下载Maven 二 下载以后解压。在这个文件夹下新建一个文件夹&#xff0c;命名为“maven-repository” 三 在maven文件夹下&#xff0c;打开conf&#xff0c;选择settings文件&#xff0c;用notepad打开&#xff0c;改动3个地方 四 打开IDEA&#xff0c;左上角选择“…

尚硅谷最新Node.js 学习笔记(四)

目录 八、express框架 8.1、express介绍 8.2、express使用 express下载 express初体验 8.3、express路由 什么是路由&#xff1f; 路由的使用 获取请求参数 获取路由参数 8.4、express响应设置 8.5、express中间件 什么是中间件&#xff1f; 中间件的作用 中间件…

网络同步—帧同步和状态同步解析

概述 同步就是要多个客户端表现效果是一致的&#xff0c;而且对于大多数的游戏&#xff0c;不仅仅要表现一致&#xff0c;还要客户端和服务器的数据也是一致的。所以同步是个网络游戏概念&#xff0c;只有网络游戏才需要同步&#xff0c;而单机游戏是不需要同步的。 帧同步和…