JavaWeb04-Request,Response

目录

一、Request(请求)

1.作用

2.继承体系

3.获取请求数据

(1)请求行

(2)请求头

(3)请求体(POST)

(5)Request通用方式获取请求参数

4.Servlet模板

5.中文数据乱码解决

6.请求转发

二、Response(响应)

1.作用

2.继承体系

3.设置响应数据

(1)响应行

(2)响应头

(3)响应体

4.重定向

5.响应字符数据

6.响应字节数据

三、杂项问题

1.路径问题

2.插件推荐


一、Request(请求)

1.作用

获取请求数据

2.继承体系

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

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

3.获取请求数据

(1)请求行
方法名说明
String getMethod()获取请求方式:GET/POST...
String getContextPath()动态获取虚拟目录(项目访问路径):/request-demo
StringBuffer getRequestURL()动态获取URL(统一资源定位符):http://localhost:8080/request-demo/req1
String getRequestURl()动态获取URI(统一资源标识符): /request-demo/req1
String getQueryString()获取请求参数(GET方式):username=zhangsan&password=123
    //测试网址:http://localhost:8080/tomcat_demo_war/request?username=zhangsan&password=123
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //
        final String reqMethod = req.getMethod();
        final String contextPath = req.getContextPath();
        final StringBuffer requestURL = req.getRequestURL();
        final String requestURI = req.getRequestURI();
        //username=zhangsan&password=123
        final String queryString = req.getQueryString();
        System.out.println(reqMethod);
        System.out.println(contextPath);
        System.out.println(requestURL);
        System.out.println(requestURI);
        System.out.println(queryString);
    }

结果:

(2)请求头
方法名说明
String getHeader(String name)根据请求头名称获取值
(3)请求体(POST)
方法名说明
ServletInputStream getInputStream()获取字节输入流
BufferedReader getReader()获取字符输入流
  <form action="/request02" method="post">
      <!--确保表单内容有name属性!-->
    <label>
      <input type="text" placeholder="请输入用户名" name="username"><br>
    </label>
    <label>
      <input type="password" placeholder="请输入密码" name="password"><br>
    </label>
    <input type="submit">
  </form>
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    //
    System.out.println("req对象:" + req);
    //此流不需要自己手动关闭,在request对象被销毁的时候,该流会自动关闭
    final BufferedReader reader = req.getReader();
    final String s = reader.readLine();
    System.out.println(s);
​
}

(5)Request通用方式获取请求参数
方法名说明
Map< String,String[]> getParameter()获取所有参数Map集合
String[] getParameterValues(String name)根据名称获取参数值/数组
String getParameter(String name)根据名称获取参数值(单个值)

html

  <form action="/request03" method="get">
<!--确保表单内容有name属性!-->
    <label>
      <input type="text" placeholder="请输入用户名" name="username"><br>
    </label>
    <label>
      <input type="password" placeholder="请输入密码" name="password"><br>
    </label>
      <label>
          <input type="checkbox" name="hobby" value="run">
      </label>跑
      <label>
          <input type="checkbox" name="hobby" value="jump">
      </label>跳
      <label>
          <input type="checkbox" name="hobby" value="eat">
      </label>吃
    <input type="submit">
  </form>

java:

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        final Map<String, String[]> reqParameterMap = req.getParameterMap();
        reqParameterMap.forEach((k,v) -> {
            System.out.println(k+":"+ Arrays.toString(v));
        });
​
        final String[] hobby = req.getParameterValues("hobby");
        System.out.println(Arrays.toString(hobby));
        //只会获取数组中的第一个数据
        final String hobby1 = req.getParameter("hobby");
        System.out.println(hobby1);
    }
​
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        final Map<String, String[]> reqParameterMap = req.getParameterMap();
        reqParameterMap.forEach((k,v) -> {
            System.out.println(k+":"+ Arrays.toString(v));
        });
​
        final String[] hobby = req.getParameterValues("hobby");
        System.out.println(Arrays.toString(hobby));
        //只会获取数组中的第一个数据
        final String hobby1 = req.getParameter("hobby");
        System.out.println(hobby1);
    }

