Request的学习笔记(属Servlet学习课程)

文章目录

  • 获取请求消息数据
    • 1.获取请求行的数据
    • 2.获取请求头的数据
    • 3.获取请求体的数据
    • 4.获取其它的数据
      • 4.1.获取请求参数的通用方式
        • 中文乱码问题
      • 4.2.请求转发
      • 4.3.共享数据
      • 4.4.获取 ServletContext 对象
  • 继承与实现体系

浏览器访问服务器时,会将用户提交的参数数据、协议版本、请求头信息封装成请求报文(即请求数据包)发送给服务端。
服务器(例如Tomcat)收到请求报文会封装到 Request 对象中。程序员可以通过 Request 对象获取请求消息数据。

获取请求消息数据

1.获取请求行的数据

GET /web-demo-03/demo01?name=zhangsan HTTP/1.1

方法:
1.1.获取请求方式:GET
String getMethod()

1.2.获取虚拟目录:/web-demo-03
String getContextPath()

1.3.获取Servlet路径:/demo01
String getServletPath()

1.4.获取请求URI:/web-demo-03/demo01
URI 统一资源标识符
String getRequestURI()

1.5.获取GET方式的请求参数:name=zhangsan
String getQueryString()

1.6.获取请求URL:http://localhost:8080/web-demo-03/demo01
URL 统一资源定位符
String getRequestURL()

1.7.获取协议及版本:http/1.1
String getProtocol()

1.8.获取客户机的IP地址
String getRemoteAddr()

2.获取请求头的数据

请求头名称不区分大小写。

方法:
String getHeader(String name) 通过请求头的名称获取请求头的值
Enumeration<String> getHeaderNames() 获取所有的请求头名称。Enumeration 类似迭代器

示例代码:

package priv.lwx.javaex.web_demo_03.web.servlet;/*** 获取referer,防止盗链** @author liaowenxiong* @date 2021/12/29 11:21*/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(value = "/demo06")
public class ServletDemo06 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// 获取refererString referer = request.getHeader("referer");System.out.println(referer);// 防止盗链if (referer != null) {if (referer.contains("/web-demo-03")) {// 应用内正常访问System.out.println("播放电影");} else {// 应用外访问System.out.println("想看电影吗?来优酷吧!");}}}
}

3.获取请求体的数据

只有 post 请求方式才有请求体,在请求体中封装了 post 请求的请求参数。

步骤:
3.1.获取流对象
BufferedReader getReader():获取字符输入流,只能操作字符数据
ServletInputStream getInputStream():获取字节输入流,可以操作所有类型的数据(主要用于文件上传、视频上传等场景)

3.2.从流对象中取数据

示例代码:

package priv.lwx.javaex.web_demo_03.web.servlet.request;/*** 获取请求体的数据** @author liaowenxiong* @date 2021/12/29 11:21*/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.BufferedReader;
import java.io.IOException;@WebServlet(value = "/request-demo05")
public class RequestDemo05 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {}@Overrideprotected 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);}}
}

4.获取其它的数据

4.1.获取请求参数的通用方式

不论 get 还是 post 方式,都可以使用下面的方法获取请求参数。

方法:
String getParameter(String name):根据参数名称获取参数的值。要注意的问题: 如果 name 与实际的请求参数名不一致,则返回 null。
如果前端页面并没有输入参数值,则返回空字符串 ""

String[] getParameterValues(String name):根据参数名称获取参数值的数组。例如:hobby=ds&hobby=ps
Enumeration<String> getParameterNames():获取所有请求参数的名称

 Enumeration<String> parameterNames = req.getParameterNames();
// 迭代遍历Enumeration对象
while (parameterNames.hasMoreElements()) {String s = parameterNames.nextElement();System.out.println(s);
}

Map<String,String[]> getParameterMap():获取所有请求参数的 Map 集合。

中文乱码问题

tomcat 8 已经将 get 请求方式的中文乱码问题解决了,但是 post 请求方式会出现中文乱码问题。

解决办法:
获取参数前,设置解码的字符编码为 utf-8,代码如下:

request.setCharacterEncoding("utf-8");

这个字符编码要和前端页面的字符编码保持一致。

4.2.请求转发

请求转发:一种在服务器内部的资源跳转方式

步骤:
4.2.1.通过 request 对象获取请求转发器对象:RequestDispatcher getRequestDispatcher(String path),path 是转发目标的资源路径

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

