当前位置: 首页 > news >正文

JavaWeb笔记05

十一、Request和Response

1_介绍

Request(请求) & Response(响应)
Request:获取请求数据
Response:设置响应数据

2_Request继承体系

Request 继承体系
ServletRequest :Java 提供的请求对象根接口
HttpServletRequest :Java 提供的对 Http 协议封装的请求对象接口
RequestFacade :Tomcat 定义的实现类

1.Tomcat 需要解析请求数据,封装为 request 对象,并且创建 request 对象传递到 service 方法中
2.使用 request 对象,查阅 JavaEE API 文档的 HttpServletRequest 接口

3_Request获取请求数据

Request 获取请求数据
请求数据分为 3 部分:
1.请求行:GET /request-demo/req1?username=zhangsan HTTP/1.1
GET /request-demo/req1?username=zhangsan HTTP/1.1

String getMethod():获取请求方式:GET
String getContextPath():获取虚拟目录 (项目访问路径):/request-demo
StringBuffer getRequestURL():获取 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 getInputStream (): 获取字节输入流
BufferedReader getReader (): 获取字符输入流

4_Request通用方式获取请求参数

Request 通用方式获取请求参数
请求参数获取方式:
GET 方式:
String getQueryString()
POST 方式
BufferedReader getReader()

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


Request 通用方式获取请求参数

//获取请求方式
String method = this.getMethod();
//判断
if ("GET".equals(method)) {
    // GET方式获取请求参数
    params = this.getQueryString();
} else if ("POST".equals(method)) {
    // POST方式获取请求参数
    BufferedReader reader = this.getReader();
    params = reader.readLine();
}

Map<String, String[]> getParameterMap():获取所有参数 Map 集合
String[] getParameterValues(String name):根据名称获取参数值(数组)
String getParameter(String name):根据名称获取参数值(单个值)

package com.itheima.web;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.BufferedReader;
import java.io.IOException;
import java.util.Map;@WebServlet("/req2")
public class RequestDemo2 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//GET请求逻辑System.out.println("get....");//1. 获取所有参数的Map集合Map<String, String[]> map = req.getParameterMap();for (String key : map.keySet()) {// username:zhangsan lisiSystem.out.print(key+":");//获取值String[] values = map.get(key);for (String value : values) {System.out.print(value + " ");}System.out.println();}//2. 根据key获取参数值,数组String[] hobbies = req.getParameterValues("hobby");for (String hobby : hobbies) {System.out.println(hobby);}//3. 根据key 获取单个参数值String username = req.getParameter("username");String password = req.getParameter("password");System.out.println(username);System.out.println(password);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        代码通用this.doGet(req,resp);}
}
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body><form action="/Request/req2" method="get"><input type="text" name="username"><br><input type="password" name="password"><br><input type="checkbox" name="hobby" value="1"> 游泳<input type="checkbox" name="hobby" value="2"> 爬山 <br><input type="submit"></form>
</body>
</html>

5_Idea模板创建Servlet