优化重复代码:

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    final Map<String, String[]> reqParameterMap = req.getParameterMap();
    reqParameterMap.forEach((k,v) -> {
        System.out.println(k+":"+ Arrays.toString(v));
    });
​
    final String[] hobby = req.getParameterValues("hobby");
    System.out.println(Arrays.toString(hobby));
    //只会获取数组中的第一个数据
    final String hobby1 = req.getParameter("hobby");
    System.out.println(hobby1);
}
​
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    this.doGet(req,resp);
}

4.Servlet模板

如果还觉得不够省事,可以修改模板

5.中文数据乱码解决

如果是Tomcat8及以上的版本,恭喜这个问题可以跳过~

预防万一解决方式也写一下

POST:

方法名说明
setCharacterEncoding("UTF-8");设置字符流编码格式

GET:

URL编码

  • 将字符串按照编码方式转为二进制

  • 每个字节转为2个16进制数并在前边加上%

Tomcat默认编码:ISO-8859-1

解决方式:该方法通用

  • 将接收数据先转成字节数据

  • 之后再解码变成汉字

public class UrlDemo {
    public static void main(String[] args) throws UnsupportedEncodingException {
        //URL编码
        //浏览器
        String s = "张三";
        final String encode = URLEncoder.encode(s,"utf-8");
        System.out.println(encode);
​
        //URL解码
        //Tomcat
        //Tomcat8以下默认使用的是ISO-8859-1
        final String decode = URLDecoder.decode(encode, "ISO-8859-1");
        System.out.println(decode);
​
        //转为字节数据,编码
        final byte[] bytes = decode.getBytes(StandardCharsets.ISO_8859_1);
        for (byte aByte : bytes) {
            System.out.print(aByte+" ");
        }
        System.out.println();
​
        //字节数组转字符串,解码
        final String s1 = new String(bytes, StandardCharsets.UTF_8);
        System.out.println(s1);
    }
}

6.请求转发

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

实现方式:

//写在资源A
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.作用

设置响应数据

2.继承体系

3.设置响应数据

(1)响应行
方法名说明
void setStatus(int sc)设置响应状态码
(2)响应头
方法名说明
void setHeader(String name,String value)设置响应头键值对

(3)响应体
方法名说明
PrintWriter getWriter()获取字符输出流
ServletOutputStream getOutputStream()获取字节输出流

4.重定向

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

System.out.println("resp01");
response.setStatus(302);
//不区分大小写
response.setHeader("Location","/response02");
​
//简化
response.sendRedirect("/response02");

特点:

  • 浏览器地址栏路径发生变化

  • 可以重定向到任意位置的资源(服务器内部、外部均可)

  • 两次请求,不能在多个资源使用request共享数据

5.响应字符数据

//中文乱码解决
//原因:通过Response获取的字符输出流默认编码:ISO-8859-1
response.setContentType("text/html;charset=utf-8");
//解析html标签
response.setHeader("content-type","text/html");
//流不需要手动关闭,随着响应结束,response对象销毁,由服务器关闭
final PrintWriter writer = response.getWriter();
writer.write("测试");
writer.write("ceshi");
writer.write("<h1>测试</h1>");

6.响应字节数据

//读取文件
FileInputStream fis = new FileInputStream("D:/新建文件夹 (2)/图片素材/13516761_0_final.png");
//获取response字节输出流
final ServletOutputStream os = response.getOutputStream();
//完成流的copy
final byte[] buffer = new byte[1024];
int length;
while ((length = fis.read(buffer)) != -1){
    os.write(buffer,0,length);
}
fis.close();

IO工具类:

<dependency>
  <groupId>commons-io</groupId>
  <artifactId>commons-io</artifactId>
  <version>2.11.0</version>
</dependency>
//读取文件
FileInputStream fis = new FileInputStream("D:/新建文件夹 (2)/图片素材/13516761_0_final.png");
//获取response字节输出流
final ServletOutputStream os = response.getOutputStream();
IOUtils.copy(fis,os);

三、杂项问题

1.路径问题

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

动态获取虚拟目录:

