Request和Response对象

        Request和Response都是Servlet的service方法的参数,Request负责获取请求数据,而Response负责设置相应数据~


一.Request

1.继承体系

Tomcat负责解析数据,因此由Tomcat来提供实现类~ 

2.获取请求数据

  • 请求行

  • 请求头

  • 请求体

需要注意的是只有Post方法才有请求体。因此请求体的方法应该写到Servlet的doPost方法中~

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

 

尝试一下,先写一个用户表单:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
  <form action="//Servlet_F1_war/demo2" >
    <input type="text" name="username"><br/>
    <input type="password" name="password"><br/>
      <input type="checkbox" name="gender" value="男">男<br/>
    <input type="checkbox" name="gender" value="女">女<br/>
    <input type="submit" ><br/>
  </form>
</body>
</html>

注意, 第一个斜杠后面是项目的访问路径(也就是名称),第二个是自愿路径(这里是一个Servlet的注解!)

Servlet的代码如下(只演示第一个方法:)

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("此时调用的是get方法~");
        Map<String,String[]> map = req.getParameterMap();
        //键入:iter 快速遍历
        for (String key : map.keySet()) {
            System.out.print(key+" ");
            String[] values = map.get(key);
            for(String value : values)
            {
                System.out.print(value + ",");
            }
            System.out.println();
        }
    }

Get方法将参数提交到Url里面:

 打印成功:

 然后将表单的提交方式改为post,doGet方法修改如下:

    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        String m =req.getMethod();
        System.out.println("此时调用的是"+m+"方法~");
        Map<String,String[]> map = req.getParameterMap();
        //键入:iter 快速遍历
        for (String key : map.keySet()) {
            System.out.print(key+" ");
            String[] values = map.get(key);
            for(String value : values)
            {
                System.out.print(value + ",");
            }
            System.out.println();
        }
    }

然后doPost直接调用doGet:

    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doGet(req,resp);
    }

 post方法将参数隐藏在请求体中:

请求成功(中文有些乱码,暂时忽略):

 

完整的代码如下,经供参考:

package Myweb;
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.Map;

@WebServlet("/demo2")
public class ServletDemo2 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        String m =req.getMethod();
        System.out.println("此时调用的是"+m+"方法~");
        Map<String,String[]> map = req.getParameterMap();
        //键入:iter 快速遍历
        for (String key : map.keySet()) {
            System.out.print(key+" ");
            String[] values = map.get(key);
            for(String value : values)
            {
                System.out.print(value + ",");
            }
            System.out.println();
        }
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doGet(req,resp);
    }
}

 4.解决乱码

post的解决非常简单,只需要如下代码设置字符流的输入编码,即可完美解决:

req.setCharacterEncoding("UTF-8");

搞定~

对于汉字类型的数据,在get方式中会通过Url编码变为16进制数据。乱码的原因是Tomcat在解码时默认使用ISO-8859-1。这里给出一个通用的方式,假设中文数据的名称为username:

username = new String(username.getBytes(StandardCharsets.ISO_8859_1),StandardCharsets.UTF_8);

 也可以解决post方式。

不过,Tomcat8版本之后已经默认解决了GET方式乱码的问题,大家不需要操心~

5.请求转发

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

新建Servlet3号和4号如下:

package Myweb;

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("/demo3")
public class ServletDemo3 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("使用的是Servlet3号~");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doPost(req, resp);
    }
}
package Myweb;

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("/demo4")
public class ServletDemo4 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("使用的是Servlet4号~");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doPost(req, resp);
    }
}

 在Servlet3中书写请求转发到Servlet4的代码:

req.getRequestDispatcher("/demo4").forward(req,resp);

访问Servlet3成功后,Servlet4也会一起成功: 

 

 

 

请求转发的特点:

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

二.Response

1.设置响应数据

2.完成重定向

重定向是一种资源跳转方式。状态码是:302。位置的格式是:响应头Location:xxx

定义两个Servlet:

package Myweb.Response;

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("/respd1")
public class RespDemo1 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("访问的是Response1~");
        resp.setStatus(302);
        resp.setHeader("Location","/Servlet_F1_war/respd2");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doPost(req, resp);
    }
}
package Myweb.Response;

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("/respd2")
public class RespDemo2 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
      System.out.println("重定向的Resp2也被访问了~");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doPost(req, resp);
    }
}

虚拟路径一定要写对,这是易错点。

 

如上,访问1号2号也会被重定向~ 

