详解请求消息 resquest
1.1 简介
1.1.1 概述
Request 对象,又称为请求对象,该对象派生自 HTTPResponse 类,是 ASP 中重要的服务器内置对象,它连接着 Web 服务器和 Web 客户端程序。Request 对象是从客户端向服务器发出请求,包括用户提交的信息以及客户端的一些信息。客户端可通过 HTML 表单或在网页地址后面提供参数的方法提交数据,然后服务器通过 Request 对象的相关方法来获取这些数据。Request 的各种方法主要用来处理客户端浏览器提交的请求中的各项参数和选项。
1.1.2 流程
Tomcat 服务器会根据请求 URL 中的资源路径,创建对应的 ServletImpl 的对象。然后会创建 Request 对象,Request 对象中封装请求信息数据。最后将 Request 对象传递给 service 方法,并且调用 service方法。(Tomcat 利用反射创建对象并且调用 service 方法)
1.2 request 的使用
Tomcat 为了屏蔽内部 catalina 容器的相关方法,使用户免受非 servlet 标准方法的干扰对 servlet 进行了包装,我们使用的 servlet 其实是 org.apache.catalina.connector.RequestFacade
,它实现了 javax.servlet.http.HttpServletRequest
接口,而 HttpServletRequest 继承了 javax.servlet.ServletRequest
。我们创建 Servlet 通常是继承 HttpServlet,所以我们一般操作 HttpServletRequest
1.2.1 方法
☞ ServletRequest
方法 |
描述 |
---|---|
Object getAttribute(String name) |
将命名属性的值作为 Object 返回;如果不存在给定名称的属性,则返回 null |
String getCharacterEncoding() |
返回此请求中使用的字符编码 |
String getContentType() |
返回请求正文的 MIME 类型;如果类型未知,则返回 null |
ServletInputStream getInputStream() |
获取字节输入流 |
String getLocalAddr() |
获取服务器的 ip 地址 |
String getLocalName() |
获取服务器的主机名 |
int getLocalPort() |
获取服务器的端口号 |
String getParameter(String name) |
以字符串形式返回请求参数的值,如果参数不存在,则返回 null |
Map<String,String[]> getParameterMap() |
将请求参数封入 Map 中返回 |
String[] getParameterValues(String name) |
根据参数名称获取参数值的数组 |
String getProtocol() |
获取协议和版本 |
BufferedReader getReader() |
获取字符输入流 |
String getRemoteAddr() |
返回发送请求的客户端或最后一个代理的 Internet 协议 IP 地址 |
String getRemoteHost() |
返回客户端或发送请求的最后一个代理的名称 |
int getRemotePort() |
返回发送请求的客户端或最后一个代理的 Internet 协议 IP 源端口 |
ServletContext getServletContext() |
获取 servlet 上下文对象 |
void removeAttribute(String name) |
从此请求中删除属性 |
void setAttribute(String name, Object o) |
设置此请求中的属性 |
void setCharacterEncoding(String env) |
设置此请求中的编码 |
RequestDispatcher getRequestDispatcher(String path) |
获取请求转发器对象 |
☞ HttpServletRequest
方法 |
描述 |
---|---|
String getContextPath( ) |
获取虚拟目录,示例:/demo |
Cookie[ ] getCookies( ) |
返回一个数组,其中包含客户端与此请求一起发送的所有 Cookie 对象 |
String getHeader(String name) |
以字符串形式返回指定请求头的值 |
String getMethod( ) |
返回发出此请求的 HTTP 方法的名称,例如:GET,POST 或 PUT |
String getQueryString( ) |
返回路径后面的请求 URL 中包含的查询字符串。即 ? 后的一串 |
String getRequestURI( ) |
获取请求地址 ,例如: /demo/servlet |
StringBuffer getRequestURL() |
带有协议的地址,例如:http://localhost/demo/servlet |
String getServletPath() |
获取Servlet路径,例如: /servlet |
HttpSession getSession() |
获取 session |
1.2.2 请求转发
当一个请求抵达时,接收请求的 servlet 无法处理该请求将其转发给另一个 servlet 处理,这个过程请求方是不知道的。就好比,老张打电话向老王借 ¥500,老王没有,就向领座老李借了 ¥500,然后转账给老张了。
☞ 转发步骤 ① 通过request对象获取请求转发器对象 ② 使用 RequestDispatcher 对象的 forward(ServletRequest request, ServletResponse response) 方法转发。
☞ 特点 ① 浏览器地址栏路径不发生变化 ② 只能转发到当前服务器内部资源中。 ③ 转发是一次请求
☞ 示例
public void service(ServletRequest request, ServletResponse response) throws Exception {
request.getRequestDispatcher("/BBBservlet").forward(request, response);
}
☞ 执行流程
1.2.3 request 域
域对象是指一个有作用范围的对象,可以在范围内共享数据。request 域是指代表一次请求的范围,一般用于请求转发的多个资源中共享数据。使用下列方法共享数据
void setAttribute(String name,Object obj)
:存储数据
Object getAttitude(String name)
:通过键获取值
void removeAttribute(String name)
:通过键移除键值对
请求转发正是通过 request 域来共享数据的。
☞ 示例
@WebServlet("loginServlet")
public class LoginServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws Exception {
// 解决乱码
request.setCharacterEncoding("utf-8");
//获取请求参数
String userName = request.getParameter("username");
String password = request.getParameter("password");
User user = new User(userName, password);
// 往 request 域对象存储数据
request.setAttribute("USER", user);
// 转发
request.getRequestDispatcher("/userServlet").forward(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws Exception {
doGet(request, response);
}
}
@WebServlet("/userServlet")
public class UserServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws Exception {
// 从域对象对象中取出数据
User user = (User) request.getAttribute("USER");
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws Exception {
doGet(request, response);
}
}
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 基于 HTTP Header 传输签名参数
- 【原创】Java并发编程系列32 | 阻塞队列(下)
- 深入理解swap交换分区理解及扩存
- client-go 之 Reflector 源码分析
- Vue.js点击按钮弹出隐藏菜单的几种方式
- 【Vue.js】Vue.js组件库Element中的单选框、多选框、输入框和计数器
- 【Vue.js】Vue.js组件库Element的基础用法
- 常见的图像处理技术
- docker浅入深出续
- 【21期】你能说说Java中Comparable和Comparator的区别吗
- 昨天晚上熬夜整理的Java注解相关学习笔记
- 对图标的坐标轴进行调整
- Vue 开发技巧总结
- 35.opengl PBR-光照
- 聊聊claudb的list command