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 {

    @Override
    protected 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 lisi
            System.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);
    }

    @Override
    protected 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(输入流,输出流);

相关推荐
我爱学嵌入式1 小时前
C语言第 9 天学习笔记:数组(二维数组与字符数组)
c语言·笔记·学习
hqxstudying1 小时前
Java异常处理
java·开发语言·安全·异常
我命由我123454 小时前
Kotlin 数据容器 - List(List 概述、创建 List、List 核心特性、List 元素访问、List 遍历)
java·开发语言·jvm·windows·java-ee·kotlin·list
武子康6 小时前
Java-80 深入浅出 RPC Dubbo 动态服务降级:从雪崩防护到配置中心秒级生效
java·分布式·后端·spring·微服务·rpc·dubbo
灵感__idea7 小时前
JavaScript高级程序设计(第5版):好的编程就是掌控感
前端·javascript·程序员
烛阴8 小时前
Mix
前端·webgl
代码续发8 小时前
前端组件梳理
前端
试图让你心动8 小时前
原生input添加删除图标类似vue里面移入显示删除[jquery]
前端·vue.js·jquery
_Kayo_9 小时前
VUE2 学习笔记6 vue数据监测原理
vue.js·笔记·学习
YuTaoShao9 小时前
【LeetCode 热题 100】131. 分割回文串——回溯
java·算法·leetcode·深度优先