前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >E013Web学习笔记-Request和Respons(一)

E013Web学习笔记-Request和Respons(一)

作者头像
訾博ZiBo
发布于 2025-01-06 06:40:37
发布于 2025-01-06 06:40:37
6700
代码可运行
举报
运行总次数:0
代码可运行

一、Request原理和继承体系

1、原理

第一步:用户访问url,浏览器向服务器发出请求,请求携带着请求消息数据;

第二步:Tomcat服务器会根据请求url中的资源路径,创建对应的Servlet对象;

第三步:Tomcat服务器创建request对象和seponse对象,request对象封装着请求消息数据;

第四步:Tomcat服务器将request对象和seponse对象传递给service方法,并调用service方法;

第五步:我们(程序员)可以在service方法中通过request对象获取请求消息数据,通过response对象设置响应消息数据;

第六步:Tomcat服务器从response对象中获取响应消息数据,返回给浏览器;

备注:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1、request对象和response对象是由服务器创建的,我们(程序员)来使用它;
2、request对象用户获取请求消息数据,response对象用于设置响应消息数据;

2、继承体系

二、获取请求数据

1、获取请求行数据

GET:/web/index?name=zhangsan HTTP/1.1

方法:

①获取请求方式:GET

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
String getMethod();

②(重要)获取虚拟目录:/index

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
String getContextPath();

③获取Servlet路径:/web

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 String getServletPath();

④获取GET方式请求参数:name=zhangsan

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
String getQueryString();

⑤(重要)获取请求URI:/web/index

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
String getRequestURI();
/web/index

StringBuffer getRequestURL();
http://localhost/web/index

URL:统一资源定位符;
URI:统一资源标识符;

⑥获取协议及版本:HTTP/1.1

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
String getProtocol();

⑦获取客户机的IP地址:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
String getRemoteAddr();

2、获取请求头数据

获取单个请求头数据(常用):
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
String getHeader(String var1);
获取所有请求头数据:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Enumeration<String> getHeaderNames();

Enumeration可以当作是一个迭代器;
代码演示:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.zibo.servlet;

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;
import java.util.Enumeration;

@WebServlet("/my")
public class MyServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doGet(req, resp);
        System.out.println("doGet……");
        //获取所有请求头
        Enumeration<String> headerNames = req.getHeaderNames();
        while (headerNames.hasMoreElements()){
            String name = headerNames.nextElement();
            String value = req.getHeader(name);
            System.out.println(name+"--------"+value);
        }
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doPost(req, resp);
        System.out.println("doPost……");
    }
}
运行结果:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
doGet……
host--------localhost:8080
connection--------keep-alive
upgrade-insecure-requests--------1
user-agent--------Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36
accept--------text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
accept-encoding--------gzip, deflate, br
accept-language--------zh-CN,zh;q=0.9
cookie--------__guid=111872281.1266672611192455200.1567215662252.909; _ga=GA1.1.492873635.1567215662; JSESSIONID=22205AFD55EE3DA1BC8CD4F8307C9707; monitor_count=4

3、获取请求体数据

明确:

只有POST请求才有请求体,在请求体中封装了请求参数;

步骤:

第一步:获取流对象;

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
BufferedReader getReader():获取字符输入流,只能操作字符数据;
ServletInputStream getInputStream():获取字节输入流,可以操作所有类型数据;

第二步:从流对象中拿数据;

代码演示getReader():

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.zibo.servlet;

import javax.servlet.ServletException;
import javax.servlet.ServletInputStream;
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("/my")
public class MyServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doGet(req, resp);
        System.out.println("doGet……");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doPost(req, resp);
        System.out.println("doPost……");
        BufferedReader reader = req.getReader();
        while (true) {
            String s = reader.readLine();
            if(s!=null){
                System.out.println(s);
            }else {
                break;
            }
        }
    }
}

代码演示getInputStream():

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.zibo.servlet;

import javax.servlet.ServletException;
import javax.servlet.ServletInputStream;
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("/my")
public class MyServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doGet(req, resp);
        System.out.println("doGet……");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doPost(req, resp);
        System.out.println("doPost……");
        ServletInputStream inputStream = req.getInputStream();
        byte[] bytes = new byte[64];
        while (true) {
            int read = inputStream.read(bytes);
            if(read!=-1){
                System.out.println(new String(bytes));
            }else {
                break;
            }
        }
    }
}

运行结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
doPost……
username=%E6%94%BE%E6%9D%BE%E6%94%BE%E6%9D%BE

4、获取请求参数通用方式(重要)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
(常用)String getParameter(String var1):根据参数名称获取参数值;
String[] getParameterValues(String var1):根据参数名称获取参数值的数组;
Enumeration<String> getParameterNames():返回所有参数名称;
(常用)Map<String, String[]> getParameterMap():获取所有参数的Map集合;
中文乱码问题:

GET方式:Tomcat8已经将中文乱码的问题解决了;

POST方式:加一行代码即可(设置编码)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
req.setCharacterEncoding("utf-8");

5、请求转发

一种服务器资源在服务器内部的资源跳转方式;

步骤:

第一步:通过request对象获取请求转发器对象

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
RequestDispatcher getRequestDispatcher(String path);

path:转发到的资源路径

第二步:使用RequestDispatcher对象进行转发

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
void forward(ServletRequest var1, ServletResponse var2)
特点:

①浏览器地址栏路径不发生变化;

②只能转发到服务器内部资源;

③转发是一次请求;

6、共享数据

域对象:

一个有作用范围的对象,可以在范围内共享数据;

request域:

代表一次请求的范围,一般用于请求转发的多个资源中共享数据;

方法:

①存储数据;

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
void setAttribute(String name, Object obj);

②通过键获取值;

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Object getAttribute(String name);

③通过键移除键值对;

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
void removeAttribute(String name);

7、获取ServletContext对象

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ServletContext getServletContext();
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-01-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
进阶数据库系列(十二):PostgreSQL 索引技术详解
索引主要被用来提升数据库性能,不当的使用会导致性能变差。 PostgreSQL 提供了多种索引类型: B-tree、Hash、GiST、SP-GiST 、GIN 和 BRIN。每一种索引类型使用了一种不同的算法来适应不同类型的查询。默认情况下,CREATE INDEX 命令创建适合于大部分情况的 B-tree 索引。
民工哥
2023/08/22
3.3K0
进阶数据库系列(十二):PostgreSQL 索引技术详解
PG几个有趣的插件和工具介绍
PGTune可以根据给定硬件配置的最大性能计算PostgreSQL配置。对于初学者来说可以快速地来配置数据库参数。但它不是PostgreSQL优化设置的灵丹妙药。许多设置不仅取决于硬件配置,还取决于数据库的大小、客户端的数量和查询的复杂性。只有考虑到所有这些参数,才能对数据库进行最佳配置。
AiDBA宝典
2023/09/19
1K0
PG几个有趣的插件和工具介绍
PostgreSQL的B-tree索引
B-tree索引适合用于存储排序的数据。对于这种数据类型需要定义大于、大于等于、小于、小于等于操作符。
yzsDBA
2020/10/29
4.8K0
PostgreSQL的B-tree索引
PostgreSQL 性能优化创建正确的索引具有不确定性
索引在数据库的查询中起到的作用毋庸置疑,但时常有人提出索引的建立的问题,to be or not to be 的问题。
AustinDatabases
2022/05/19
1K0
PostgreSQL  性能优化创建正确的索引具有不确定性
使用pg_hint_plan固定Postgresql执行计划
pg_hint_plan的使用教程很多,本篇主要通过实例介绍一些使用时经常遇到的问题,例如:
mingjie
2023/10/13
1.4K0
布隆过滤器在PostgreSQL中的应用
作为学院派的数据库,postgresql在底层的架构设计上就考虑了很多算法层面的优化。其中在postgresql9.6版本中推出bloom索引也是十足的黑科技。
数据库架构之美
2021/04/07
2.7K0
布隆过滤器在PostgreSQL中的应用
Postgresql 损坏的索引怎么查出来,解决了他
POSTGRESQL 中如果你的表文件有损坏,则在查询中会直接告诉你某些文件缺失,你无法对这个表进行查询,或操作. 如果是索引可能就没有这么的简单了.
AustinDatabases
2021/04/01
1.1K0
Postgresql排序与limit组合场景性能极限优化
测试场景的限制GIN索引查询速度是很快的, 在实际生产中,可能出现使用gin索引后,查询速度依然很高的情况,特点就是执行计划中Bitmap Heap Scan占用了大量时间,Bitmap Index Scan大部分标记的块都被过滤掉了。
mingjie
2022/05/12
7260
PostgreSQL中索引是否存储空值?
偶然在PostgreSQL官方文档上看到这句话:an IS NULL or IS NOT NULL condition on an index column can be used with a B-Tree index。
数据库架构之美
2021/03/16
2.7K0
Postgresql分区表大量实例与分区建议(LIST / RANGE / HASH / 多级混合分区)
5.11.6. Best Practices for Declarative Partitioning
mingjie
2022/09/26
7.3K0
从Oracle到PostgreSQL:Storage Index 特性 vs BRIN索引
导读:本文介绍 PostgreSQL 中的BRIN索引。为什么引人注意专门单独讲述这个性能?因为这就是活脱脱的 Oracle Exadata 中的 Storage Index 和 Oracle Database 12.1.0.2 中的新功能 Zone Maps。
数据和云01
2019/06/19
5360
PostgreSQL技术大讲堂 - 第29讲:执行计划与成本估算
PostgreSQL从小白到专家,是从入门逐渐能力提升的一个系列教程,内容包括对PG基础的认知、包括安装使用、包括角色权限、包括维护管理、、等内容,希望对热爱PG、学习PG的同学们有帮助,欢迎持续关注CUUG PG技术大讲堂。
用户5892232
2023/09/14
9120
PostgreSQL技术大讲堂 - 第29讲:执行计划与成本估算
Postgresql INDEX HOT 原理与更好的 “玩转” INDEX
好长时间不进行研究了,最近被突发的问题想到了INDEX 的问题,随机想到数据和INDEX 存储在一起会怎样,我们将索引和数据进行分离后,会不会对数据库的性能有优化的可能。
AustinDatabases
2023/02/26
1.2K0
Postgresql  INDEX  HOT 原理与更好的 “玩转”  INDEX
PostgreSQL 如何对索引进行分析和处理
最近有人私信问POSTGRESQL 怎么比MYSQL的索引大,这个问题升级上我个人觉得从这几点考虑
AustinDatabases
2023/09/06
3880
PostgreSQL 如何对索引进行分析和处理
Clustering a Table - Bruce Momjian(译)
写了600 多篇博客文章后,我以为我已经掌握了cluster命令的复杂性 ,但似乎我还没有,所以现在让我们开始吧。
数据库架构之美
2021/08/06
9120
PostgreSQL给模糊搜索加索引 转
PostgrSQL有个模块叫pg_trgm,可以对字符串来进行比较相似度,并通过加GIST或者GIN索引来达到提速的效果。在一般的RDBMS中这种需求都会进行全表扫描的,但是PG如果加了这个模块,在一定场景下就可以使用索引来提速了。 一、背景 我们有一个需求根据人员的拼音码(或者药品的拼音码)进行搜索,因为拼音码不一定是全的,故通常给的方案是模糊搜索,在拼音码的首尾两端各加一个百分号,但是效率通常很慢,一般情况下也不建议这么做。 二、环境 OS:CentOS 6.5 DB:PostgreSQL 9.3 三、步骤 1.因为DB是通过源码编译的,所以创建很简单,只要添加一个扩展
双面人
2019/04/10
1.7K0
PostgreSQL JSONB 使用入门
Photo by Tobias Fischer[9] on Unsplash[10]
goodspeed
2020/12/22
8.5K0
PostgreSQL JSONB 使用入门
PostgreSQL学术之美-从数据相关性看索引扫描IO放大问题
PostgreSQL是学术派的数据库,这体现在它架构设计的方方面面,例如多表连接动态规划、改进的内存置换时钟扫描算法、空间索引等,PG甚至将优化器的各类代价因子放开成参数供我们调整,这真是很开放的举动。
数据库架构之美
2020/11/19
7720
PostgreSQL学术之美-从数据相关性看索引扫描IO放大问题
索引与PostgreSQL新手
PostgreSQL 查询计划器充满了惊喜,因此编写高性能查询的常识性方法有时会产生误导。在这篇博文中,我将描述借助 EXPLAIN ANALYZE 和 Postgres 元数据分析优化看似显而易见的查询的示例。
PGCCC
2022/02/11
1.4K0
索引与PostgreSQL新手
PostgreSQL扫描方法综述
关系型数据库都需要产生一个最佳的执行计划从而在查询时耗费的时间和资源最少。通常情况下,所有的数据库都会产生一个以树形式的执行计划:计划树的叶子节点被称为表扫描节点。查询节点对应于从基表获取数据。
yzsDBA
2020/10/28
1.8K0
PostgreSQL扫描方法综述
推荐阅读
相关推荐
进阶数据库系列(十二):PostgreSQL 索引技术详解
更多 >
LV.2
中兴通讯数据库内核研发
目录
  • 一、Request原理和继承体系
    • 1、原理
    • 2、继承体系
  • 二、获取请求数据
    • 1、获取请求行数据
      • 方法:
    • 2、获取请求头数据
      • 获取单个请求头数据(常用):
      • 获取所有请求头数据:
      • 代码演示:
      • 运行结果:
    • 3、获取请求体数据
      • 明确:
      • 步骤:
    • 4、获取请求参数通用方式(重要)
      • 中文乱码问题:
    • 5、请求转发
      • 步骤:
      • 特点:
    • 6、共享数据
      • 域对象:
      • request域:
      • 方法:
    • 7、获取ServletContext对象
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档