resp.sendRedirect("/Servlet_F1_war/respd2");

如上是一种简化写法。

重定向的特点:

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

重定向与请求转发的特点完全相反~

针对于虚拟路径:

  • 浏览器使用:需要加虚拟目录(项目访问路径)
  • 服务端使用:不需要加虚拟目录
String contextPath = request.getContextPath();
response.sendRedirect(contextPath+"/resp2");

如上是动态配置虚拟目录的方式~

3.响应字符数据

        PrintWriter writer=resp.getWriter();
//获取字符输出流
        writer.write("啦啦啦~");
        writer.write("<h1>HELLO</h1>");

通过Response对象获取字符输出流,并写出数据~ 

存在乱码现象,且按照普通文本的读取方式~

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

设置头的解析方式,并设置流的编码为UTF-8。 

成功。

 (流不需要关闭,Response对象销毁后服务器会将其自动关闭~)

4.响应字节数据

        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.6</version>
        </dependency>

引入工具类坐标。

    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
      //1、读取文件
        FileInputStream fis=new FileInputStream("E:\\照片//德拜.jpg");
      //2、获取字节输出流
        ServletOutputStream os = resp.getOutputStream();
      //3、完成流的复制
        IOUtils.copy(fis,os);
    }

如上。

即可成功读取图片~

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

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

相关文章

【Greenhills】MULTI IDE工程管理的目录结构

【更多软件使用问题请点击亿道电子官方网站查询】 1、 文档目标 关于的GHS的Project Manager中工程的目录结构的组成 2、 问题场景 在GHS中去创建项目后&#xff0c;对于在Project Manager窗口中的目录结构不太清晰&#xff0c;目录中有多个gpj文件&#xff0c;无法确认哪个是…

掼蛋如何识人

掼蛋的吸引力在于其充满变化和挑战性。它不仅仅可以考验玩家的技巧、智慧和决策能力&#xff0c;也是一种社交活动。通过玩家之间的出牌习惯和方式&#xff0c;能快速帮助我们推测出对方的思维方式和性格特征。 一、保守型 这类玩家按部就班&#xff0c;在游戏开始的时候&#…

【JAVA】HashMap扩容性能影响及优化策略

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a;JAVA ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言 正文 结语 我的其他博客 前言 在软件开发中&#xff0c;HashMap是一种常用的数据结构&#xff0c;但在处理大量数据时&#xff0c;其扩容…

广西省行政村边界shp数据/广西省乡镇边界/广西省土地利用分类数据/径流分布

广西壮族自治区&#xff0c;地处中国南部&#xff0c;北回归线横贯中部。南北以贺州——东兰一线为界&#xff0c;此界以北属中亚热带季风&#xff0c;以南属南亚热带季风。 数据范围&#xff1a;全国行政区划-行政村界 数据类型&#xff1a;面状数据&#xff0c;全国各省市县…

华为数通方向HCIP-DataCom H12-821题库(多选题:141-160)

第141题 以下关于802.1X认证的触发机制,描述正确的有? A、802.1X认证不能由认证设备(如802.1交换机)发起 B、802.1X客户端可以组播或广播方式触发认证 C、认证设备可以以组播或单播方式触发认证 D、802.1X认证只能由客户端主动发起 【参考答案】BC 【答案解析】 第142题 以…

java-ssm-基于jsp商场停车服务管理信息系统

java-ssm-基于jsp商场停车服务管理信息系统

Python网站的搭建和html基础

1.Python网站代码及讲解 一般我们搭建小型的网站就用flask库就行了。 &#xff08;1&#xff09;安装flask库 安装完python后&#xff0c;按住windows徽标键和r,弹出“运行”&#xff0c;在里面输入cmd。 回车打开&#xff0c;输入“pip install flask”。 &#xff08;2&am…

WAServiceMainContext.js:2 ReferenceError: result is not defined

WAServiceMainContext.js:2 ReferenceError: result is not defined at success (index.js? [sm]:280) at Function.forEach.u.<computed> (WASubContext.js?twechat&s1710205354985&v2.16.1:2) at :22955/appservice/<api request success callback fun…

53、WEB攻防——通用漏洞CRLF注入URL重定向资源处理拒绝服务

文章目录 CRLF注入原理&检测&利用URL重定向web拒绝服务 CRLF注入原理&检测&利用 URL重定向 就是url中存在urlhttps://xxx&#xff0c;重定向的页面没有限制。主要用来做钓鱼。 web拒绝服务 例如&#xff0c;图片的长宽参数由前端传入&#xff0c;恶意的数据…