特点:
4.2.3.浏览器地址栏的访问路径没有变化
4.2.4.只能转发到当前服务器内部的资源
4.2.5.转发只是一次请求

4.3.共享数据

域对象:一个有作用范围的对象,可以在范围内共享数据
Request 域对象:代表一次请求的范围,一般用于请求转发的多个资源中共享数据

方法:
void setAttribute(String name,Object obj):存储数据
Object getAttribute(String name):获取数据;通过属性名获取属性值
void removeAttribute(String name):删除数据;通过属性名删除对应的数据;通过键移除对应的键值对

4.4.获取 ServletContext 对象

ServletContext getServletContext()

继承与实现体系

HttpServletRequest 接口继承自 ServletRequest 接口

org.apache.catalina.connector.RequestFacade(tomcat 实现的类型),实现 HttpServletRequest 接口

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

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

相关文章

aws lambda_AWS Lambda事件源映射:使您的触发器混乱无序

aws lambda最近&#xff0c;我们为Sigma Cloud IDE上的无服务器项目引入了两个新的AWS Lambda事件源&#xff08;触发类型&#xff09;&#xff1a; SQS队列和DynamoDB流 。 &#xff08;是的&#xff0c;AWS在几个月前就向他们介绍了&#xff1b;但是我们仍然是一个很小的团队…

python curl模块_python pycurl模块

一、pycurl概述PycURl是一个C语言写的libcurl的python绑定库。libcurl 是一个自由的&#xff0c;并且容易使用的用在客户端的 URL 传输库。它的功能很强大&#xff0c;在PyCURL的主页上介绍的支持的功能有&#xff1a;FTP, FTPS, HTTP, HTTPS, GOPHER, TELNET, DICT, FILE and …

MySQL数据库创建用户root@%

步骤&#xff1a; 以 rootlocalhost 登录数据库&#xff0c;即先登录数据库所在的主机&#xff0c;再以 root 用户登录数据库&#xff1a; [roothtlwk0001host ~]# mysql -uroot -p123456必须先删除原来的 root% 用户&#xff1a; mysql> drop user root%; Query OK, 0 r…

第三方工具监控java进程_前9个免费的Java进程监视工具以及如何选择一种

第三方工具监控java进程这样就可以运行Java代码了。 也许它甚至可以在生产服务器上运行。 当您做好工作后&#xff0c;我们得到了好消息和令人讨厌的消息。 令人讨厌的消息是&#xff0c;现在开始调试。 就是进行调试和应用程序性能监视。 这意味着您不仅需要查看编写的代码&a…

python中的numpy函数算相关系数_NumPy ufunc通用函数

NumPy 提供了两种基本的对象&#xff0c;即 ndarray 和 ufunc 对象。前面几节已经介绍了 ndarray&#xff0c;本节将介绍 Numpy。ufunc 是 universal function 的缩写&#xff0c;意思是“通用函数”&#xff0c;它是一种能对数组的每个元素进行操作的函数。许多 ufunc 函数都是…

MySQL 8.x 以前的版本修改密码规则

查看密码相关变量&#xff1a; mysql> show variables like validate_password%; ---------------------------------------------- | Variable_name | Value | ---------------------------------------------- | validate_password_dictionary_f…

aws mfa 认证_如何为您的AWS账户设置多因素身份验证(MFA)

aws mfa 认证第1步 &#xff1a; 转到AWS控制台并使用您的用户名密码登录。 第2步 &#xff1a; 转到服务-> IAM 第三步&#xff1a; 单击您的根帐户上的激活MFA 第4步 &#xff1a; 在步骤3中&#xff0c;点击屏幕上的管理MFA按钮。 步骤5&#xff1a; 单击分配…

python具体工作内容_有没有人知道公司里用python工作的内容有什么

2018-07-11 回答python的特色 简单 python是一种代表简单主义思想的语言。阅读一个良好的python程序就感觉像是在读英语一样&#xff0c;尽管这个英语的要求非常严格&#xff01;python的这种伪代码本质是它最大的优点之一。它使你能够专注于解决问题而不是去搞明白语言本身。 …

如何导入hadoop源码到eclipse

需要进一步学习hadoop、需要看看内部源码实现&#xff0c;因此需要将hadoop源码导入都eclipse中。 简单总结一下&#xff0c;具体步骤如下&#xff1a; 首先确保已经安装了git、maven3、protobuf2.5、如果没有安装需要提前安装一下 0、preliminary linux distribution(我的…

线程池的学习

