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

板块一 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 {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//设置参数age的内容req.setAttribute("age",18);// 请求转发跳转到after.javareq.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 {@Overrideprotected 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.mzph.cn/news/690520.shtml

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

相关文章

政安晨:【完全零基础】认知人工智能(一)【超级简单】的【机器学习神经网络】 —— 预测机

开个头 很多小伙伴们很想亲近人工智能与机器学习领域&#xff0c;然而这个领域里的核心理论、算法、工具给人感觉都太过“高冷”&#xff0c;让很多小伙伴们望而却步&#xff0c;导致一直无法入门。 如何捅破这层窗户纸&#xff1f; 让高冷的不再高冷&#xff0c;让神秘的不…

CASS编码对照表

CASS编码对照表&#xff0c;包含了地籍与房产测绘中各种地理信息要素的编码、图层以及对应的名称和描述。这些编码主要应用于地形地貌、水系、居民地、交通设施&#xff08;如铁路、公路、桥梁、隧道&#xff09;、地下管线、海岸线、岛屿、矿产资源、建筑物以及其他人工构筑物…

当excel中表格打印预览右边超出限定页面时,调整列宽

解决办法&#xff1a;调整整体列或者部分列的列宽 操作流程如下&#xff1a; 第一步&#xff1a;选中需要调整的列 ①将鼠标放在表格的列上&#xff0c;等出现向下粗箭头后——>②单击&#xff08;变成粗十字&#xff09;该列——>③拖动选中列 第二步&#xff1a;调…

30分钟快速上手LaTex

文章目录 30 分钟快速上手 LATEX1.什么是LATEX?2.为什么学习LATEX?3.编写第一个LATEX程序4.LATEX文档的序言5.LATEX文档的标题、作者和日期信息6.LATEX文档的注释7.LATEX文档的粗体、斜体和下划线8.LATEX文档中添加图片9.LATEX中对图像进行标注、标签化和引用10.在LATEX中创建…

【操作系统线程实现方式与多线程模型】

文章目录 操作系统线程实现方式1. 用户级线程&#xff08;User-Level Threads&#xff09;2. 内核级线程&#xff08;Kernel-Level Threads&#xff09; 多线程模型1. 多对多模型&#xff08;Many-to-Many Model&#xff09;2. 一对一模型&#xff08;One-to-One Model&#xf…

Django后端开发——ORM

文章目录 参考资料ORM-基础字段及选项字段类型练习——添加模型类应用bookstore下的models.py数据库迁移——同步至mysqlmysql中查看效果 字段选项Meta类定义示例&#xff1a;改表名应用bookstore下的models.py终端效果 练习——改表名字段选项修改应用bookstore下的models.py终…

vue3+ts项目搭建

⛰️个人主页: 蒾酒 &#x1f525;系列专栏&#xff1a;《vue3实战》 &#x1f30a;山高路远&#xff0c;行路漫漫&#xff0c;终有归途。 目录 前置条件 基础工程模板搭建 测试环境变量是否配置成功 初始化vue项目 安装常用依赖 基础项目目录介绍 前置条件 请确…

星纪魅族宣布 All in AI;欧盟将首次对苹果处以罚款丨 RTE 开发者日报 Vol.146

开发者朋友们大家好&#xff1a; 这里是 「RTE 开发者日报」 &#xff0c;每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE &#xff08;Real Time Engagement&#xff09; 领域内「有话题的 新闻 」、「有态度的 观点 」、「有意思的 数据 」、「有思考的 文…

每天分享一个好用的Python库-Colorama

每天分享一个好用的Python库-Colorama 前言 今天分享的是一个主要用来给文本添加各种颜色的库&#xff1a;colorama。 colorama 简介 colorama是一个可以跨多终端显示不同颜色字符与背景的第三方库。 安装 使用pip进行安装 $ pip install colorama简单使用 常用参数 字…

【AIGC】Stable Diffusion应用领域

Stable Diffusion 是一个基于 OpenAI 的 Diffusion 模型的扩展版本&#xff0c;主要用于图像生成和处理任务。它并不是一个图像分类模型&#xff0c;而是一个生成式模型&#xff0c;可以生成高质量的图像。以下是 Stable Diffusion 模型的主要功能和应用领域&#xff1a; 图像…

C语言中关于#include的一些小知识

写代码的过程中&#xff0c;因为手误&#xff0c;重复包含了头文件 可以看到没有报错 如果是你自己编写的头文件&#xff0c;那么如果没加唯一包含标识的话&#xff0c;那么编译器会编译报错的。如果是系统自带的头文件&#xff0c;由于其每个头文件都加了特殊标识&#xff0c…

文件上传漏洞--Upload-labs--Pass05--大小写绕过

一、什么是大小写绕过 我们想要上传含有恶意代码的 .php 文件&#xff0c;但 .php 后缀名的文件可能会被 白名单 或 黑名单拦截&#xff0c;从而上传失败&#xff0c;在某些源代码中&#xff0c;没有对文件的后缀用 strtolower()函数 统一进行小写化&#xff0c;这就会存在大小…

CSS:定位

定位 1、static定位 无定位 2、fixed定位 相对于窗口得定位 3、relative定位 相对于自己得正常位置&#xff0c;可以使用left right top bottom进行元素得微调 4、absolute定位 绝对定位的元素的位置相对于最近的已定位父元素&#xff0c;如果元素没有已定位的父元素&a…

CAN收发器芯片PCA82C250 TXD RXD引脚方向说明

PCA82C250 收发器芯片TXD RXD和以往TTL的USART接口上TXD RXD方向和定义不同。不可直接连接TTL USART引脚&#xff0c;应该要连接CAN专用的TXD RXD引脚。 并且TXD RXD引脚有方向。其中TXD引脚是输入&#xff01; RXD引脚是输出&#xff01; 即TXD RXD引脚的方向 不是相对以本体…

第13章 基于Java Swing的图书管理系统

13.1 需求分析 在当今社会&#xff0c;随着信息技术的不断发展&#xff0c;信息管理系统已经进入到了人类社会的各个领域&#xff0c;人们对于信息技术的掌握也越来越迅速。在图书管理的过程中也引入图书管理体系&#xff0c;图书管理系统将大大节省人力、物力、时间、金钱等资…

ART-Pi LoRa开发套件 不完全教程

1 前言 ART-Pi LoRa 开发套件(LSD4RFB-2EVKM0201)是利尔达科技与睿赛德科技联合出品的一套面向物联网开发者的 LoRa 产品原型设计工具包&#xff0c;搭配ART-Pi主板使用&#xff0c;支持利尔达全系 LoRa 节点与网关模块&#xff0c;拥有丰富的可选配件&#xff0c;用户 可按需…

C++6.0

思维导图 .编程题&#xff1a; 以下是一个简单的比喻&#xff0c;将多态概念与生活中的实际情况相联系&#xff1a;比喻&#xff1a;动物园的讲解员和动物表演 想象一下你去了一家动物园&#xff0c;看到了许多不同种类的动物&#xff0c;如狮子、大象、猴子等。现在&#xff0…

【深入理解设计模式】单例设计模式

单例设计模式 概念&#xff1a; 单例模式&#xff08;Singleton Pattern&#xff09;是 Java 中最简单的设计模式之一。 单例设计模式是一种创建型设计模式&#xff0c;其主要目的是确保类在应用程序中的一个实例只有一个。这意味着无论在应用程序的哪个位置请求该类的实例&a…

单播、组播,广播介绍

单播、组播和广播是网络通信中的三种不同的数据传输方式&#xff0c;它们的主要区别在于数据传输的目标地址&#xff1a; 1. 单播&#xff08;Unicast&#xff09;&#xff1a;单播是指在网络中发送数据时&#xff0c;数据只会被发送到一个特定的目标地址。在单播传输中&#x…

【Vue2】element 穿梭框使用

<el-dialog :title"title" :visible.sync"showTransfer" width"650px" append-to-body><el-transfer :props"{key: stationId,label: stationName}":titles"[未关联电站, 已关联配电站]" :filterable"false&q…