Servlet笔记(下)

HttpServletRequest对象相关API

+ 获取请求行信息相关(方式,请求的url,协议及版本)

| API                           | 功能解释                       |

| ----------------------------- | ------------------------------ |

| StringBuffer getRequestURL(); | 获取客户端请求的url            |

| String getRequestURI();       | 获取客户端请求项目中的具体资源 |

| int getServerPort();          | 获取客户端发送请求时的端口     |

| int getLocalPort();           | 获取本应用在所在容器的端口     |

| int getRemotePort();          | 获取客户端程序的端口           |

| String getScheme();           | 获取请求协议                   |

| String getProtocol();         | 获取请求协议及版本号           |

| String getMethod();           | 获取请求方式                   |

+ 获得请求头信息相关

| API                                   | 功能解释               |

| ------------------------------------- | ---------------------- |

| String getHeader(String headerName);  | 根据头名称获取请求头   |

| Enumeration<String> getHeaderNames(); | 获取所有的请求头名字   |

| String getContentType();              | 获取content-type请求头 |

+ 获得请求参数相关

| API                                                     | 功能解释                             |

| ------------------------------------------------------- | ------------------------------------ |

| String getParameter(String parameterName);              | 根据请求参数名获取请求单个参数值     |

| String[] getParameterValues(String parameterName);      | 根据请求参数名获取请求多个参数值数组 |

| Enumeration<String> getParameterNames();                | 获取所有请求参数名                   |

| Map<String, String[]> getParameterMap();                | 获取所有请求参数的键值对集合         |

| BufferedReader getReader() throws IOException;          | 获取读取请求体的字符输入流           |

| ServletInputStream getInputStream() throws IOException; | 获取读取请求体的字节输入流           |

| int getContentLength();                                 | 获得请求体长度的字节数               |

+ 其他API

| API                                          | 功能解释                    |

| -------------------------------------------- | --------------------------- |

| String getServletPath();                     | 获取请求的Servlet的映射路径 |

| ServletContext getServletContext();          | 获取ServletContext对象      |

| Cookie[] getCookies();                       | 获取请求中的所有cookie      |

| HttpSession getSession();                    | 获取Session对象             |

| void setCharacterEncoding(String encoding) ; | 设置请求体字符集            |

HttpServletResponse相关API

+ 设置响应行相关

| API                        | 功能解释                   |

| -------------------------- | -------------------------- |

| void setStatus(int  code); | 设置响应状态码             |

+ 设置响应头相关

| API                                                    | 功能解释                                         |

| ------------------------------------------------------ | ------------------------------------------------ |

| void setHeader(String headerName, String headerValue); | 设置/修改响应头键值对                            |

| void setContentType(String contentType);               | 设置content-type响应头及响应字符集(设置MIME类型) |

+ 设置响应体相关

| API                                                       | 功能解释                                                |

| --------------------------------------------------------- | ------------------------------------------------------- |

| PrintWriter getWriter() throws IOException;               | 获得向响应体放入信息的字符输出流                        |

| ServletOutputStream getOutputStream() throws IOException; | 获得向响应体放入信息的字节输出流                        |

| void setContentLength(int length);                        | 设置响应体的字节长度,其实就是在设置content-length响应头 |

+ 其他API

| API                                                          | 功能解释                                            |

| ------------------------------------------------------------ | --------------------------------------------------- |

| void sendError(int code, String message) throws IOException; | 向客户端响应错误信息的方法,需要指定响应码和响应信息 |

| void addCookie(Cookie cookie);                               | 向响应体中增加cookie                                |

| void setCharacterEncoding(String encoding);                  | 设置响应体字符集                              |

请求转发和响应重定向

 什么是请求转发和响应重定向

 请求转发和响应重定向是web应用中间接访问项目资源的两种手段,也是Servlet控制页面跳转的两种手段, 请求转发通过HttpServletRequest实现,响应重定向通过HttpServletResponse实现

请求转发

1 请求转发时,请求和响应对象会继续传递给下一个资源

2 请求中的参数可以继续向下传递

 请求转发特点(背诵)

+ 请求转发通过HttpServletRequest对象获取请求转发器实现

+ 请求转发是服务器内部的行为,对客户端是屏蔽的

+ 客户端只发送了一次请求,服务端只产生了一对requestresponse对象,客户端地址栏不变

+ 服务端只产生了一对请求和响应对象,这一对请求和响应对象会继续传递给下一个资源

+ 因为全程只有一个HttpServletRequset对象,所以请求参数可以传递,请求域中的数据也可以传递

+ 请求转发可以转发给其他Servlet动态资源,也可以转发给一些静态资源以实现页面跳转