final String contextPath = request.getContextPath();
System.out.println(contextPath);
//简化
response.sendRedirect(contextPath + "/response02");

2.插件推荐

File Path Autocomplete:

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

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

相关文章

植物神经紊乱的五大信号,你知道吗?

植物神经紊乱&#xff0c;听起来像是医学名词&#xff0c;但其实它离我们的生活并不遥远。它就像一位隐形的朋友&#xff0c;时常悄悄地出现&#xff0c;给我们带来从头到脚的不适&#xff0c;让我们的生活变得困扰不已。今天&#xff0c;就让我们一起揭开这位“朋友”的真面目…

[Unity实战]使用NavMeshAgent做玩家移动

其实除了Character Controller, Rigidbody&#xff0c;我们还可以使用NavMeshAgent去做。这么做的好处是能避免玩家去莫名其妙的地方&#xff08;毕竟基于烘焙过的导航网格&#xff09;&#xff0c;一般常见于元宇宙应用和mmo。 根据Unity手册&#xff0c;NavMeshAgent 也有和…

【JavaEE初阶 -- 计算机核心工作机制】

这里写目录标题 1.冯诺依曼体系2.CPU是怎么构成的3.指令表4.CPU执行代码的方式5.CPU小结&#xff1a;6.编程语言和操作系统7. 进程/任务&#xff08;Process/Task&#xff09;8.进程在系统中是如何管理的9. CPU分配 -- 进程调度10.内存分配 -- 内存管理11.进程间通信 1.冯诺依曼…

QPaint绘制自定义仪表盘组件04

网上视频抄的&#xff0c;用来自己看一下&#xff0c;看完就删掉 最终效果 ui widgetspeed.h #ifndef WIDGETSPEED_H #define WIDGETSPEED_H#include <QWidget> #include <QPaintEvent> #include <QPainter> #include <QDebug> #include <QFont&g…

时光机关:探秘Java中的Timer和TimerTask

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 时光机关&#xff1a;探秘Java中的Timer和TimerTask 前言Timer和TimerTask的基本概念Timer&#xff1a;TimerTask&#xff1a;为何它们是 Java 中任务调度的得力工具&#xff1a; Timer的使用方法创建…

【物联网应用案例】从0到N,智慧农业的数据价值

智慧农业全方位渗透到农业的每一个环节&#xff0c;云端解决方案更推动了研究人员、农艺师及农民间的密切协作&#xff0c;为研发企业提供了既经济又具扩展性的完美方案。 据IDC预计&#xff0c;到2036年&#xff0c;农场收集的数据量将增加800%以上&#xff0c;这凸显了农业数…

一款非常适合老中医用的《书剑中医电子处方软件简明版》

上了年纪的老中医&#xff0c;虽然经验丰富&#xff0c;但是电脑的基础都比较差&#xff0c;而开处方的软件通常又设计的太复杂&#xff0c;想用电脑开处方就非常困难&#xff0c;所以只好坚持手写开处方。最近&#xff0c;小编找到了一款非常简单的《书剑中医电子处方软件简明…

GPQA数据集分享

来源: AINLPer公众号&#xff08;每日干货分享&#xff01;&#xff01;&#xff09; 编辑: ShuYini 校稿: ShuYini 时间: 2024-2-28 尽管AI系统在许多任务上表现出色&#xff0c;但在需要大量专业知识和推理能力的任务上仍然存在局限性。为此&#xff0c;纽约大学的研究者提出…

ECMAScript 语法

ECMAScript 语法 一、ECMAScript1.ECMAScript简介2.ECMAScript历史 二、ECMAScript 语法区分大小写变量是弱类型的每行结尾的分号可有可无注释与 Java、C 和 PHP 语言的注释相同括号表示代码块 一、ECMAScript ECMAScript是一种由Ecma国际&#xff08;前身为欧洲计算机制造商协…

西门子Mendix低代码资深技术顾问张戟,将出席“ISIG-低代码/零代码技术与应用发展峰会”

