JavaWeb-request详解
程序员文章站
2022-06-11 15:39:10
...
首先上图
在对继承关系有了一个概念之后,我们进入正题:
response是由服务器创建的,根据http协议封装请求消息的对象,我们通过它获取请求消息,让我们具体看一下这个对象输出的信息
我们发现打印的对象信息并不在servlet api中,而是tomcat内部实现,我们打开与之对应的tomcat的java包
可以发现HttpServletRequest并没有实现类,而是tomcat提供了实现HttpServletRequest的类,并创建了request对象
Request工作流程
在了解了request对象具体创建过程后,我们可以进一步探究它的工作流程
Request请求数据
如果不理解请求消息数据格式,请参考下图
请求消息数据格式(对应图片):
- 请求行:请求方式 请求url HTTP协议版本
- 请求头:请求头名称 : 请求头值
- 请求空行:空行
- 请求体(正文):Get方式没有请求体,封装post方式请求消息的请求参数
这里介绍两种请求方式
方式 | 区别 |
---|---|
GET | 请求参数在请求行中,url长度有限,不太安全 |
POST | 请求参数在请求体,url长度没有限定,相对安全 |
接下来就可以按照下列的方法使用request对象
1.获取请求行数据
Get /TestRequest/Demo01?name=zhangsan HTTP/1.1
对应这个请求行
--获取请求方式:String getMethod()//GET
--*获取虚拟路径:String getContextPath(); /TestRequest
-- 获取servlet路径:String getServletPath ; /Demo01
--获取get方式请求参数:String getQueryString(); name=zhangsan
--*获取请求URI:String getRequestURI(); /TestRequest/Demo01
String getContextPath() ---web应用的名称
--*获取请求URL:String getRequestURL(); http://localhost/TestRequest/Demo01
--获取协议及版本:String getProtocol() HTTP/1.1
--获取客户机的IP地址:String getRemoteAddr()
2.获取请求头数据
- 通过请求头的名称获取请求头的值:String getHeader(String name)
- 获取所有请求头的名称:Enumeration<> getHeaderNames()
3.获取请求体数据
- 只有POST方式才有请求体,在请求体中封装了POST请求参数
4.根据参数名称获取参数值
- String getParamater(String name)
- String[] getParameterValues(String name)根据名称获取参数列表
5.请求转发(一种在服务器内部资源跳转的方式)
- 步骤:
- 使用request对象获取请求转发器对象
RequestDispatcher getRequestDispatcher(String path)
- 使用RequestDispatcher 对象进行转发
forward(ServletRequest request,ServletResponse response)
例:
- 使用request对象获取请求转发器对象
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
RequestDispatcher requestDispatcher = req.getRequestDispatcher("/Demo02");
requestDispatcher.forward(req,resp);
}
- 特点:
- 浏览器地址没有发生变化
- 只能转发到当前服务器内部资源中,如果内部资源不存在,404
- 内部多个资源访问的是同一次请求
6.共享数据
- request域:代表一次请求,一般用于请求转发的多个资源*享数据
- 方法
- 1.void setAttribute(String name,Object obj);存储数据
- 2.Object getAttribute(String name);通过键获取值
- 3.void removeAttribute(String name);通过键一出键值对
7.获取ServletContext
方法:ServletContext getServletContext()