+ 请求转发可以转发给WEB-INF下受保护的资源(此时可以访问到这些受保护的资源,直接访问则不行)

+ 请求转发不能转发到本项目以外的外部资源

代码举例

ServletA请求转发到ServletB

@WebServlet("/servletA")
public class ServletA extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("servletA执行了");
        String money = req.getParameter("money");
        System.out.println("servletA获得参数:money="+money);
        //请求转发给ServletB
        RequestDispatcher requestDispatcher = req.getRequestDispatcher("servletB");
        //让请求转发器做出转发动作
        requestDispatcher.forward(req,resp);

        //将请求转发给一个视图(a.html)
       // RequestDispatcher requestDispatcher1 = req.getRequestDispatcher("WEB-INF/b.html");
        //requestDispatcher1.forward(req,resp);
    }
}
@WebServlet("/servletB")
public class ServletB extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("servletB执行了");
        String money = req.getParameter("money");
        System.out.println("servletB获得参数:money="+money);
    }
}

 响应重定向

 响应重定向特点(背诵)

 响应重定向通过HttpServletResponse对象的sendRedirect方法实现

 响应重定向是服务端通过302响应码和路径,告诉客户端自己去找其他资源,是在服务端提示下的,客户端的行为 客户端至少发送了两次请求,客户端地址栏是要变化的

请求产生了多次后端就会有多个request对象

+ 服务端产生了多对请求和响应对象,且请求和响应对象不会传递给下一个资源

+ 因为全程产生了多个HttpServletRequset对象,所以请求参数不可以传递,请求域中的数据也不可以传递

+ 重定向可以是其他Servlet动态资源,也可以是一些静态资源以实现页面跳转

+ 重定向不可以到给WEB-INF下受保护的资源

+ 重定向可以到本项目以外的外部资源

过程图

 乱码问题

GET请求乱码

> GET请求方式乱码分析

+ GET方式提交参数的方式是将参数放到URL后面,如果使用的不是UTF-8,那么会对参数进行URL编码处理

+ HTML中的 <meta charset='字符集'/> 影响了GET方式提交参数的URL编码

+ tomcat10.1.7URI编码默认为 UTF-8

+ 当GET方式提交的参数URL编码和tomcat10.1.7默认的URI编码不一致时,就会出现乱码

解决方式:

 方式1  :设置GET方式提交的编码和Tomcat10.1.7的URI默认解析编码一致即可 (推荐)

方式2 : 设置Tomcat10.1.7的URI解析字符集和GET请求发送时所使用URL转码时的字符集一致即可,修改conf/server.xml中 Connecter 添加 URIEncoding="GBK"  (不推荐)------------------对于请求行的url这一部分,解码使用的字符集为GBK

 POST方式请求乱码

例如:当html文件使用GBK进行编码,而Tomcat默认用UTF-8进行解码,我们采用解决get乱码问题的第二种方式来解决post乱码问题,即,修改conf/server.xml中 Connecter 添加 URIEncoding="GBK" ,我们发现修改后还是有乱码问题,这是因为post请求的参数是放在请求体里的,而非url

> POST请求方式乱码分析

+ POST请求将参数放在请求体中进行发送

+ 请求体使用的字符集受到了<meta charset="字符集"/> 的影响

+ Tomcat10.1.7 默认使用UTF-8字符集对请求体进行解析

+ 如果请求体的URL转码和Tomcat的请求体解析编码不一致,就容易出现乱码

POST请求方式乱码解决

+ 方式1 : 请求时,使用UTF-8字符集提交请求体 (推荐)

+ 方式2 : 后端在获取参数前,设置解析请求体使用的字符集和请求发送时使用的字符集一致 (不推荐)             设置请求体的解码使用的字符集:req.setCharacterEncoding("字符集");

路径问题

相对路径

        以当前资源的所在路径为出发点去找目标资源

        语法:不以/开头

        ./表示当前资源的路径

        ../表示当前资源的上一层路径

        缺点:目标资源路径受到当前资源路径的影响 不同位置相对路径写法不同

    + 相对路径的规则是: 以当前资源所在的路径为出发点去寻找目标资源

                      规则就是在当前资源的所在路径后,拼接目标资源的路径,然后发送请求找目标资源

    + 相对路径不以 / 开头

    + 在file协议下,使用的是磁盘路径

    + 在http协议下,使用的是url路径

    + 相对路径中可以使用 ./表示当前资源所在路径,可以省略不写

    + 相对路径中可以使用../表示当前资源所在路径的上一层路径,需要时要手动添加

 绝对路径

        始终以固定的路径作为出发点去找目标资源

        语法:以/开头

        不同项目中,固定的路径出发点可能不一致

        缺点:绝对路径要补充项目的上下文 项目的上下文是可以改变的

        如何解决:

        通过head>base>href属性,定义相对路径公共前缀,通过公共前缀把一个相对路径转化为绝对路径(不完美)

    + 绝对路径的规则是: 使用以一个固定的路径做出出发点去寻找目标资源,和当前资源所在的路径没有关系

    + 绝对路径要以/ 开头

    + 绝对路径的写法中,不以当前资源的所在路径为出发点,所以不会出现  ./ ../

    + 不同的项目和不同的协议下,绝对路径的基础位置可能不同,要通过测试确定

    + 绝对路径的好处就是:无论当前资源位置在哪,寻找目标资源路径的写法都一致

