java 笔记 - javaWeb 核心 2 - Request 和 Response

接上一篇 java 笔记 - javaWeb 核心 1

一、Servlet - Request(请求)

(1)Request 继承体系

image.png

(2)Request 获取请求参数

image.png

可以看到获取get和post参数的方法不一样,因此提供了获取参数的通用方法

image.png

特别注意:getParameter 方法无法获取 JSON 参数,应该用获取请求体数据的方式来获取,然后使用阿里巴巴的 fastjson 库来转换 JSON 为 Java 对象。
image.png

(3)Request 获取请求参数中文乱码问题

在Java Servlet中使用HttpServletRequest获取请求参数时出现中文乱码,主要是由于字符编码不一致导致的。【注意:Tomcat 8.0 之后,已将GET请求乱码问题解决,设置默认的解码方式从 ISO-8859-1 改为 UTF-8】
解决方案:

post 方式:设置输入流的编码 request.setCharacterEncoding("UTF-8");
通用方式(get/post)都可用:先编码,再解码
new String(paramName.getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8);

乱码原因:

  • GET请求参数编码问题:
    1.GET请求参数通过URL传递,Tomcat等服务器默认使用ISO-8859-1解码
    2.浏览器通常使用UTF-8编码URL中的中文

  • POST请求体编码问题:
    POST请求参数在请求体中,如果未设置正确的request编码,服务器会使用默认编码(通常是ISO-8859-1)解析

  • 服务器配置问题:
    1.服务器未配置URIEncoding属性
    2.未设置正确的contentType

url 编码:

将字符串安装编码方式转为二进制,每个字节转为2个16进制数并在前面加上%
java的url编码与解码

package com.test.web;

import java.net.URLDecoder;
import java.net.URLEncoder;

public class test {
    public static void main(String[] args) {
        String name = "张三";
        // url编码
        String encode = URLEncoder.encode(name);
        System.out.println(encode);

        // url解码
        String decode = URLDecoder.decode(encode);
        System.out.println(decode);
    }
}

// 打印结果:
%E5%BC%A0%E4%B8%89
张三

模拟浏览器发送get请求到解析时参数变化过程:

        String paramName = "张三";
        // 1.浏览器默认编码方式
        paramName = URLEncoder.encode(paramName);

        // 2.tomcat 默认解码方式
        paramName = URLDecoder.decode(paramName, StandardCharsets.ISO_8859_1);
        System.out.println(paramName);

        // 3.我们通过 getParameter 获取参数后,解决乱码问题:先转为对应的二进制数组,然后重新编码为 utf-8
        paramName = new String(paramName.getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8);

        System.out.println(paramName); // 张三

(4)Request 请求转发

image.png

二、Servlet - Response(响应)

image.png

(1)Response 获取响应数据

image.png

(2)Response 重定向

重定向和请求转发的三个特点是相反的:


image.png

image.png

注意路径问题:
如果是给浏览器使用的需要加上虚拟目录(访问路径,可以使用req.getRequestURL()来获取),服务端使用则不需要加。

(3)Response 响应字符、字节数据

image.png

image.png

常用的比如生成一个验证码的图片流,前端页面上img的src为这个Servlet的地址即可,比如:/checkCodeServlet?_t=1748333957776。【注意:src地址通常是带上了时间戳的,后面的_t是为了解决浏览器缓存的问题】


image.png

参考: 黑马 javaWeb 教程

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。