一、Servlet - Request(请求)
(1)Request 继承体系
image.png
(2)Request 获取请求参数
可以看到获取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(响应)
(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 教程