+ 应用场景

    1. 前端代码中,href src action 等属性

    2. 请求转发和重定向中的路径

响应重定向,请求转发路径问题

             二者相对路径写法规则与上面一致

            请求转发的绝对路径是不需要添加项目上下文的

            请求转发的/ 代表的路径是 http://localhost:8080/项目上下文路径/

如何解决项目上下文更变的问题:将项目上下文设置为/

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

QQ自动发送消息

QQ自动发送消息 python包导入 import time import pandas as pd import pyautogui import pyperclip图像识别函数封装 本程序使用pyautogui模块控制鼠标和键盘来实现QQ自动发送消息&#xff0c;因此必须得到需要点击位置的坐标&#xff08;当然也可以在程序中将位置写死&…

5.1计算机网络基本知识

5.1.1计算机网络概述 目前&#xff0c;三网融合(电信网络、有线电视网络和计算机网络)和宽带化是网络技术的发展的大方向&#xff0c;其应用广泛&#xff0c;遍及智能交通、环境保护、政府工作、公共安全、平安家居等多个领域&#xff0c;其中发展最快的并起到核心作用的则是计…

51单片机之冯·诺依曼结构

一、概述 8051系列单片机将作为控制应用最基本的内容集成在一个硅片上&#xff0c;其内部结构如图4-1所示。作为单一芯片的计算机&#xff0c;它的内部结构与一台计算机的主机非常相似。其中微处理器相当于计算机中的CPU&#xff0c;由运算器和控制器两个部分构成&#xff1b;…

13.PPT:诺贝尔奖【28】

目录 NO1234 NO567 NO8/9/10 NO11/12 NO1234 设计→变体→字体→自定义字体 SmartArt超链接新增加节 NO567 版式删除图片中的白色背景&#xff1a;选中图片→格式→删除背景→拖拉整个图片→保留更改插入→图表→散点图 &#xff1a;图表图例、网格线、坐标轴和图表标题…

RabbitMQ 从入门到精通:从工作模式到集群部署实战(一)

#作者&#xff1a;闫乾苓 文章目录 RabbitMQ简介RabbitMQ与VMware的关系架构工作流程RabbitMQ 队列工作模式及适用场景简单队列模式&#xff08;Simple Queue&#xff09;工作队列模式&#xff08;Work Queue&#xff09;发布/订阅模式&#xff08;Publish/Subscribe&#xff…

DFX(Design for eXcellence)架构设计全解析:理论、实战、案例与面试指南*

一、什么是 DFX &#xff1f;为什么重要&#xff1f; DFX&#xff08;Design for eXcellence&#xff0c;卓越设计&#xff09;是一种面向产品全生命周期的设计理念&#xff0c;旨在确保产品在设计阶段就具备**良好的制造性&#xff08;DFM&#xff09;、可测试性&#xff08;…

【Elasticsearch】diversified sampler

作用就是聚合前的采样&#xff0c;主要是采样 它就是用来采样的&#xff0c;采完样后在进行聚合操作 random_sampler和diversified_sampler是 Elasticsearch 中用于聚合查询的两种采样方法&#xff0c;它们的主要区别如下&#xff1a; 采样方式 • random_sampler&#xff1a…

2月7号.

二叉树是一种特殊的树形数据结构&#xff0c;具有以下特点&#xff1a; 基本定义 节点的度&#xff1a;二叉树中每个节点最多有两个子节点&#xff0c;分别称为左子节点和右子节点。 子树的顺序性&#xff1a;二叉树的子树有左右之分&#xff0c;且顺序不能颠倒。 递归定义&…

openpnp2.2 - 环境搭建 - 编译 + 调试 + 打包