Request 通用方式获取请求参数
使用通用方式获取请求参数后,屏蔽了 GET 和 POST 的请求方式代码的不同,则代码可以定义为如下格式:
@WebServlet("/reqDemo3")
public class RequestDemo3 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) {

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

可以使用 Servlet 模板创建 Servlet 更高效

6_请求参数中文乱码-POST解决方案

Request 请求参数中文乱码处理
请求参数如果存在中文数据,则会乱码
解决方案:
POST:设置输入流的编码
req.setCharacterEncoding("UTF-8");

7_请求参数中文乱码-GET解决方案

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

通用方式(GET/POST):先编码,再解码
new String(username.getBytes("ISO-8859-1"),"UTF-8");

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

总结:
1.中文乱码解决方案:
    POST:设置输入流的编码
        req.setCharacterEncoding("UTF-8");
    通用方式(GET/POST):先解码,再编码
        new String(username.getBytes("ISO-8859-1"),"UTF-8");
2.URL 编码实现方式:
    编码:
        URLEncoder.encode(str, "utf-8");
    解码:
        URLDecoder.decode(s, "ISO-8859-1");

8_请求转发

请求转发
请求转发 (forward):一种在服务器内部的资源跳转方式
实现方式:
req.getRequestDispatcher("资源B路径").forward(req,resp);

请求转发资源间共享数据:使用 Request 对象
void setAttribute(String name, Object o):存储数据到 request 域中
Object getAttribute(String name):根据 key,获取值
void removeAttribute(String name):根据 key,删除该键值对

9_Response设置响应数据功能介绍

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>

10_Response完成重定向

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

浏览器请求资源A
资源A响应:1.我处理不了,找别人去处理:状态码 302
                     2.那个人的位置是 xxx: 响应头 location : xxx
浏览器请求资源B

实现方式:
resp.setStatus(302);
resp.setHeader("location", "资源B的路径");

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

11_资源路径问题

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

练习:
<a href= '路径' > 加虚拟目录
<form action= '路径' > 加虚拟目录
req.getRequestDispatcher("路径") 不加虚拟目录
resp.sendRedirect("路径") 加虚拟目录

12_Response响应字符数据

Response 响应字符数据
使用:
1.通过 Response 对象获取字符输出流
    PrintWriter writer = resp.getWriter();
2.写数据
    writer.write("aaa");

注意:
该流不需要关闭,随着响应结束,response 对象销毁,由服务器关闭
中文数据乱码:原因通过 Response 获取的字符输出流默认编码:ISO-8859-1
resp.setContentType("text/html;charset=utf-8");

13_Response响应字节数据

Response 响应字节数据
使用:
    1.通过 Response 对象获取字符输出流
    ServletOutputStream outputStream = resp.getOutputStream();
    2.写数据
    outputStream.write(字节数据);

IOUtils 工具类使用
    1.导入坐标
    <dependency>
        <groupId>commons-io</groupId>
        <artifactId>commons-io</artifactId>
        <version>2.6</version>
    </dependency>

    2.使用
    IOUtils.copy(输入流,输出流); 

http://www.xdnf.cn/news/1081099.html

相关文章:

  • 论文解读:《DeepGray:基于灰度图像和深度学习的恶意软件分类方法》
  • 408第三季part2 - 计算机网络 - 计算机网络基本概念
  • FastAPI 小白教程:从入门级到实战(源码教程)
  • 学习者的Python项目灵感
  • WPF 右键菜单 MenuItem 绑定图片时只显示最后一个 Icon
  • 【python实用小脚本-128】基于 Python 的 Hacker News 爬虫工具:自动化抓取新闻数据
  • 第二章-AIGC入门-开启AIGC音频探索之旅:从入门到实践(6/36)
  • 玩转n8n工作流教程(一):Windows系统本地部署n8n自动化工作流(n8n中文汉化)
  • 【基础算法】贪心 (二) :推公式
  • 基于大模型的强直性脊柱炎全周期预测与诊疗方案研究
  • 算法学习笔记:6.深度优先搜索算法——从原理到实战,涵盖 LeetCode 与考研 408 例题
  • 风平浪静、无事发生
  • 八股学习(三)---MySQL
  • 【C语言刷题】第十天:加量加餐继续,代码题训练,融会贯通IO模式
  • 类图+案例+代码详解:软件设计模式----原型模式
  • WPF+HelixToolkit打造炫酷自定义3D贴图立方体盒子模型
  • goole chrome变更默认搜索引擎为百度
  • 篇二 OSI七层模型,TCP/IP四层模型,路由器与交换机原理
  • SpringBoot-规划多模块目录结构
  • 从0开始学习R语言--Day38--辛普森多样性指数
  • Nuxt 3 面试题合集(中高级)
  • vue3 获取选中的el-table行数据
  • 浅谈 webshell 构造之如何获取恶意函数
  • 「AI产业」| 《中国信通院华为:智能体技术和应用研究报告》
  • Response对象
  • Excel 如何处理更复杂的嵌套逻辑判断?
  • 网安系列【4】之OWASP与OWASP Top 10:Web安全入门指南
  • Flink Vitess CDC 环境配置与验证
  • QString 转 varchar
  • 【网络与系统安全】域类实施模型DTE