初级爬虫实战——伯克利新闻

文章目录 发现宝藏一、 目标二、简单分析网页1. 寻找所有新闻2. 分析模块、版面和文章 三、爬取新闻1. 爬取模块2. 爬取版面3. 爬取文章 四、完整代码五、效果展示 发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不…

RT-Thread组件之Audio框架i2s驱动的编写

前言 rt-thread本次使用的是标志版本为5.0。本次实现的是音频播放部分的i2s驱动使用的芯片为stm32f407zgt6在网上搜了一下关于rt-thread 音频部分的内容&#xff0c;没有实质的提供i2s对接的硬件驱动。所以才有了此次的记录&#xff0c;做一下分享记录。参考的git源码驱动&…

基础数据运营 - 面经 - 自如租房

招聘要求&#xff1a; 投递时间&#xff1a; 2023.12.28 BOSS直聘 联系HR 2023.12.29 面试 面试流程&#xff1a; 自我介绍&#xff0c;正常完整表述 你能介绍一下你的实习经历吗&#xff1f;主要做了哪些工作&#xff0c;得到了哪些结论出来 一般Excel有用到过么&#x…

Verilog刷题笔记37

题目&#xff1a;3位二进制加法器 Now that you know how to build a full adder, make 3 instances of it to create a 3-bit binary ripple-carry adder. The adder adds two 3-bit numbers and a carry-in to produce a 3-bit sum and carry out. To encourage you to actua…

2014-2023年42家上市银行ESG评级数据集

数据说明&#xff1a;以 Environment&#xff08;环境&#xff09;、Social&#xff08;社会&#xff09;和 Governance&#xff08;公司治理&#xff09;为核心的 ESG 理念是一种关注企业环境、社会责任、治理绩效而非财务绩效的评价标准。2004 年 6 月&#xff0c;联合国全球…

如何下载网页中的网络视频

你应该知道的&#xff0c;如果是要下载网络地图&#xff0c;你可以通过水经微图&#xff08;下文简称“微图”&#xff09;桌面版进行下载。 那么&#xff0c;如果是需要下载网络视频又应该用什么工具呢&#xff1f; 我们这里就来分享一个网络视频下载工具&#xff0c;以及下…

软件无线电系列——软件无线电的发展历程及体系框架

本节目录 一、软件无线电的起始 二、软件无线电SDR论坛 三、SPEAKeasy计划 四、JTRS与SCA 五、软件无线电体系框架本节内容 一、软件无线电的起始 1992年5月&#xff0c;美国电信会议上&#xff0c;Joseph Mitola III博士提出来软件无线电(Software Radio,SR)的概念。理想化的…

探索 PostgreSQL 的高级数据类型 - 第 二 部分

范围类型 范围类型提供了一种简洁的方式来表示单个数据库字段中的值范围。它们在从时间数据到数字间隔的各种领域中都有应用。在本篇博客文章中&#xff0c;我们将通过 DML/SQL 语句和 Navicat for PostgreSQL 16 来深入了解它们的使用&#xff08;以及好处&#xff01;&#…

Ping工作原理

文章目录 目的ping网络协议 OSIICMP什么是ICMP作用功能报文类型查询报文类型差错报文类型ICMP 在 IPv4 和 IPv6 的封装ICMP 在 IPv4 协议中的封装ICMP 在 IPv6 协议中的封装ICMP 头部日常ping 排除步骤ping 查询报文使用code扩展目的 本文主要是梳理ping的工作原理- 揭开 ICMP…

ThreeWayBranch 优化阅读笔记

1. 优化目的 通过重排三分支的 BB 块减少比较指令的执行次数 代码路径: bolt/lib/Passes/ThreeWayBranch.cpp2. 效果 优化前&#xff1a; 注&#xff1a; 黄色数字表示BB块编号&#xff0c; 紫色表示该分支跳转的次数&#xff0c;绿色是代码里BB块的变量名 ThreeWayBranc…

如何把视频号里的视频提取出来?下载提取器支持一键下载视频!

下载微信视频号视频一直都是很多人都痛&#xff0c;本期分享如何使用视频号下载器下载视频。 视频下载提取器 工具名称&#xff1a;视频号下载小助手&#xff1b;简称&#xff0c;视频下载助手 使用平台&#xff1a;苹果手机、安卓手机、电脑设备 使用方法&#xff1a;一键…