3月16日&#xff0c;第四届「ISIG中国产业智能大会」将在上海中庚聚龙酒店拉开序幕。本届大会由苏州市金融科技协会指导&#xff0c;企智未来科技&#xff08;LowCode低码时代、RPA中国、AIGC开放社区&#xff09;主办。大会旨在聚合每一位产业成员的力量&#xff0c;深入探索低…

【操作系统概念】 第7章:死锁

文章目录 0.前言7.1 系统模型7.2 死锁特征7.2.1 必要条件7.2.2 资源分配图 7.3 死锁处理方法7.4 死锁预防&#xff08;deadlock prevention&#xff09;7.4.1 互斥7.4.2 占有并等待7.4.3 非抢占7.4.4 循环等待 7.5 死锁避免&#xff08;deadlock-avoidance&#xff09;7.5.1 安…

NetSuite Mass Update 批量更新功能

NetSuite中有一个小而精的便捷功能&#xff0c;但是也是一个很容易在实践中被大家遗忘的隐藏功能&#xff0c;就是Mass Update批量更新&#xff0c;在此想和各位分享一下&#xff5e;该功能主要是可以帮助用户快速将符合固定标准的记录中的单个/多个字段直接进行批量更新。如果…

深度神经网络 基本知识 记录

资料&#xff1a;https://www.bilibili.com/video/BV1K94y1Z7wn/?spm_id_from333.337.search-card.all.click&vd_source14a476de9132ba6b2c3cbc2221750b99 计划&#xff1a;3~4天 注&#xff1a;网课讲的内容比较糅杂&#xff0c;记录的内容可能会出现重复 杂 人工智能…

vue3基础教程(3)——引入ui框架iview(viewui)

博主个人微信小程序已经上线&#xff1a;【中二少年工具箱】。欢迎搜索试用 正文开始 专栏简介1. 下载iview2.更新资源3.引入插件4.运行项目 专栏简介 本系列文章由浅入深&#xff0c;从基础知识到实战开发&#xff0c;非常适合入门同学。 零基础读者也能成功由本系列文章入门…

HTML开发工具和环境介绍,内附超详细的VS code安装教程!

工欲善其事必先利其器&#xff0c;一款好的开发工具可以让我们事半功倍。前面我们对HTML的相关概念和基本结构已经有了基本的了解&#xff0c;下面我们就来安装在前端开发中的需要使用的开发工具及环境。 在众多HTML编辑器中&#xff0c;选择一个适合自己的工具至关重要。今天…

实现的一个网页版的简易表白墙

实现的一个网页版的表白墙 实现效果 代码截图 相关代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><tit…

计算机网络-网络应用服务器(二)

目录 1.虚拟机VM简介&#xff1a; 2.虚拟机VM几个注意事项&#xff1a; 3.Web服务器网站配置&#xff1a; 4.FTP服务器选项设置&#xff1a; 5.隔离的FTP服务器安装设置&#xff1a; 6.Apache服务器&#xff1a; 7.httpd.conf主配置文件部分内容&#xff1a; 8.虚拟主机&a…

zipkin Access denied for user ‘xxx‘@‘xxx‘ (using password: NO)

Access denied : 拒绝访问 解决方案&#xff1a; 授权 登录mysql 之后执行命令 step 1 mysql -u username -p // username: 替换成你sql 用户名step2 授权 alter user usernameip identified with mysql_native_password by password // step 3 刷新 flush privileges;

好物周刊#44:现代终端工具

https://github.com/cunyu1943 村雨遥的好物周刊&#xff0c;记录每周看到的有价值的信息&#xff0c;主要针对计算机领域&#xff0c;每周五发布。 一、项目 1. Github-Hosts 通过修改 Hosts 解决国内 Github 经常抽风访问不到&#xff0c;每日更新。 2. 餐饮点餐商城 针对…

受投资人青睐,易鑫租赁深交所再发8.10亿ABS,利率再创新低

近日&#xff0c;上海易鑫融资租赁有限公司&#xff08;以下简称“易鑫租赁”&#xff09;成功发行“天风-易鑫租赁惠民4期资产支持专项计划”&#xff0c;募集资金8.10亿元&#xff08;人民币&#xff0c;下同&#xff09;。此次发行利率再创易鑫ABS历史新低。 2023年1月&…