初学Java web(七)RequestResponse

news2025/2/24 7:16:54

Request&Response

 f490c3edb35841cbab60865b527f7238.png

 

 

  • Request:获取请求数据

  • Response:设置响应数据

一.Request对象

1.Request继承体系

5824c44a0d8089d6d7e6517dff0757fd.png

 

  • Tomcat需要解析请求数据,封装为requestx对象并且创建requestx对象传递到service方法中

  • 使用request对象,查阅JavaEE API文档的HttpServletRequest接口

2.Request获取请求数据

2.1获取请求数据

  • 请求数据分为3部分:

  • 1.请求行:

    GET /request-demo/req1?username=zhangsan HTTP/1.1

    • String getMethod():获取请求方式:GET

    • String getContextPath():获取虚拟目录(项目访问路径):/request-demo

    • StringBuffer getRequestURL0:获取URL(统一资源定位符):http:/localhost:8080/request-demo/req1

    • String getRequestURI():获取URI(统一资源标识符):/request-demo/req1

    • String getQueryString() :获取请求参数(GET方式):username=zhangsan&password=123

    2.请求头

    User-Agent:Mozilla/5.0 Chrome/91.0.4472.106

    • String getHeader(String name):根据请求头名称,获取值

    3.请求体

    username=superbaby&password=123

    • ServletInputStream getlnputStream():获取字节输入流

    • BufferedReader getReader(():获取字符输入流

2.2通用方式获取请求参数

  • 请求参数获取方式

  • get方式:

    String getQueryString()

    post方式:

    BufferedReader getReader()

思考:

GET请求方式和POST请求方式区别主要在于获取请求参数的方式不一样,是否可以提供一种统一获取请求参数的方式,从而统一doGet和doPost方法内的代码?

3.Request通用方式获取请求参数

9b7f17ae3873c6b28c713caabb17ac9f.png

 

  • Map<String,String[]>getParameterMap():获取所有参数Map集合

  • String[]getParameterValues(String name):根据名称获取参教值(数组)

  • String getParameter(String name):根据名称获取参数值(单个值)

  • 使用通用方式获取请求参数后,屏蔽了GET和POST的请求方式代码的不同,则代码可以定义为如下格式:

  • @WebServlet("/reqDemo3")
    public class RequestDemo3 extends HttpServlet{
    @override
    protected void doGet(HttpServletRequest req,HttpServletResponse resp){
    
    }
    @override
    protected void doPost(HttpServletRequest req,HttpServletResponse resp){
    this.doGet(req,resp);
    }
    }
    
  • 可以使用Servlet模板创建Servlet更高效

 

cf9d7b0ddd628095cef663b415e3408a.png

若是没有new Servlet选项

  1. 在pom.xml文里导入servlet得依赖

  2. fdb95084e2d6ee52ff8e11fb383ae849.png

  3. 在File里的Project Structure找到Modules

  4. 246514956f9f2569139d45a684bf7c6a.png

  5. 点击Dependencies勾选servlet-api的选项

  6. 0275221acda1cbaa9594f97e135537d8.png

 

  • 若想改变模板的格式

 

cb4497e104d462195da82534b69758d1.png

4.Request请求参数中文乱码

  • 请求参数如果存在中文数据,则会乱码

 

//POST的乱码
//1.解决乱码:PoST的底层实现是getReader
request.setCharacterEncoding("UTF-8");//设置字符输入流的编码

//要先设置编码格式,否则后续仍然会中文乱码

//2.获取username
String username = request.getParameter("username");
System.out.println(username);

//GET的乱码
//1.GET,获取参数的方式:getQuerystring
//乱码原因:tomcat进行URL解码,默认的字符集IS0-8859-1
//1.1先对乱码数据进行编码:转为字节数组
username.getByte(StandardCharsets.IS0_8859_1);
//1.2字节数组解码
username = new String(bytes,StandardCharsets.ISO_8859_1)
//1.1和1.2可合为一行
username = new String(username.getBytes((StandardCharsets.ISO_8859_1),StandardCharsets.ISO_8859_1);

 

  • get的乱码原因

 

bb39e4e06daedabf87f47a1c2d758a22.png

 

  • URL编码

  • 1.将字符串按照编码方式转为二进制2.每个字节转为2个16进制数并在前边加上%

    f7e90c937c665502ffa46440066c872e.png

  • 解决方案:

  • POST:设置输入流的编码

    req.setCharacterEncoding("UTF-8");
    

    通用方式(GET/POST):先编码,再解码

    new String(username.getBytes("ISO-8859-1"),"UTF-8");

 

Tomcat8.0之后,已将GET请求乱码问题解决,设置默认的解码方式为UTF-8

5.Request请求转发

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

 

7c2ba6b94eb43bafb0309c39db134bdb.png

 

  • 实现方式

 

req.getRequestDispatcher(("资源B路径").forward(req,resp);

 

  • 请求转发资源间共享数据:使用Request对象

    • void setAttribute(String name,Object o):存储数据到request域中

    • Object getAttribute(String name):根据key,获取值

    • void removeAttribute(String name):根据key,删除该键值对

  • 请求转发特点:

  • 浏览器地址栏路径不发生变化只能转发到当前服务器的内部资源一次请求,可以在转发的资源间使用request共享数据

二.Response对象

1.Response设置响应数据功能介绍

  • 响应数据分为3部分

  • 1.响应行:

    HTTP/1.1 200 OK

    • void setStatus(int sc):设置响应状态码

    2.响应头:

    Content-Type:text/html

    • void setHeader((String name,String value):设置响应头键值对

    3.响应体:

    <html><head>head><body></body></html>

    • PrintWriter getWriter():获取字符输出流

    • ServletOutputStream getQutputStream():获取字节输出流

2.Response完成重定向

  • 重定向(Redirect):一种资源跳转方式

 

9b4c4ab794b2118cf6135475fef09d88.png

 

  • 实现方式:

 

resp.setStatus(302);
resp.setHeader("location",“资源B的路径");

 

resp.sendRedirect("资源B的路径");

 

  • 重定向的特点

  • 浏览器地址栏路径发生变化可以重定向到任意位置的资源(服务器内部、外部均可)两次请求,不能在多个资源使用request共享数据

  • 路径问题

 

是否要加虚拟目录

 

明确路径谁使用?浏览器使用:需要加虚拟目录(项目访问路径)服务端使用:不需要加虚拟目录

 

//简化方式完成重定向
//动态获取虚拟目录
String contextPath = request.getContextPath();
response.sendRedirect(contextPath+"/resp2");

3.Response响应字符数据

  • 使用1.通过Response对象获取字符输出流

 

  PrintWriter writer = resp.getWriter()

 

2.写数据

 

  writer.write("aaa");

 

正常写入数据就调用write方法即可,如想要写入html文本语言,则要设置ContentType

 

response.setContentType("text/html;charset=utf-8");
//1.获取字符输出流
PrintWriter writer response.getWriter();
//content-type
//response.setHeader("content-type","text/html");
writer.write(s:"你好");
writer.write(s:"<h1>aaa</h1>");
//细节:流不需要关闭

 

  • 注意该流不需要关闭,随着响应结束,response对象销毁,由服务器关闭中文数据乱码:原因通过Response获取的字符输出流默认编码:ISO-8859-1

 

  resp.setContentType("text/html;charset=utf-8");

4.Response响应字节数据

  • 使用1.通过Responsel对象获取字符输出流

 

  ServletOutputStream outputStream = resp.getOutputStream();

 

2.写数据

 

  outputStream,write(字节数据):

 

  • IOUtils工具类使用1.导入坐标

 

  <dependency>
      <groupld>commons-io</groupld>
      <artifactld>commons-io</artifactld>
      <version>2.6</version>
  </dependency>

 

2.使用

 

  IOUtils.copy(输入流,输出流);

5.SqlSession工具类抽取

  • 创建SqlSessionFactory代码优化

 

  //2.1获取SqlSessionFactory对象
  String resource "mybatis-config.xml";
  Inputstream inputstream = Resources.getResourceAsstream(resource);
  SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputstream);

 

  • 问题1.代码重复:工具类2.SqlSessionFactory工厂只创建一次,不要重复创建:静态代码块

 

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

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

相关文章

rocketMq架构原理精华分析(一)

rocketMq架构原理精华分析是我们这篇文章的核心&#xff0c;从消息中间件的对比、架构模型、消息模型、常见问题等逐一分析&#xff1a; 一、中间件对比&#xff1a; RabbitMq 集群效果不太好&#xff0c;底层不是java 语言&#xff0c;研究原理比较困难&#xff1b; Kafka是…

前端面试题之计算机网络篇 OSI七层网络参考模型

互联网数据传输原理 &#xff5c;OSI七层网络参考模型 OSI七层网络参考模型 应用层&#xff1a;产生网络流量的程序表示层&#xff1a;传输之前是否进行加密或者压缩处理会话层&#xff1a;查看会话&#xff0c;查木马 netstat-n传输层&#xff1a;可靠传输、流量控制、不可…

亿级流量的互联网项目如何快速构建?手把手教你构建思路

一. 大流量的互联网项目 1.项目背景 索尔老师之前负责的一个项目&#xff0c;业务背景是这样的。城市的基础设施建设是每个城市和地区都会涉及到的&#xff0c;如何在基建工地中实现人性化管理&#xff0c;是当前项目的主要诉求。该项目要实现如下目标&#xff1a; 工地工人的…

C语言实现http下载器(附代码)

C语言实现http的下载器。 例&#xff1a;做OTA升级功能时&#xff0c;我们能直接拿到的往往只是升级包的链接&#xff0c;需要我们自己去下载&#xff0c;这时候就需要用到http下载器。 这里分享一个&#xff1a; 功能&#xff1a; 1、支持chunked方式传输的下载 2、被重定…

Apollo开放平台8.0发布:多维升级“为开发者而生”

Apollo开放平台8.0重磅发布&#xff1a;多维升级“为开发者而生” Apollo开放平台迎来8.0版本&#xff0c;百度自动驾驶开放平台迈向易用性时代 百度Apollo EDU计划进展公布&#xff1a;已覆盖自动驾驶技术人才33.5万、700多所院校 Apollo Studio学习实践社区上线&#xff0c;新…

剑指offer----C语言版----第一天

目录 1. 数组中重复的数字Ⅰ 1.1 题目描述 1.2 思路一 1.3 思路二 1.4 思路三&#xff08;最优解&#xff09; 1. 数组中重复的数字Ⅰ 原题&#xff1a;剑指 Offer 03. 数组中重复的数字 - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/shu-zu-zhong-…

Python语言快速入门上

目录 1、前言 2、变量和常量 1&#xff09;Python对象模型 2&#xff09;Python变量 二、运算符和表达式 【运算符和表达式】 【位运算符】 【逻辑运算符】 【成员运算符】 【身份运算符】 【常用内置函数】 【基本输入输出】 【模块导入与使用】 【Python代码编…

【PCB专题】Allegro导出3D文件

在PCB布局时,已经决定了大部分器件要放置的位置。如接口、主要的芯片、模块等。因为放置好器件后可能与结构干涉,如果没有发现,那么不得不在Layout的后期调整器件位置,增加工作量。所以前期布局基本确定后就需要导出3D文件给结构工程师,由他查看是否有器件与结构、螺丝孔等…

全志Tina Linux Display 开发指南支持百问网T113 D1-H哪吒DongshanPI-D1s V853-Pro等开发板

1 概述 让显示应用开发人员了解显示驱动的接口及使用流程&#xff0c;快速上手&#xff0c;进行开发&#xff1b;让新人接手工作时能快速地了解驱动接口&#xff0c;进行调试排查问题。sunxi 平台DE1.0/DE2.0。与显示相关的应用开发人员&#xff0c;及与显示相关的其他模块的开…

操作系统期末考试必会题库1——引言+用户界面

1.请简要描述操作系统的定义及其功能。 操作系统定义&#xff1a; 是计算机系统中的一个系统软件&#xff0c;是一些程序模块的集合 &#xff0c;它们管理和控制计算机系统中的软硬件资源&#xff0c;合理的组织计算机的工作流程&#xff0c;以便有效的利用这些资源为用户提供一…

Linux用户权限详解

为什么有人冲了钱就能享受至尊VIP待遇&#xff1f;为什么冲了黄钻、绿钻、紫钻就会享受一些特殊活动呢&#xff1f;我们起初都是一群普通用户&#xff0c;为什么有些人就能通过某些手段得到一些异于常人的服务呢&#xff1f;这其中的奥秘是什么呢&#xff1f;接下来带大家了解这…

【Vue】course_1

一、vue简介 Vue是一款用于构建用户界面的 JavaScript 框架。 它基于标准 HTML、CSS 和 JavaScript 构建&#xff0c;并提供了一套声明式的、组件化的编程模型&#xff0c;帮助你高效地开发用户界面。 无论是简单还是复杂的界面&#xff0c;Vue 都可以胜任。 二、vue3选项式…

ASEMI肖特基二极管MBR30100CT和MBR40200PT有什么区别

编辑-Z 别看ASEMI肖特基二极管MBR30100CT和MBR40200PT两种型号从名字上看很像&#xff0c;其实他们的参数和封装都是不一样的&#xff0c;具体MBR30100CT和MBR40200PT有什么区别呢&#xff1f; 肖特基二极管MBR30100CT参数&#xff1a; 型号&#xff1a;MBR30100CT 封装&…

[开源工具]使用Fiddler/Postman简单计算QPS[新手开箱可用]

使用Fiddler/Postman简单计算QPS1.什么是QPS?2.怎么计算QPS?3.如何使用Fiddler/Postman得到一个API接口的QPS?3.1Fiddler使用3.2Postman使用4.如何得到本机的核心数?5.根据公式计算QPS?6.扩展计算单机可支撑PV(理论值)?1.什么是QPS? qps即每秒查询率&#xff0c;是对一…

Postfix + Extmail 企业邮件服务器搭建

ExtMail套件用于提供从浏览器中登录、使用邮件系统的Web操作界面&#xff0c;而Extman套件用于提供从浏览器中管理邮件系统的Web操作界面。它以GPL版权释出&#xff0c;设计初衷是希望设计一个适应当前高速发展的IT应用环境&#xff0c;满足用户多变的需求&#xff0c;能快速进…

数据预处理和特征工程-sklearn

数据挖掘的五大流程&#xff1a; 获取数据数据预处理 数据预处理是从数据中检测&#xff0c;纠正或删除损坏&#xff0c;不准确或不适用于模型的记录的过程。 数据预处理的目的&#xff1a;让数据适应模型&#xff0c;匹配模型的需求特征工程 特征工程是将原始数据转换为更能代…

NLP 中文智能纠错 API 数据接口

NLP 中文智能纠错 API 数据接口 专注于中文语句智能纠错&#xff0c;基于 NLP&#xff0c;多模型参与纠错。 1. 产品功能 秒级 NLP 智能纠错性能&#xff1b;NLP 加载多个模型进行纠错处理&#xff1b;返回纠正字符以及对应位置索引&#xff1b;底层模型以及语料库持续更新集…

正大国际期货:五十句期货投资理念

1.许多期货投资人交易时没有计划。交易前&#xff0c;他们既不设定风险限度&#xff0c;也不设定盈利目标。即使是制定了计划&#xff0c;他们总是“半路出家”&#xff0c;并不坚持既定的计划&#xff0c;尤其是在出现亏损的情况下。结果往往是过量操作&#xff0c;把自己逼在…

Android 操作系统简介

Android 操作系统简介1. 起源2. 操作系统市场占有率3. Android 系统架构3.1 Linux Kernel3.2 Hardware Abstraction Layer (HAL)3.3 运行时 系统库3.3.1 Android Runtime3.3.1 Native C/C Libraries3.4 Java API Framework3.5 System Apps1. 起源 安卓&#xff08;Android&…

程序员年底如何升职加薪?这份涨薪指南来了!

年底了&#xff0c;这个时间节点对于各个公司来说都很重要。 今年大家也知道情况&#xff0c;互联网整体行情都不太好&#xff0c;国外也不好过&#xff0c;硅谷裁员大刀阔斧&#xff0c;实实在在的 感受到了寒意。 能顺利熬到年底的程序员&#xff0c;现在就会关心“公司会普调…