文章目录线程池原理JDK 1.5 之后提供的线程池工厂类线程池的使用步骤线程池原理 1.创建多个线程对象&#xff0c;存放到集合中&#xff0c;集合可以是 ArrayList 或者 LinkedList 2.从集合中取出一个线程对象&#xff0c;执行指定的任务 3.一个线程对象只能执行一个任务&#…

javafx 界面_JavaFX的科幻用户界面第1部分

javafx 界面使用JavaFX创建的Sci-Fi UI成形窗口 虚构的UI可以变成现实吗&#xff1f; 成长于80年代的小时候&#xff0c;我看到了自己的科幻电影&#xff0c;这确实激发了我对图形用户界面&#xff08;GUI&#xff09;的热爱&#xff0c;尤其是试图使科幻UI在现实世界中成为可…

token验证_如何利用 C# 爬取带 Token 验证的网站数据?

在对文本数据的情感分析中&#xff0c;基于情感词典的方法是最简单也是最常用的一种了。它的大体思路如下&#xff1a;对文档分词&#xff0c;找出文档中的情感词、否定词以及程度副词&#xff0c;然后判断每个情感词之前是否有否定词及程度副词&#xff0c;将它之前的否定词和…

hadoop2.6.0+eclipse配置

【0】安装前的声明 0.1&#xff09; 所用节点2个 master : 192.168.119.105 hadoop5 slave : 192.168.119.101 hadoop1 &#xff08;先用一个slave&#xff0c;跑成功后&#xff0c;在从master分别scp到各个slaves即可】&#xff09; 0.2&#xff09; 每个机子的那些个文件…

线程同步的学习

文章目录一、同步代码块二、同步方法静态同步方法三、Lock解决线程安全问题的三种方案&#xff1a;同步代码块、同步方法、使用 Lock一、同步代码块 synchronized(同步锁对象) { 需要同步操作的代码 }注&#xff1a; 1.锁对象可以是任意对象 2.必须保证多个线程使用同一个锁对…

spock测试_用于混合Spock 1.x和JUnit 5测试的Maven项目设置

spock测试我为Maven创建了一个示例Groovy项目&#xff0c;该项目在一个项目中混合了Spock测试和JUnit 5测试。 在下一节中&#xff0c;我将描述如何设置这种Maven项目。 在项目中启用Groovy 首先&#xff0c;您必须在项目中启用Groovy。 一种可能性是将GMavenPlus插件添加到您…

python 图片识别_python识别图片文字

滑稽研究所python识别图片文字哈喽&#xff0c;大家好呀&#xff0c;我是滑稽君。大家在写论文时可能经常碰到无法复制文字的文章。明明找到了需要的内容却无法直接复制使用&#xff0c;这让我们十分苦恼。那么本期滑稽君就告诉大家如何使用python识别图片中的文字。滑稽君整理…

MySQL数据库的数据类型decimal详解

大概意思是这样的&#xff1a; decimal(m,d) m是数字的最大位数&#xff0c;他的范围是从1-65&#xff1b; d是小数点后的位数&#xff0c;他的范围是0-30&#xff0c;并且不能大于m。 如果m被省略了&#xff0c;那么m的值默认为10&#xff0c; 如果d被省略了&#xff0c;那么d…

如何撰写论文

【0】README 0.1&#xff09;本内容转自一个学长的口述&#xff0c;该学长在硕士期间发表论文6篇&#xff0c;现在 某高校读博&#xff1b; 0.2&#xff09;鉴于看的人比较多&#xff0c;于今日对文本进行排版便于各位阅读&#xff08;timestamp: 1512141116&#xff09;&…

java查找链表中间元素_如何通过Java单次查找链表的中间元素

java查找链表中间元素您如何一次找到LinkedList的中间元素是一个编程问题&#xff0c;在电话采访中经常问Java和非Java程序员。 这个问题类似于检查回文或 计算阶乘 &#xff0c;有时Interviewer还会要求编写代码。 为了回答这个问题&#xff0c;候选人必须熟悉LinkedList的数…

python nums函数获取结果记录集有多少行记录_PHP mysqli_num_rows():获取查询结果的行数...

在 PHP 中&#xff0c;想要获取由 SELECT 语句查询到的结果集中有多少条数据的话&#xff0c;则需要使用 mysqli_num_rows() 函数来实现。首先我们来看一下该函数的语法结构&#xff1a;面向对象风格的写法$mysqli_result -> num_rows;其中 $mysqli_result 为使用 mysqli_qu…