- 获取请求消息数据
- 1.获取请求行的数据
- 2.获取请求头的数据
- 3.获取请求体的数据
- 4.获取其它的数据
- 4.1.获取请求参数的通用方式
- 中文乱码问题
- 4.2.请求转发
- 4.3.共享数据
- 4.4.获取 ServletContext 对象
- 继承与实现体系
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 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 {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 获取referer
String 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 {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
@Override
protected 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 getParameterNames()
:获取所有请求参数的名称
Enumeration parameterNames = req.getParameterNames();
// 迭代遍历Enumeration对象
while (parameterNames.hasMoreElements()) {
String s = parameterNames.nextElement();
System.out.println(s);
}
Map 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 接口