文章目录

  • 获取请求消息数据
    • 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 接口

Request的学习笔记(属Servlet学习课程)相关推荐

  1. 深度学习入门之PyTorch学习笔记:深度学习介绍

    深度学习入门之PyTorch学习笔记:深度学习介绍 绪论 1 深度学习介绍 1.1 人工智能 1.2 数据挖掘.机器学习.深度学习 1.2.1 数据挖掘 1.2.2 机器学习 1.2.3 深度学习 第 ...

  2. Unity学习笔记:个人学习项目《疯狂天才埃德加》纠错文档

    Unity学习笔记:个人学习项目<疯狂天才埃德加>纠错文档 本文档是完成学校Unity课程作业时建立的纠错文档.用于记录自己开发过程中遇到的各种问题,以便下次遇到相同的问题时及时找到解决方 ...

  3. ScalersTalk 机器学习小组第 21 周学习笔记(深度学习-10)

    ScalersTalk 机器学习小组第 21 周学习笔记(深度学习-10) Scalers点评:机器学习小组是成长会的内部小组,这是成长会机器学习小组第21周学习笔记,也是深度学习第10次的复盘笔记 ...

  4. MATLAB学习笔记0:学习须知

    阅读前请注意: 1. 该学习笔记是华中师范大学HelloWorld程序设计协会2021年寒假MATLAB培训的学习记录,是基于培训课堂内容的总结归纳.拓展阅读.博客内容由 @K2SO4钾 撰写.编辑, ...

  5. 学习笔记:深度学习(6)——基于深度学习的语言模型

    学习时间:2022.04.22~2022.04.25 文章目录 5. 基于深度学习的语言模型 5.1 从NNLM到词嵌入 5.1.1 神经网络语言模型 NNLM 5.1.2 基于循环神经网络的语言模型 ...

  6. 学习笔记:CentOS7学习之二十二: 结构化命令case和for、while循环

    目录 学习笔记:CentOS7学习之二十二: 结构化命令case和for.while循环 22.1 流程控制语句:case 22.2 循环语句 22.1.2 for-do-done 22.3 whil ...

  7. 学习笔记:CentOS7学习之十六:LVM管理和ssm存储管理器使用

    目录 学习笔记:CentOS7学习之十六:LVM管理和ssm存储管理器使用 16.1 LVM的工作原理 16.1.1 LVM常用术语 16.1.2 LVM优点 16.2 创建LVM的基本步骤 16.2 ...

  8. 学习笔记:强化学习与最优控制(Chapter 2)

    Approximation in Value Space 学习笔记:强化学习与最优控制(Chapter 2) Approximation in Value Space 1. 综述 2. 基于Value ...

  9. 【长篇博文】Docker学习笔记与深度学习环境的搭建和部署(二)

    长篇博文记录学习流程不容易,请关注.转发.点赞.评论,谢谢! 上一篇文章:Docker学习笔记与深度学习环境的搭建和部署(一) 文章末尾附加nvidia455.23.cuda11.1.cudnn8.0 ...

  10. 学习笔记-零基础学习人工智能(0)

    学习笔记-零基础学习人工智能(0) 背景 规划 背景 作为物理专业的大龄青年,由于兴趣爱好想学习下人工智能.主要感兴趣的方向是对抗样本生成.自己也做了一些了解,但是发现千头万绪,不懂的东西太多.为了梳 ...

最新文章

  1. matlab 中fft的用法
  2. Notepad++远程连接Linux系统
  3. HDLBits答案(9)_卡诺图与最简SOP式
  4. [密码学基础][每个信息安全博士生应该知道的52件事][Bristol52]47.什么是Fiat-Shamir变换?
  5. GitHubPage博客搭建学习专栏
  6. 【渝粤教育】国家开放大学2018年春季 8618-21T燃气行业规范 参考试题
  7. Capture One mac版如何导入Lightroom目录
  8. AX2012/D365 批处理如何创建
  9. RK3399 Android上面调试IMX291 Camera驱动
  10. PDF417打印后扫描不出来(记录)
  11. PowerDesigner下载地址
  12. 软件测试的容错性测试方法,你真的了解容错性测试吗?
  13. 年度光电领域盛会——CIOE中国光博会开幕在即!小枣君将全程在线直播!
  14. 西农大 Java实习 异常处理
  15. 计算机毕业设计Java高校学生综合评价系统(源码+系统+mysql数据库+Lw文档)
  16. 【 长尾理论在现实中的巨大威力】
  17. 问题锦集 | 登入校园网乱码问题
  18. 传输层与网络层的区别
  19. Problem1: Magic Square
  20. bzoj2818: Gcd 莫比乌斯繁衍

热门文章

  1. jdk只有一个java进程_JDK 10:从Java访问Java应用程序的进程ID
  2. jdk 9和jdk8_JDK 9是某些功能的终结
  3. viewpager默认界面_使用默认方法的界面演变–第一部分:方法
  4. JVM体系结构:JVM类加载器和运行时数据区
  5. VMWare vijava –“用户名或密码不正确”异常的奇怪情况
  6. 使用Spring Security和OAuth 2.0保护Spring微服务架构
  7. 在EL表达式中引用ADF Faces组件
  8. 渴望订阅– RxJava常见问题解答
  9. Spring Boot和Thymeleaf:重新加载模板和静态资源,而无需重新启动应用程序
  10. nosql的数据服务_使用NoSQL实现实体服务–第3部分:CouchDB