文章目录
- 获取请求消息数据
- 1.获取请求行的数据
- 2.获取请求头的数据
- 3.获取请求体的数据
- 4.获取其它的数据
- 4.1.获取请求参数的通用方式
- 中文乱码问题
- 4.2.请求转发
- 4.3.共享数据
- 4.4.获取 ServletContext 对象
- 继承与实现体系
浏览器访问服务器时,会将用户提交的参数数据、协议版本、请求头信息封装成请求报文(即请求数据包)发送给服务端。
服务器(例如Tomcat)收到请求报文会封装到 Request 对象中。程序员可以通过 Request 对象获取请求消息数据。
获取请求消息数据
1.获取请求行的数据
GET /web-demo-03/demo01?name=zhangsan HTTP/1.1
方法:
1.1.获取请求方式:GET
String getMethod()
1.2.获取虚拟目录:/web-demo-03
String getContextPath()
1.3.获取Servlet路径:/demo01
String getServletPath()
1.4.获取请求URI:/web-demo-03/demo01
URI 统一资源标识符
String getRequestURI()
1.5.获取GET方式的请求参数:name=zhangsan
String getQueryString()
1.6.获取请求URL:http://localhost:8080/web-demo-03/demo01
URL 统一资源定位符
String getRequestURL()
1.7.获取协议及版本:http/1.1
String getProtocol()
1.8.获取客户机的IP地址
String getRemoteAddr()
2.获取请求头的数据
请求头名称不区分大小写。
方法:
String getHeader(String name)
通过请求头的名称获取请求头的值
Enumeration<String> getHeaderNames()
获取所有的请求头名称。Enumeration 类似迭代器
示例代码:
package priv.lwx.javaex.web_demo_03.web.servlet;/*** 获取referer,防止盗链** @author liaowenxiong* @date 2021/12/29 11:21*/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.IOException;@WebServlet(value = "/demo06")
public class ServletDemo06 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// 获取refererString referer = request.getHeader("referer");System.out.println(referer);// 防止盗链if (referer != null) {if (referer.contains("/web-demo-03")) {// 应用内正常访问System.out.println("播放电影");} else {// 应用外访问System.out.println("想看电影吗?来优酷吧!");}}}
}
3.获取请求体的数据
只有 post 请求方式才有请求体,在请求体中封装了 post 请求的请求参数。
步骤:
3.1.获取流对象
BufferedReader getReader():获取字符输入流,只能操作字符数据
ServletInputStream getInputStream():获取字节输入流,可以操作所有类型的数据(主要用于文件上传、视频上传等场景)
3.2.从流对象中取数据
示例代码:
package priv.lwx.javaex.web_demo_03.web.servlet.request;/*** 获取请求体的数据** @author liaowenxiong* @date 2021/12/29 11:21*/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;@WebServlet(value = "/request-demo05")
public class RequestDemo05 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// 获取请求消息体的数据// 1.获取字符流BufferedReader reader = request.getReader();// 2.读取数据String line = null;while ((line = reader.readLine()) != null) {System.out.println(line);}}
}
4.获取其它的数据
4.1.获取请求参数的通用方式
不论 get 还是 post 方式,都可以使用下面的方法获取请求参数。
方法:
String getParameter(String name)
:根据参数名称获取参数的值。要注意的问题: 如果 name 与实际的请求参数名不一致,则返回 null。
如果前端页面并没有输入参数值,则返回空字符串 ""
。
String[] getParameterValues(String name)
:根据参数名称获取参数值的数组。例如:hobby=ds&hobby=ps
Enumeration<String> getParameterNames()
:获取所有请求参数的名称
Enumeration<String> parameterNames = req.getParameterNames();
// 迭代遍历Enumeration对象
while (parameterNames.hasMoreElements()) {String s = parameterNames.nextElement();System.out.println(s);
}
Map<String,String[]> getParameterMap()
:获取所有请求参数的 Map 集合。
中文乱码问题
tomcat 8 已经将 get 请求方式的中文乱码问题解决了,但是 post 请求方式会出现中文乱码问题。
解决办法:
获取参数前,设置解码的字符编码为 utf-8,代码如下:
request.setCharacterEncoding("utf-8");
这个字符编码要和前端页面的字符编码保持一致。
4.2.请求转发
请求转发:一种在服务器内部的资源跳转方式
步骤:
4.2.1.通过 request 对象获取请求转发器对象:RequestDispatcher getRequestDispatcher(String path)
,path 是转发目标的资源路径
4.2.2.使用 RequestDispatcher 对象来进行转发:requestDispatcher.forward(ServletRequest request, ServletResponse response)
特点:
4.2.3.浏览器地址栏的访问路径没有变化
4.2.4.只能转发到当前服务器内部的资源
4.2.5.转发只是一次请求
4.3.共享数据
域对象:一个有作用范围的对象,可以在范围内共享数据
Request 域对象:代表一次请求的范围,一般用于请求转发的多个资源中共享数据
方法:
void setAttribute(String name,Object obj):存储数据
Object getAttribute(String name):获取数据;通过属性名获取属性值
void removeAttribute(String name):删除数据;通过属性名删除对应的数据;通过键移除对应的键值对
4.4.获取 ServletContext 对象
ServletContext getServletContext()
继承与实现体系
HttpServletRequest 接口继承自 ServletRequest 接口
org.apache.catalina.connector.RequestFacade(tomcat 实现的类型),实现 HttpServletRequest 接口