Request&Response

Request

Request 继承体系

image-20230504143937310

1.Tomcat需要解析请求数据,封装为request对象,并且创建request对象传递到service方法中

2.使用request对象,查阅JavaEE API文档的HttpServletRequest接口

Request 获取请求数据

请求数据分为3部分:

请求行

GET /request-response-demo/req1?username=zhangsan HTTP/1.1

String getMethod():获取请求方式: GET
String getContextPath():获取虚拟目录(项目访问路径): /request-response-demo
    --项目名
StringBuffer getRequestURL(): 获取URL(统一资源定位符):http://localhost:8080/request-response-demo/req1
	--完整路径
String getRequestURI():获取URI(统一资源标识符): /request-response-demo/req1
    --项目名称和Servlet名称
String getQueryString():获取请求参数(GET方式): username=zhangsan&password=123

请求头

User-Agent: Mozilla/5.0 Chrome/91.0.4472.106

String getHeader(String name):根据请求头名称,获取值

请求体

username=superbaby&password=123

ServletInputStream  getInputStream():获取字节输入流
BufferedReader getReader():获取字符输入流

Request 通用方式获取请求参数

请求参数获取方式:

GET 方式

String getQueryString()
username=aaa&password=123&hobby=1&hobby=2

POST 方式

BufferedReader getReader()
username=aaa&password=123&hobby=1&hobby=2

image-20230504144951621

•Map<String, String[ ]> getParameterMap():获取所有参数Map集合

•String getParameter(String name):根据名称获取参数值(单个值)

•String[ ] getParameterValues(String name) :根据名称获取参数值(数组)

通用

使用通用方式获取请求参数后,屏蔽了GET和POST的请求方式代码的不同,则代码可以定义为如下格式:

image-20230504145149117

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

image-20230504145229311

image-20230504145235806

Request 请求参数中文乱码处理

请求参数如果存在中文数据,则会乱码

解决方案:

POST:设置输入流的编码

req.setCharacterEncoding("UTF-8");

Tomcat 8.0 之后,GET请求没有乱码问题

URL编码

  1. 将字符串按照编码方式转为二进制
  2. 每个字节转为2个16进制数并在前边加上%
URLEncoder.encode(str, "utf-8");
URLDecoder.decode(s, "utf-8");

image-20230504145621219

请求转发

请求转发(forward):一种在服务器内部的资源跳转方式

image-20230504145832674

实现方式

req.getRequestDispatcher("资源B路径").forward(req,resp);

请求转发特点

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

作用域对象

用于 Servlet 之间数据共享的服务器内存区域,作用域结构是一个 Map<String, Object>

三个作用域

在 Servlet 中一共有三个作用域:请求域、会话域、上下文域

请求域范围

只在同一次请求中起作用

作用域方法

request域有关的方法 作用
Object getAttribute("键") 从请求域中通过键获取值
void setAttribute("键",Object 数据) 向请求域中添加键和值,如果键不存在就是添加,如果存在就是修改
void removeAttribute("键") 通过键删除键和值

image-20230504151355224

Response

响应数据分为3部分:

响应行:HTTP/1.1 200 OK
void setStatus(int sc) :设置响应状态码

响应头:Content-Type: text/html
void setHeader(String name, String value) :设置响应头键值对

响应体:<html><head>head><body></body></html>
PrintWriter getWriter():获取字符输出流
ServletOutputStream getOutputStream():获取字节输出流

Response 完成重定向

image-20230504151941192

Response 响应字符数据

使用:

1.通过Response对象获取字符输出流

PrintWriter out = resp.getWriter();

2.写数据

out.write("数据");

注意

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

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(输入流,输出流);
posted @ 2023-05-16 21:15  YxinHaaa  阅读(1)  评论(0编辑  收藏  举报