文章目录 openpnp2.2 - 环境搭建 - 编译 调试 打包概述笔记前置任务克隆代码库切到最新的tag清理干净编译工程关掉旧工程打开已经克隆好的openpnp2.2工程将IDEA的SDK配置为openjdk23 切换中英文UI设置JAVA编译器 构建工程跑测试用例单步调试下断点导出工程的JAR包安装install…

【复现论文】DAVE

网站&#xff1a; GitHub - jerpelhan/DAVE 下载完以后&#xff0c;阅读 readme文件 新建终端&#xff0c;打印文件树&#xff0c;不包含隐藏文件&#xff1a; 命令&#xff1a;tree -I .* . ├── LICENSE ├── README.md ├── demo.py ├── demo_zero.py ├── mai…

GB/T28181 开源日记[8]:国标开发速知速会

服务端源代码 github.com/gowvp/gb28181 前端源代码 github.com/gowvp/gb28181_web 介绍 go wvp 是 Go 语言实现的开源 GB28181 解决方案&#xff0c;基于GB28181-2022标准实现的网络视频平台&#xff0c;支持 rtmp/rtsp&#xff0c;客户端支持网页版本和安卓 App。支持rts…

完美解决phpstudy安装后mysql无法启动

phpstudy数据库无法启动有以下几个原因。 **一、**自己在电脑上安装了MySQL数据库,MySQL的服务名为MySQL,这会与phpstudy的数据库的服务名发生冲突&#xff0c;从而造成phpstudy中的数据库无法启动&#xff0c;这时我们只需要将自己安装的MySQL的服务名改掉就行。 但是&#…

grafana面板配置opentsdb

新增面板&#xff1a; 这里add-panel: 如果不是想新增面板而是想新增一行条目&#xff0c;则点击convert to row: 在新增的面板这里可以看到选择数据源 Aggregator&#xff1a;聚合条件&#xff0c;区分下第一行和第二行的aggregator&#xff0c;第一个是对指标值的聚合&…

论文翻译学习:《DeepSeek-R1: 通过强化学习激励大型语言模型的推理能力》

摘要 我们介绍了我们的第一代推理模型 DeepSeek-R1-Zero 和 DeepSeek-R1。DeepSeek-R1-Zero 是一个通过大规模强化学习&#xff08;RL&#xff09;训练的模型&#xff0c;没有经过监督微调&#xff08;SFT&#xff09;作为初步步骤&#xff0c;展示了卓越的推理能力。通过强化…

【Uniapp-Vue3】从uniCloud中获取数据

需要先获取数据库对象&#xff1a; let db uniCloud.database(); 获取数据库中数据的方法&#xff1a; db.collection("数据表名称").get(); 所以就可以得到下面的这个模板&#xff1a; let 函数名 async () > { let res await db.collection("数据表名称…

【自然语言处理】TextRank 算法提取关键词(Python实现)

文章目录 前言PageRank 实现TextRank 简单版源码实现jieba工具包实现TextRank 前言 TextRank 算法是一种基于图的排序算法&#xff0c;主要用于文本处理中的关键词提取和文本摘要。它基于图中节点之间的关系来评估节点的重要性&#xff0c;类似于 Google 的 PageRank 算法。Tex…

免费windows pdf编辑工具

Epdf&#xff08;完全免费&#xff09; 作者&#xff1a;不染心 时间&#xff1a;2025/2/6 Github: https://github.com/dog-tired/Epdf Epdf Epdf 是一款使用 Rust 编写的 PDF 编辑器&#xff0c;目前仍在开发中。它提供了一系列实用的命令行选项&#xff0c;方便用户对 PDF …

星闪开发入门级教程之安装编译器与小项目烧录

系列文章目录 星闪开发入门级教程 好久不见&#xff0c;已经好几年没有发文章了&#xff0c;星闪-作为中国原生的新一代近距离无线联接技术品牌。我想着写点东西。为了适合新手&#xff0c;绝对小白文。 文章目录 系列文章目录前言一、Hispark Studio1.安装Hispark Studio2.安…

Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException解决办法

1.问题描述 在编写完一个功能后,第一次启动这个模块的启动类时,报以下错误, 2.文件解决 检查了controller,service和mapper,均未发现有问题,核对了依赖也未发现依赖冲突 在网上也找了资料,有总结的比较好的: controller层service层dao层注解是否都使用正确&#xff1f;接口…

记录 | WPF基础学习Style局部和全局调用

目录 前言一、Style1.1 例子1.2 为样式起名字1.3 BasedOn 继承上一个样式 二、外部StyleStep1 创建资源字典BaseButtonStyle.xamlStep2 在资源字典中写入StyleStep3 App.xaml中写引用路径【全局】Step4 调用三、代码提供四、x:Key和x:Name区别 更新时间 前言 参考文章&#xff…